Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Towards ruote 2.0 (2009)

Towards ruote 2.0 (2009)

An old deck about ruote, still interesting

John Mettraux

October 09, 2009
Tweet

More Decks by John Mettraux

Other Decks in Technology

Transcript

  1. ‣ recap : ruote ‣ is a ruby workflow engine

    ‣ ruby makes it easy to tinker and try ‣ workflows should be easy to tinker and try ‣ with some discipline, you might even end up doing BPM with it
  2. ‣ ruote engine : historically ‣ middleware/backend-ish ‣ not for

    your big front web 2.0 app ‣ cheap workflow engine ‣ 1 engine per business unit
  3. ‣ ruote engine : core requirements ‣ has to run

    multiple processes ‣ with multiple branches ‣ and/or subprocesses ‣ can be stopped / restarted (if running with persistent storage) ‣ can run multiple versions of any process ‣ has to allow in-flight modifications to processes
  4. ‣ ruote 2.0 engine ‣ multi ruby process resilient :(

    ‣ complete rewrite with a cleaner interface
  5. ‣ multi-process ‣ the average user wants to put ruote

    in his rails app ‣ the rails app is in a ‘multi-process’ ruby web server ‣ ruote 0.9 is in trouble...
  6. ‣ multi-process resilience ‣ ruote 2.0 knows it could run

    in a multi-process env ‣ it has defense mechanisms things like ‘tickets’ and ‘locks’ ‣ they have a cost :-( ‣ suggestions ‣ avoid mp envs for ruote (the engine is idle most of the time) ‣ run ruote as a webservice in a 1p env ‣ (ruote in 1p can use “caching” and be faster)
  7. ‣ our favourite env these days ‣ ruote-{kit|http} workflow as

    an http service ‣ ruote-amqp ‣ remote participants as amqp (daemons) http://github.com/kennethkalmer/daemon-kit ‣ load on ruote itself is low
  8. ‣ anyway... ‣ 1 engine that scale for everything ?

    ‣ why not 1 engine per domain / unit ? ‣ why not a separation between tactical and technical engines ? ‣ why not engines that talk to each other ? ‣ scale the business or scale the tools ?
  9. ‣ engine workqueue ‣ where each operation is performed ‣

    only 1 op at a time ‣ by default, uses Thread/Queue ‣ uses EventMachine if present ‣ future work : ‣ fibers ? ‣ it’s an implementation away ‣ anyway, engine is idle most of the time (usually waiting for those slow humans)
  10. ‣ AST is JSON friendly ‣ attributes common to all

    expressions ‣ :if / :unless ‣ :timeout, :on_timeout ‣ :on_cancel / :on_error ‣ :forget ‣ directed commands ‣ break :ref => ‘tag’ ‣ jump :to => ‘tag’ ‣ concurrent_iterator enhancements ‣ subprocesses and apply ‣ ...
  11. ‣ :on_error ‣ much like begin / rescue... ‣ occurs

    when error is triggered ‣ error is thus not logged in error_journal
  12. ‣ :on_cancel ‣ subprocess or participant triggered when expression gets

    cancelled ‣ unlike :on_error trigger happens when cancel is complete
  13. ‣ cursor / jump ‣ can now jump to a

    tag, a participant name or a subprocess name ‣ almost that ‘cursors as state machines’ feeling ‣ works with repeat (loop) as well
  14. ‣ directed commands ‣ cursor/repeat has jump/rewind/break/... commands ‣ until

    now these commands were only meant for the enclosing cursor/ repeat ‣ now with :tag and :ref, more precision is possible ‣ works with the iterator expression as well
  15. ‣ ruote 0.9.x had the ‘eval’ expression ‣ evaluating segments

    of process ‣ ruote 2.0 has ‘apply’ ‣ same mission ‣ and more (yield)
  16. ‣ engine variables ‣ can be read from processes ‣

    cannot be set from processes ‣ are thus on the same foot as participants (which are registered at the engine level)
  17. many thanks to everyone in the community especially to the

    “ruedas y cervezas” participants ;-)