SlideShare a Scribd company logo
Redis si Resque
pentru applicatii Rails concurente




             Florin Oltean
                Cluj.rb
              2013-02-21
Despre mine

• Lucrez la ZenCash
 • sincronizare cu servicii externe
 • monitorizarea aplicatiei
Cuprins

• Redis
• Resque
• Cum folosim Redis si Resque in ZenCash
Redis si Resque
Redis

• key-value data store
• networked
• in-memory
• optional durability
• open-source (BSD license)
Calitati

• usor de folosit
• documentatie simpla si usor de inteles
• rapid (fiind in memorie)
Cum se foloseste

• redis-cli
• din Ruby:
 • Redis gem
Tipuri de date
• “Data structures server”
• Tipul de baza: String
• Structuri de date:
 • Lists
 • Hashes
 • Sets
 • Sorted sets
• comenzile sunt atomice
• ex:
 • incr, decr
 • lpush, lpop
 • setnx
DEMO
Expire


• putem sa setam un “expire” pe orice cheie
• e important ca acea cheie sa existe
DEMO
Publish-Subscribe


• subscribe la mai multe cozi
• publish => primesc toti cei subscribed
DEMO
Tranzactii

• toate instructiunile sunt executate in ordine
• nu se ruleaza instructiuni primite de la alti clienti
• atomicitate: totul sau nimic
DEMO
Namespaces

• Gem redis-namespace
DEMO
Pipelining
• la comunicare prin TCP, round-trip time
  mare comparat cu durata unei instructiuni
  • ~1ms prin loopback
  • ~100 ms prin Internet
• Solutie: sa folosim pipelining
• Pentru si mai multa viteza: comanda eval
  pentru a rula Lua scripts (doar din v2.6)
DEMO
Persistenta

• Fiind in memorie, toate datele se pierd daca
 • moare procesul
 • pana de curent (sau crapa sistemul de
    operare)
Persistenta

• Solutii:
 • RDB point-in-time snapshots
 • AOF (Append Only File)
Persistenta
• RDB point-in-time snapshots
 • util pentru backup
 • fork => fisier scris de procesul fiu
   • copy-on-write
 • poate bloca procesul pana la 1 secunda
 • cele mai recente date se pot pierde
Persistenta
• AOF (Append Only File)
 • foloseste write(2) si fsync(2)
 • fsync: no / every second / every query
 • fisier mai mare decat RDB
 • scade putin performanta
 • rescris automat cand creste prea mult
   • tot folosind fork
• Ar trebui folosite amandoua metodele
  pentru persistenta
 • RDB mai bun decat AOF pentru disaster
    recovery pentru ca este mai compact
Resque
Resque

• cozi de lucru
• inspirat de DelayedJob
• foloseste Redis
Structura Resque

• librarie Ruby
 • creare, interogare si procesare de joburi
• Rake task pentru pornirea de workeri
• aplicatie Sinatra pentru monitorizare
 • cozi, joburi, workeri, errori
Workeri

• pot rula pe masini diferite
• nu au probleme de memory bloat / "leaks"
 • arhitectura parent - child (fork)
Cozi

• sunt persistente
• complexitate O(1)
• push si pop atomic
• pot fi inspectate
• stocheaza joburile ca si packete JSON
De tinut cont
• sa avem grija la ce trimitem ca parametri
 • id in loc de obiect intreg
   • avantaj: obiect up-to-date
   • dezavantaj: poate inca nu se vad schimbarile
 • schimbare symbol in string (JSON)
   • [:a, :b] se transforma in ["a", "b"]
Interfata web

• informatii despre workeri
• cozile folosite
• continutul cozilor
• statistici (ex. numar de job-uri procesate)
• urmarirea erorilor
Resque
Redis si Resque
 in ZenCash
 in ZenCash
ZenCash
• Te ajuta sa fii platit mai repede
• Integrare cu 8 aplicatii de facturare
• import: Invoices, Payments, Customers
• Sincronizare:
 • o data pe ora
 • on-demand
• In ZenCash folosim Redis pentru
 • cozi de lucru (Resque)
 • stocare temporara
 • sincronizare procese
Resque
•   comunicare cu third-party API

    •   trimitere de email

    •   taxare clienti

•   joburi pentru

    •   monitorizare aplicatie

    •   generare statistici

    •   lansare sincronizare periodic

    •   procesare rezultate sincronizare
Stocare temporara
Sync Status

• Sincronizarea unei facturi
 • Invoice
 • Customer
 • parsare adresa (daca e nevoie)
DB-less SyncApp

• pentru un sync pot fi necesare mai multe
  request-uri (ex. paginare)
• se faceau serializari / deserializari in plus
• am renuntat la MySQL
Temporary file store
• scenariu:
 • un proces face download de PDF
 • alt proces face upload pe S3
• procesele trebuie sa fie pe aceeasi masina
  ca sa poata accesa fisierul de pe disc
• solutie: stocarea fisierului in Redis
Monitorizare aplicatie

• Salvarea periodica a unor parametri
• Bounded Queue:
 • coada cu dimensiune limitata
    implementata folosind Redis
Sincronizare procese

• Redis Lock
 • poate fi folosit pentru a ne asigura ca un
    singur proces executa o bucata de cod
    pentru o anumita resursa
  • ex: procesare rezultate sincronizare
• Exemplu folosire RedisLock
Rate limitation


• Unele servicii au API usage limits
• Tinem o evidenta a requesturilor facute
  pentru un anumit user in ultimul minut
Referinte



         http://redis.io

https://github.com/defunkt/resque
Contact



    @florin555

florin555@gmail.com
?

More Related Content

PDF
Programatica codepax-16-11-2012
PDF
Ioan Eugen Stan - James
PPT
Arhitectura HotNews.ro
KEY
Sysops cu Chef
KEY
Ruby EventMachine
PDF
PDF
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
PDF
Manual Spear
Programatica codepax-16-11-2012
Ioan Eugen Stan - James
Arhitectura HotNews.ro
Sysops cu Chef
Ruby EventMachine
Gabriel Voicu - De ce Ruby on Rails este o alegere buna in 2024 (2024.02.06, ...
Manual Spear

Similar to Redis si Resque (20)

PDF
Baze de date NoSQL
PDF
Computer Networks. Applications: terminal & e-mail
PDF
Razvan Deaconescu - Redmine
ODP
Realizarea unui cloud privat cu tehnologii open-source
PDF
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
PDF
De ce sa nu folosim Ruby On Rails?
PDF
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
ODP
Gearman presentation yopeso
PDF
Cu codul în "nori"
PPT
Web Applications - Security and Scalability Checklist - DefCamp 2012
PPT
Programare Web - De la CGI la servere de aplicatii
PDF
Computer Networks. Retrospective & perspective
PDF
Web 2016 (11/13) Servicii Web. Paradigma REST
PDF
Prezentare defcamp 2012 Bogdan Belu
PDF
Computer Networks. P2P
PPTX
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
PDF
Computer Networks. Internet programming basics
PDF
Axiologic quark
DOCX
Music Finder
PDF
Web 2020 09/12: Servicii Web. Paradigma REST
Baze de date NoSQL
Computer Networks. Applications: terminal & e-mail
Razvan Deaconescu - Redmine
Realizarea unui cloud privat cu tehnologii open-source
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
De ce sa nu folosim Ruby On Rails?
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Gearman presentation yopeso
Cu codul în "nori"
Web Applications - Security and Scalability Checklist - DefCamp 2012
Programare Web - De la CGI la servere de aplicatii
Computer Networks. Retrospective & perspective
Web 2016 (11/13) Servicii Web. Paradigma REST
Prezentare defcamp 2012 Bogdan Belu
Computer Networks. P2P
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
Computer Networks. Internet programming basics
Axiologic quark
Music Finder
Web 2020 09/12: Servicii Web. Paradigma REST
Ad

Redis si Resque

  • 1. Redis si Resque pentru applicatii Rails concurente Florin Oltean Cluj.rb 2013-02-21
  • 2. Despre mine • Lucrez la ZenCash • sincronizare cu servicii externe • monitorizarea aplicatiei
  • 3. Cuprins • Redis • Resque • Cum folosim Redis si Resque in ZenCash
  • 5. Redis • key-value data store • networked • in-memory • optional durability • open-source (BSD license)
  • 6. Calitati • usor de folosit • documentatie simpla si usor de inteles • rapid (fiind in memorie)
  • 7. Cum se foloseste • redis-cli • din Ruby: • Redis gem
  • 8. Tipuri de date • “Data structures server” • Tipul de baza: String • Structuri de date: • Lists • Hashes • Sets • Sorted sets
  • 9. • comenzile sunt atomice • ex: • incr, decr • lpush, lpop • setnx
  • 10. DEMO
  • 11. Expire • putem sa setam un “expire” pe orice cheie • e important ca acea cheie sa existe
  • 12. DEMO
  • 13. Publish-Subscribe • subscribe la mai multe cozi • publish => primesc toti cei subscribed
  • 14. DEMO
  • 15. Tranzactii • toate instructiunile sunt executate in ordine • nu se ruleaza instructiuni primite de la alti clienti • atomicitate: totul sau nimic
  • 16. DEMO
  • 18. DEMO
  • 19. Pipelining • la comunicare prin TCP, round-trip time mare comparat cu durata unei instructiuni • ~1ms prin loopback • ~100 ms prin Internet • Solutie: sa folosim pipelining • Pentru si mai multa viteza: comanda eval pentru a rula Lua scripts (doar din v2.6)
  • 20. DEMO
  • 21. Persistenta • Fiind in memorie, toate datele se pierd daca • moare procesul • pana de curent (sau crapa sistemul de operare)
  • 22. Persistenta • Solutii: • RDB point-in-time snapshots • AOF (Append Only File)
  • 23. Persistenta • RDB point-in-time snapshots • util pentru backup • fork => fisier scris de procesul fiu • copy-on-write • poate bloca procesul pana la 1 secunda • cele mai recente date se pot pierde
  • 24. Persistenta • AOF (Append Only File) • foloseste write(2) si fsync(2) • fsync: no / every second / every query • fisier mai mare decat RDB • scade putin performanta • rescris automat cand creste prea mult • tot folosind fork
  • 25. • Ar trebui folosite amandoua metodele pentru persistenta • RDB mai bun decat AOF pentru disaster recovery pentru ca este mai compact
  • 27. Resque • cozi de lucru • inspirat de DelayedJob • foloseste Redis
  • 28. Structura Resque • librarie Ruby • creare, interogare si procesare de joburi • Rake task pentru pornirea de workeri • aplicatie Sinatra pentru monitorizare • cozi, joburi, workeri, errori
  • 29. Workeri • pot rula pe masini diferite • nu au probleme de memory bloat / "leaks" • arhitectura parent - child (fork)
  • 30. Cozi • sunt persistente • complexitate O(1) • push si pop atomic • pot fi inspectate • stocheaza joburile ca si packete JSON
  • 31. De tinut cont • sa avem grija la ce trimitem ca parametri • id in loc de obiect intreg • avantaj: obiect up-to-date • dezavantaj: poate inca nu se vad schimbarile • schimbare symbol in string (JSON) • [:a, :b] se transforma in ["a", "b"]
  • 32. Interfata web • informatii despre workeri • cozile folosite • continutul cozilor • statistici (ex. numar de job-uri procesate) • urmarirea erorilor
  • 34. Redis si Resque in ZenCash in ZenCash
  • 35. ZenCash • Te ajuta sa fii platit mai repede • Integrare cu 8 aplicatii de facturare • import: Invoices, Payments, Customers • Sincronizare: • o data pe ora • on-demand
  • 36. • In ZenCash folosim Redis pentru • cozi de lucru (Resque) • stocare temporara • sincronizare procese
  • 37. Resque • comunicare cu third-party API • trimitere de email • taxare clienti • joburi pentru • monitorizare aplicatie • generare statistici • lansare sincronizare periodic • procesare rezultate sincronizare
  • 39. Sync Status • Sincronizarea unei facturi • Invoice • Customer • parsare adresa (daca e nevoie)
  • 40. DB-less SyncApp • pentru un sync pot fi necesare mai multe request-uri (ex. paginare) • se faceau serializari / deserializari in plus • am renuntat la MySQL
  • 41. Temporary file store • scenariu: • un proces face download de PDF • alt proces face upload pe S3 • procesele trebuie sa fie pe aceeasi masina ca sa poata accesa fisierul de pe disc • solutie: stocarea fisierului in Redis
  • 42. Monitorizare aplicatie • Salvarea periodica a unor parametri • Bounded Queue: • coada cu dimensiune limitata implementata folosind Redis
  • 43. Sincronizare procese • Redis Lock • poate fi folosit pentru a ne asigura ca un singur proces executa o bucata de cod pentru o anumita resursa • ex: procesare rezultate sincronizare
  • 44. • Exemplu folosire RedisLock
  • 45. Rate limitation • Unele servicii au API usage limits • Tinem o evidenta a requesturilor facute pentru un anumit user in ultimul minut
  • 46. Referinte http://redis.io https://github.com/defunkt/resque
  • 47. Contact @florin555 florin555@gmail.com
  • 48. ?

Editor's Notes

  • #6: - nu exista tabele sau relatii - server redis - totul e tinut in memorie -- spatiul bazei de date e limitat de RAM / swap
  • #25: Rescriere AOF - fiul scrie din memorie un AOF - parintele functioneaza in continuare la fel + adauga intr-un buffer commenzile noi - fiul trimite parintelui un semnal cand a terminat - parintele scrie din buffer - redenumeste atomic fisierul