際際滷

際際滷Share a Scribd company logo
Ruby EventMachine
  programare bazata pe evenimente



              Florin Oltean
                 Cluj.rb
               2012-10-11
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 pentru a
  importa date din alte aplicatii
Ce problema rezolva
        EM?
 aplicatii care asteapta mult dupa Input/
  Output (I/O bound) si care trebuie sa 鍖e
  scalabile
 Exemple:
  aplicatii web care doar scot date din baza
    de date si le prezinta user-ului
   crawler
timp

serial:




concurent:
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
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 folosite
diferit decat suntem obisnuiti

 ruby obisnuit


 EM
EM loop



output
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 鍖 declansate
timp

    Functionare normala
1
2
3
4




    Reactor blocat
1
2
3
4


          Operatie care tine reactorul blocat
E usor sa blockezi
reactorul 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
Pentru a nu bloca
         reactorul
 fara sleep(2)
 fara I/O sincron (mysql query)
 fara cicluri lungi (100_000.times)
 fara polling (while !condition)
 Pentru operatii care tin mai mult
  EM.next_tick
  EM.defer
EM.next_tick example

      vs




apparent recursivity
Testare


 mai di鍖cila
 codul trebuie sa ruleze intr-un event loop
Metode de testare


 business logic in clase care se pot testa
  separat
   unit tests
Sincron




EM cu timer
 integration testing - din exterior
  folosesti aplicatia si veri鍖ci rezultatele
Dezavantaje

 cod mai greu de urmarit
 mai greu de debug
  se pierde stacktrace
 mai mult de lucru pentru error handling
 mai greu de testat
Merita sa folosesti EM?

 Depinde de problema
  chiar ai nevoie de scalabilitate?
  poti folosi mai multe procese?
  rescrie codul ca sa 鍖e asincron
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
    normalizeaza datele
Sync app
 vrem high throughput
 nu vrem sa abuzam de API (nu vrem sa 鍖m
  banned)
  folosim cozi
  setam numarul maxim de requesturi in
    paralel catre 鍖ecare serviciu
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 Resque
  acknowledge sync request
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
 cod putin mai greu de scris, citit si
  intretinut
Referinte


   https://github.com/eventmachine/eventmachine

   Aman Gupta: EventMachine talk at Mountain West
    Ruby Conf 2010
Ad

Recommended

Google Web Toolkit
Google Web Toolkit
alex.albu
Sysops cu Chef
Sysops cu Chef
Istvan Hoka
Redis si Resque
Redis si Resque
Florin Oltean
Asp.net mvc bad practices
Asp.net mvc bad practices
Radu Vunvulea
Arhitectura HotNews.ro
Arhitectura HotNews.ro
Marius Hanganu
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Codecamp Romania
Introducere in symfony2
Introducere in symfony2
Roman Claudiu
Windows Azure AppFabric - Service Bus, Caching
Windows Azure AppFabric - Service Bus, Caching
Mihai Dan Nadas
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
constantadevelopers
Instalare si administrare site grid
Instalare si administrare site grid
alexstanciu
Rad gs cas programatica2012
Rad gs cas programatica2012
Agora Group
Content Management - Alexandru Lapusan
Content Management - Alexandru Lapusan
IDG Romania
Curs c#
Curs c#
liviuuba
Prezentare Distinct Nbb Cluster V1
Prezentare Distinct Nbb Cluster V1
Adrian Dragomir
Webappdev
Webappdev
George Alexandru Vlad
vmchecker @SCS
vmchecker @SCS
Rzvan Deaconescu
Programatica codepax-16-11-2012
Programatica codepax-16-11-2012
Agora Group

More Related Content

Similar to Ruby EventMachine (9)

Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
constantadevelopers
Instalare si administrare site grid
Instalare si administrare site grid
alexstanciu
Rad gs cas programatica2012
Rad gs cas programatica2012
Agora Group
Content Management - Alexandru Lapusan
Content Management - Alexandru Lapusan
IDG Romania
Curs c#
Curs c#
liviuuba
Prezentare Distinct Nbb Cluster V1
Prezentare Distinct Nbb Cluster V1
Adrian Dragomir
Webappdev
Webappdev
George Alexandru Vlad
vmchecker @SCS
vmchecker @SCS
Rzvan Deaconescu
Programatica codepax-16-11-2012
Programatica codepax-16-11-2012
Agora Group
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
constantadevelopers
Instalare si administrare site grid
Instalare si administrare site grid
alexstanciu
Rad gs cas programatica2012
Rad gs cas programatica2012
Agora Group
Content Management - Alexandru Lapusan
Content Management - Alexandru Lapusan
IDG Romania
Curs c#
Curs c#
liviuuba
Prezentare Distinct Nbb Cluster V1
Prezentare Distinct Nbb Cluster V1
Adrian Dragomir
Programatica codepax-16-11-2012
Programatica codepax-16-11-2012
Agora Group

Ruby EventMachine

  • 1. Ruby EventMachine programare bazata pe evenimente Florin Oltean Cluj.rb 2012-10-11
  • 2. Despre mine zencash.com partea de sincronizare cu servicii externe Ruby, Objective-C, C parapanta
  • 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. Ce problema rezolva EM? aplicatii care asteapta mult dupa Input/ Output (I/O bound) si care trebuie sa 鍖e scalabile Exemple: aplicatii web care doar scot date din baza de date si le prezinta user-ului crawler
  • 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. EM implementeaza Reactor Pattern in alte limbaje Node.js - JavaScript Twisted - Python
  • 8. Reactorul single threaded while loop codul nostru reactioneaza la evenimente
  • 9. Ruby VM support Ruby 1.8 Ruby 1.9 reactor C++ Rubinius JRuby
  • 10. Cum il folosim gem install eventmachine require 'eventmachine'
  • 11. Scierea de cod asincron sincron asincron / event based
  • 12. Ruby blocks sunt folosite diferit decat suntem obisnuiti ruby obisnuit EM
  • 16. Putem folosi proc-uri sau clase pentru a evita deep nesting
  • 17. Important: niciodata sa nu blocam reactorul daca handler-ul nostru tine prea mult, alte evenimente nu pot 鍖 declansate
  • 18. timp Functionare normala 1 2 3 4 Reactor blocat 1 2 3 4 Operatie care tine reactorul blocat
  • 19. E usor sa blockezi reactorul 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. 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. Pentru operatii care tin mai mult EM.next_tick EM.defer
  • 22. EM.next_tick example vs apparent recursivity
  • 23. Testare mai di鍖cila codul trebuie sa ruleze intr-un event loop
  • 24. Metode de testare business logic in clase care se pot testa separat unit tests
  • 26. integration testing - din exterior folosesti aplicatia si veri鍖ci rezultatele
  • 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. Merita sa folosesti EM? Depinde de problema chiar ai nevoie de scalabilitate? poti folosi mai multe procese? rescrie codul ca sa 鍖e asincron
  • 29. EM in ZenCash Integrare cu 8 aplicatii de facturare import Invoices, Payments, Customers Sincronizare o data pe ora
  • 30. Arhitectura 2 applicatii ZenCash main app Sync app stie sa comunice cu API-ul celor 8 servicii normalizeaza datele
  • 31. Sync app vrem high throughput nu vrem sa abuzam de API (nu vrem sa 鍖m banned) folosim cozi setam numarul maxim de requesturi in paralel catre 鍖ecare serviciu
  • 32. Arhitectura SyncApp Rescue (delayed jobs) RabbitMQ (AMQP) Fetcher (EventMachine)
  • 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. Ordin de marime 10 servicii X 10 request-uri => 100 request-uri in paralel 100 Resque workers <=> one Fetcher
  • 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. Referinte https://github.com/eventmachine/eventmachine Aman Gupta: EventMachine talk at Mountain West Ruby Conf 2010

Editor's Notes