Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Ruby EventMachine  programare bazata pe evenimente              Florin Oltean                 Cluj.rb               2012-1...
Despre mine• zencash.com • partea de sincronizare cu servicii externe• Ruby, Objective-C, C• parapanta
Cuprins• Ruby EventMachine (EM) • ce problema rezolva • cum il folosim • avantaje, dezavantaje• cum ne ajuta EM in ZenCash...
Ce problema rezolva        EM?• aplicatii care asteapta mult dupa Input/  Output (I/O bound) si care trebuie sa fie  scalab...
timpserial:concurent:
Cum putem scala        aplicatii I/O bound•   mai multe procese    •   folosesc multa memorie•   thread-uri    •   mai put...
EM implementeaza    Reactor Pattern• in alte limbaje • Node.js - JavaScript • Twisted - Python
Reactorul• single threaded while loop• codul nostru reactioneaza la evenimente
Ruby VM support• Ruby 1.8• Ruby 1.9    reactor C++• Rubinius• JRuby
Cum il folosim• gem install eventmachine• require eventmachine
Scierea de cod asincron• sincron• asincron / event based
Ruby blocks sunt folositediferit decat suntem obisnuiti• ruby obisnuit• EM
EM loopoutput
Oprirea EM loop
Nested blocks
Putem folosi proc-uri sau clase pentru a evita deep nesting
Important: niciodata sa nu blocam reactorul• daca handler-ul nostru tine prea mult, alte  evenimente nu pot fi declansate
timp    Functionare normala1234    Reactor blocat1234          Operatie care tine reactorul blocat
E usor sa blockezireactorul fara sa iti dai• folosesti o librarie sincrona• operatii care dureaza mult• in Node.js e putin...
Pentru a nu bloca         reactorul• fara sleep(2)• fara I/O sincron (mysql query)• fara cicluri lungi (100_000.times)• fa...
• Pentru operatii care tin mai mult • EM.next_tick • EM.defer
EM.next_tick example      vsapparent recursivity
Testare• mai dificila• codul trebuie sa ruleze intr-un event loop
Metode de testare• business logic in clase care se pot testa  separat  • unit tests
SincronEM cu timer
• integration testing - din exterior • folosesti aplicatia si verifici rezultatele
Dezavantaje• cod mai greu de urmarit• mai greu de debug • se pierde stacktrace• mai mult de lucru pentru error handling• m...
Merita sa folosesti EM?• Depinde de problema • chiar ai nevoie de scalabilitate? • poti folosi mai multe procese? • rescri...
EM in ZenCash• Integrare cu 8 aplicatii de facturare • import Invoices, Payments, Customers• Sincronizare o data pe ora
Arhitectura• 2 applicatii • ZenCash main app • Sync app   • stie sa comunice cu API-ul celor 8      servicii   • normalize...
Sync app• vrem high throughput• nu vrem sa abuzam de API (nu vrem sa fim  banned) • folosim cozi • setam numarul maxim de r...
Arhitectura SyncApp• Rescue (delayed jobs)• RabbitMQ (AMQP)• Fetcher (EventMachine)
• Sync requests se pun in AMQP• Fetcher • scoate sync request din coada • fetch from url • pune raspuns intr-o coada Resqu...
Ordin de marime• 10 servicii X 10 request-uri • => 100 request-uri in paralel• 100 Resque workers <=> one Fetcher
Concluzii• EM este util pentru aplicatii care asteapta  mult dupa I/O• bun pentru aplicatii care necesita  scalabilitate• ...
Referinte•   https://github.com/eventmachine/eventmachine•   Aman Gupta: EventMachine talk at Mountain West    Ruby Conf 2...
Upcoming SlideShare
Loading in …5
×

Ruby EventMachine

731 views

Published on

Ruby EventMachine presentation at Cluj.rb

Published in: Technology
  • Be the first to comment

Ruby EventMachine

  1. 1. Ruby EventMachine programare bazata pe evenimente Florin Oltean Cluj.rb 2012-10-11
  2. 2. Despre mine• zencash.com • partea de sincronizare cu servicii externe• Ruby, Objective-C, C• parapanta
  3. 3. Cuprins• Ruby EventMachine (EM) • ce problema rezolva • cum il folosim • avantaje, dezavantaje• cum ne ajuta EM in ZenCash pentru a importa date din alte aplicatii
  4. 4. Ce problema rezolva EM?• aplicatii care asteapta mult dupa Input/ Output (I/O bound) si care trebuie sa fie scalabile• Exemple: • aplicatii web care doar scot date din baza de date si le prezinta user-ului • crawler
  5. 5. timpserial:concurent:
  6. 6. Cum putem scala aplicatii I/O bound• mai multe procese • folosesc multa memorie• thread-uri • mai putina memorie • problemele obisnuite asociate cu threaduri• reactor pattern
  7. 7. EM implementeaza Reactor Pattern• in alte limbaje • Node.js - JavaScript • Twisted - Python
  8. 8. Reactorul• single threaded while loop• codul nostru reactioneaza la evenimente
  9. 9. Ruby VM support• Ruby 1.8• Ruby 1.9 reactor C++• Rubinius• JRuby
  10. 10. Cum il folosim• gem install eventmachine• require eventmachine
  11. 11. Scierea de cod asincron• sincron• asincron / event based
  12. 12. Ruby blocks sunt folositediferit decat suntem obisnuiti• ruby obisnuit• EM
  13. 13. EM loopoutput
  14. 14. Oprirea EM loop
  15. 15. Nested blocks
  16. 16. Putem folosi proc-uri sau clase pentru a evita deep nesting
  17. 17. Important: niciodata sa nu blocam reactorul• daca handler-ul nostru tine prea mult, alte evenimente nu pot fi declansate
  18. 18. timp Functionare normala1234 Reactor blocat1234 Operatie care tine reactorul blocat
  19. 19. E usor sa blockezireactorul fara sa iti dai• folosesti o librarie sincrona• operatii care dureaza mult• in Node.js e putin mai bine pentru ca nu ai • sleep • librarii sincrone
  20. 20. Pentru a nu bloca reactorul• fara sleep(2)• fara I/O sincron (mysql query)• fara cicluri lungi (100_000.times)• fara polling (while !condition)
  21. 21. • Pentru operatii care tin mai mult • EM.next_tick • EM.defer
  22. 22. EM.next_tick example vsapparent recursivity
  23. 23. Testare• mai dificila• codul trebuie sa ruleze intr-un event loop
  24. 24. Metode de testare• business logic in clase care se pot testa separat • unit tests
  25. 25. SincronEM cu timer
  26. 26. • integration testing - din exterior • folosesti aplicatia si verifici rezultatele
  27. 27. Dezavantaje• cod mai greu de urmarit• mai greu de debug • se pierde stacktrace• mai mult de lucru pentru error handling• mai greu de testat
  28. 28. Merita sa folosesti EM?• Depinde de problema • chiar ai nevoie de scalabilitate? • poti folosi mai multe procese? • rescrie codul ca sa fie asincron
  29. 29. EM in ZenCash• Integrare cu 8 aplicatii de facturare • import Invoices, Payments, Customers• Sincronizare o data pe ora
  30. 30. Arhitectura• 2 applicatii • ZenCash main app • Sync app • stie sa comunice cu API-ul celor 8 servicii • normalizeaza datele
  31. 31. Sync app• vrem high throughput• nu vrem sa abuzam de API (nu vrem sa fim banned) • folosim cozi • setam numarul maxim de requesturi in paralel catre fiecare serviciu
  32. 32. Arhitectura SyncApp• Rescue (delayed jobs)• RabbitMQ (AMQP)• Fetcher (EventMachine)
  33. 33. • Sync requests se pun in AMQP• Fetcher • scoate sync request din coada • fetch from url • pune raspuns intr-o coada Resque • acknowledge sync request
  34. 34. Ordin de marime• 10 servicii X 10 request-uri • => 100 request-uri in paralel• 100 Resque workers <=> one Fetcher
  35. 35. Concluzii• EM este util pentru aplicatii care asteapta mult dupa I/O• bun pentru aplicatii care necesita scalabilitate• cod putin mai greu de scris, citit si intretinut
  36. 36. Referinte• https://github.com/eventmachine/eventmachine• Aman Gupta: EventMachine talk at Mountain West Ruby Conf 2010

×