Slide 1

Slide 1 text

There’s Javas in my rubies!

Slide 2

Slide 2 text

What is TorqueBox? A JVM-based, prepackaged server stack for JRuby Rack apps (Sinatra, Rails, ...): Web application server (JBoss), Messaging (HornetQ), Services (like Daemons), Scheduling (like Cron), designed for scalability & availability

Slide 3

Slide 3 text

Our problem (corner case): Oracle + Ruby = :-( Oracle + JDBC = :-)

Slide 4

Slide 4 text

More problems (typical): • Scalability • High availability • Complex server stack • Distribution of caching, sessions, etc. • Much easier to scale up than out

Slide 5

Slide 5 text

O HAI JVM • 1st Class JDBC drivers • Concurrency via real threads • Fast! • It’s real Ruby

Slide 6

Slide 6 text

What’s wrong with Ruby on JVM? • WAR files break continuous deployment and require server restarts • Increases server stack complexity • XML hell • Fewer people doing it = less support

Slide 7

Slide 7 text

Enter TorqueBox YAML config (the NoXML) Hot Redeploys (no restarts!) Streamlined server setup & monitoring Easy Deployment (cap deploy) Baked-in high-scalability & availability Great community & support (Red Hat)

Slide 8

Slide 8 text

Tech Stack

Slide 9

Slide 9 text

Tech Stack (simpler)

Slide 10

Slide 10 text

Tech Stack: JBoss AS Tech Stack: JBoss AS

Slide 11

Slide 11 text

Tech Stack: JBoss AS Multi-app friendly Load Balancing Clustering High Availability Rock solid

Slide 12

Slide 12 text

Tech Stack: JBoss AS Tech Stack: Infinispan

Slide 13

Slide 13 text

Tech Stack: Infinispan Cache Sessions Or use it as a DataMapper clustered NoSQL store

Slide 14

Slide 14 text

Tech Stack: HornetQ

Slide 15

Slide 15 text

Tech Stack: HornetQ Set up queues via YAML: messaging: /queues/puppies: MyHandler: concurrency: 5 config: some_key: some_value Or at runtime: @queue = TorqueBox::Messaging::Queue.new("/queue/foo") @queue.publish( “Oh, puppies!” )

Slide 16

Slide 16 text

Tech Stack: HornetQ Crazy fast Optionally durable Backgroundable: include TorqueBox::Backgroundable always_background :do_something_slowly

Slide 17

Slide 17 text

Tech Stack: Scheduled Jobs It’s not cron! Configure via YAML JGroups runs tasks on all nodes or as singleton # config/torquebox.yml jobs: monthly_reminder: description: sends reminders job: MyJob cron: ‘0 0 0 1 * ?’ singleton: true # app/jobs/my_job.rb class MyJob def run() # your code here end end

Slide 18

Slide 18 text

Tech Stack: Services Daemon-like Easy to monitor JGroups: All nodes, single-node, failover # app/services/my_service.rb class MyServer def initialize(opts) end def start end def stop end end

Slide 19

Slide 19 text

Tech Stack: Backstage

Slide 20

Slide 20 text

Tech Stack: Backstage Sinatra app for centralized monitoring Manage entire stack from one view

Slide 21

Slide 21 text

Oh my gosh so much more Capistrano support (or archive deploy, or web-based git deploy in StompBox) Meta-transactions (incl. ActiveRecord, queue, Infinispan) Client-side async with Stomplets RSpec helpers

Slide 22

Slide 22 text

Challenges Slow-ish boot time for dev Larger base memory footprint Ruby 1.9 is “edge” “The TorqueBox Way”: Bundled stack is largely what you get If using advanced features (like messaging), you need to develop against TorqueBox, not ‘rails s’

Slide 23

Slide 23 text

Performance (Spree Bmark)

Slide 24

Slide 24 text

Performance (Spree Bmark)