SlideShare a Scribd company logo
MICROSERVICES
AND THEIR COMMUNICATION
(RABBITMQ / SIDEKIQ)
Kraków, październik 2016
Radek Rochmalski, KRUG
Czym są mikroserwisy?
Czym są mikroserwisy?
Dlaczego warto?
Dlaczego warto?
Sprawne wytwarzanie
i rozwój oprogramowania.
Dlaczego warto?
Niezależność
od innych usług
Dlaczego warto?
Dobór technologii
do problemu
Dlaczego warto?
Utrzymywanie
i skalowalność
Co może być wyzwaniem?
Co może być wyzwaniem?
Testowanie
systemu usług
Co może być wyzwaniem?
Dekompozycja
systemu monolitycznego
Co może być wyzwaniem?
Zarządzanie
i monitorowanie
Komunikacja między usługami
Komunikacja między usługami
Komunikacja między usługami
Komunikacja między usługami
Klient HTTP
Klient HTTP - EXCON
gemfile
gem 'excon'
simple_client.rb
connection = Excon.new('https://example.com')

get_response = connection.get(path: '/resources')

post_response = connection.post(path: '/resources')

delete_response = connection.delete(path: '/resource/1')
api_client.rb
connection = Excon.new('https://example.com/api/v1/resources', headers: {'Content-Type' =>
'application/json', 'X-Api-Key' => 'secret'})
connection.request(method: :get, query: { page: 1, per_page: 10 })
connection.request(method: :post, body: object.attributes.to_json)

Excon.new('https://example.com', retry_limit: 5, idempotent: true)
Klient HTTP - FARADAY
gem 'faraday'
connection = Faraday.new('https://example.com')

get_response = connection.get('/resources')

post_response = connection.post('/resources')

delete_response = connection.delete('/resource/1')
connection = Faraday.new('https://example.com/api/v1', headers: {'Content-Type' =>
'application/json', 'X-Api-Key' => 'secret'})
connection.get '/resources', { page: 1, per_page: 10 }

connection.post '/resources', object.attributes.to_json

connection.get '/resources', options: { timeout: 5, open_timeout: 2 }
gemfile
simple_client.rb
api_client.rb
Klient HTTP - REST-CLIENT
gem 'rest-client'
get_response = RestClient.get('https://example.com/resources')

post_response = RestClient.post('https://example.com/resources', {})

delete_response = RestClient.delete('https://example.com/resource/1')
RestClient.get('http://example.com/api/v1/resources', {content_type: :json, accept: :json,
'X-Api-Key' => 'secret', params: { page: 1, per_page: 10 })
RestClient.post('https://example.com/api/v1/resources', {content_type: :json, accept: :json,
'X-Api-Key' => 'secret'}, object.attributes.to_json)
gemfile
simple_client.rb
api_client.rb
Kolejkowanie i obsługa zdarzeń
SIDEKIQ
Kolejkowanie i obsługa zdarzeń SIDEKIQ
Prosty w integracji
priorytety, ponawiane zadań, kontrola współbieżności
Wydajny, wielowątkowy
4 500 requests per second (req/s)
Oparty na Redis'ie
Kolejkowanie i obsługa zdarzeń SIDEKIQ
gem 'sidekiq'
class MyWorker

include Sidekiq::Worker sidekiq_options queue: 'critical'
def perform(url, json_data)
connection = Excon.new(url, headers:
{'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'})
connection.request(method: :post, body: json_data)
end end
MyWorker.perform_async(’http://…’, { name: ’Jhon’ }.to_json)
MyWorker.perform_in(3.minutes, ’http://…’, { name: ’Jhon’ }.to_json)
gemfile
my_worker.rb
usage
Kolejkowanie i obsługa zdarzeń
RABBITMQ
Kolejkowanie i obsługa zdarzeń RABBITMQ
Bardzo wydajny
44 824 req/s (max. wysyłka 149 910 req/s, max. odbiór 64 315 req/s
Obsługuje różne platromy programistyczne
Ruby, Java, Python, Node.js, C / C++, Erlang, Go
Dostępny dla większości systemów
MacOS X | Debian / Ubuntu | Amazon EC2 | Cloud Foundry | Windows
Kolejkowanie i obsługa zdarzeń RABBITMQ
Kolejkowanie i obsługa zdarzeń RABBITMQ - podstawowe pojęcia
Connection - połączenie TCP z brokerem wiadomości
Channel - wirtualne połączenie wewnątrz TCP
Message - wiadomość o dowolnej formie i treści
Queue - kolejka do której wysyłane są wiadomości
Exchange - przyjmuje wysłane wiadomości i rozsyła je do
kolejek
Exchange: Direct, Fanout, Topic, Headers
RABBITMQ
Producer / Consumer
Kolejkowanie i obsługa zdarzeń BUNNY
Funkcjonalny
Oferuje wszystko co posiada RabbitMQ
Wygodny
Sam odzyskuje połączenia i wiadomości po awarii
Zaawansowany
Dowolność w sposobie konfiguracji
Kolejkowanie i obsługa zdarzeń BUNNY
gem 'bunny'
producer.rb
require 'bunny' connection = Bunny.new
connection.start
channel = connection.create_channel

queue = channel.queue('app.events.user.created.development') exchange =
channel.default_exchange
exchange.publish({ url: 'https://example.com/api/v1/users',

data: { name: 'John', age: 21 } }.to_json, routing_key: queue.name)
connection.close
usage
ruby producer.rb
gemfile
Kolejkowanie i obsługa zdarzeń BUNNY
require 'bunny'
connection = Bunny.new
connection.start

channel = connection.create_channel
queue = channel.queue('app.events.user.created.development')
loop do

queue.subscribe do |delivery_info, metadata, payload|
# Excon...
end end
connection.close
usage
ruby consumer.rb
producer.rb
Kolejkowanie i obsługa zdarzeń SNEAKERS
Bardzo wydajny
Ogranicznony jedynie prędkością brokera (min. 1000 req/s)
Prosty w integracji
Mocno wzorowany na Sidekiq
Zaawansowana semantyka wiadomości
Reject, requeue, acknowledge
Kolejkowanie i obsługa zdarzeń SNEAKERS
gem 'sneakers'
my_consumer.rb
class Consumer

include Sneakers::Worker

from_queue 'app.events.user.created.development',
prefetch: 25, threads: 20, timeout_job_after: 15
def process(message)
# Excon...

ack!
end end
usage
sneakers work Consumer --require consumer.rb
require 'sneakers/tasks'

$ WORKERS=Consumer rake sneakers:run
gemfile
Kolejkowanie i obsługa zdarzeń HUTCH
Prosty w integracji
connect, publish, consume
Specyficzny
Wysyłka wiadomości tylko Topic
Oparty na Bunny
lub March Hare (JRuby)
Kolejkowanie i obsługa zdarzeń HUTCH
gem 'hutch'
producer.rb
require 'hutch'
Hutch.connect
Hutch.publish('app.events.user.created.development',

url: 'https://example.com/api/v1/users',

data: { name: 'Jhon', age: 21, email: 'jhon@mail.com' }.to_json)
usage
hutch --require hutch/producer.rb
hutch --require consumer.rb --pidfile path_to_hutch_pid --daemonise
gemfile
Kolejkowanie i obsługa zdarzeń HUTCH
require 'hutch'
class Consumer

include Hutch::Consumer

consume 'app.events.user.*.development'
def process(message)

url, data = message.url, message.user_data
connection = Excon.new(url, headers:

{'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'})
connection.request(method: :post, body: data) end
end
usage
hutch --require hutch/consumer.rb
consumer.rb
Aplikacje zewnętrzne na przykładzie
mikro-frameworka Roda
Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA
Szybka i prosta
Core aplikacji to drzewo routing'u
Niezawodna i wydajna
Inteligentny cache struktur danych
Elastyczna
Wiele wtyczek oraz dodatków
Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA
require 'roda'
class App < Roda
plugin :render
route do |r|
r.root { view :index } # GET / request
r.on 'resources' do # /resources branch
r.is do
# GET /resources request
r.get { view :resources }
# POST /resources request
r.post { Creator.perform(r.params); r.redirect }
end
end
end
app.rb
Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA
require 'roda'
class App < Roda
plugin :render
plugin :rest_api
route do |r|
r.root { view :index }
r.api
r.version 1 do
unless r.env['HTTP_X_API_KEY']) == 'secret'
r.redirect('Unauthorized', 401)
end
# ....
end
end
app.rb
Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA
require 'roda'
class App < Roda
plugin :render
plugin :rest_api
route do |r|
r.api
r.version 1 do
r.resource :resources do |resources|
resources.save { ResourceCreator.perform(r.params) }
resources.list { |params| ResourceCollector.perform(params) }
resources.routes :index, :create
resources.permit r.params
end
end
end
end
app.rb
Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA
require 'roda'
class App < Roda
plugin :path
plugin :assets
plugin :render, views: 'app/views', engine: 'erb'
plugin :error_handler
plugin :json_parser
plugin :json
plugin :basic_auth
route do |r|
r.root { view :index }
end
end
app.rb
Podsumowanie
Podsumowanie
Pytania?
Dziękuję za uwagę!
Dane kontaktowe
Radosław Rochmalski
Ruby Developer
e-mail: radoslaw.rochmalski@infakt.pl

More Related Content

PPTX
Przetwarzanie asynchroniczne w zastosowaniach webowych
PDF
Silesia JUG : Java Message Service
PPTX
Windows Communication Foundation
PDF
PDF
Tips and ticks: prowadzenie dzialu IT
PDF
Jak rozliczać promocje i bonusy w e-sklepie
PDF
Data is oxygen for ML
PDF
Jak dzieki Data Minning księgujemy automatycznie koszty w infakt
Przetwarzanie asynchroniczne w zastosowaniach webowych
Silesia JUG : Java Message Service
Windows Communication Foundation
Tips and ticks: prowadzenie dzialu IT
Jak rozliczać promocje i bonusy w e-sklepie
Data is oxygen for ML
Jak dzieki Data Minning księgujemy automatycznie koszty w infakt

Viewers also liked (20)

PDF
IT vs bookkeeping
ODP
Togtoh hicheel
PDF
IAF141 nº10dixital
PDF
IAF135 nº4dixital
PDF
משואה התנגדות 1-3-2012
PDF
PPT
La storia del cane
PDF
Sosiaalinen median välineet
PDF
Be found in pharma
PDF
חן קוסובר יישום פיקוח על שכר הדירה בישראל
DOCX
41681421 kotak-mahindra
PPTX
Diseminare mobilitate Comenius - Ancona, Italia - "TACCLE - Creating your own...
ODP
Hamid0786[1]
PDF
grep ruby
PPTX
3) music video genre research
PPT
I am thankful for... emir bilgili
PDF
Viestintäpaja 12112014slideshare
PPTX
Largo Foods Popcornes
ODT
Bie daalt
DOC
Suomi24 kaverit
IT vs bookkeeping
Togtoh hicheel
IAF141 nº10dixital
IAF135 nº4dixital
משואה התנגדות 1-3-2012
La storia del cane
Sosiaalinen median välineet
Be found in pharma
חן קוסובר יישום פיקוח על שכר הדירה בישראל
41681421 kotak-mahindra
Diseminare mobilitate Comenius - Ancona, Italia - "TACCLE - Creating your own...
Hamid0786[1]
grep ruby
3) music video genre research
I am thankful for... emir bilgili
Viestintäpaja 12112014slideshare
Largo Foods Popcornes
Bie daalt
Suomi24 kaverit
Ad

Similar to Microservieces and their communication (RabbitMQ/SIDEKIQ) (20)

PDF
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
PDF
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
PDF
Michał Dec - Quality in Clouds
PDF
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
PPTX
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
PDF
GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej...
PPTX
Azure Event Hubs - wprowadzenie
PPTX
Azure Event Hubs - wprowadzenie
PPTX
Jak podwoić wartość kodu .NET?
PPT
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
PDF
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
PDF
Otwarta chmura Microsoft
PPTX
Platforma Kontentowa
PPTX
[CareerCon] as-a-Service czy Software Defined (PL)
PDF
Produkcja aplikacji internetowych
PDF
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
PDF
JavaScript, Moduły
PPTX
Android i REST
PDF
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
PDF
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Michał Dec - Quality in Clouds
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
GWINT: Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej...
Azure Event Hubs - wprowadzenie
Azure Event Hubs - wprowadzenie
Jak podwoić wartość kodu .NET?
PLNOG16: Pion Systemów Sieciowych i Bezpieczeństwa, Robert Rosiak
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Otwarta chmura Microsoft
Platforma Kontentowa
[CareerCon] as-a-Service czy Software Defined (PL)
Produkcja aplikacji internetowych
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
JavaScript, Moduły
Android i REST
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Ad

More from infakt (20)

PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 15) - Akta osobowe
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 14) - Spis z natury
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 13) - Wyposażenie
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 12) - Dokumenty księgowe
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 11) - Zatrudnienie pr...
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 10) - Towary handlowe
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 9) - Prowadzenie KPiR...
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowania
PDF
Rozliczenia roczne PIT (cz. 2)
PDF
Rozliczenia roczne PIT (cz. 1)
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 7) - Formy współpracy
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 6) - Pełnomocnictwa
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 5) - PKD i PKWiU
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 4) - Dotacje i dofina...
PDF
Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...
PDF
ZUS - szkolenie z podstaw księgowości
PDF
VAT - szkolenie z podstaw księgowości
PDF
PIT - szkolenie z podstaw księgowości
PDF
KPiR-szkolenie z podstaw księgowości
PDF
Raport inFakt: Czy mikroprzedsiębiorcy i księgowi są gotowi na JPK
Szkolenie z księgowości dla średniozaawansowanych (odc. 15) - Akta osobowe
Szkolenie z księgowości dla średniozaawansowanych (odc. 14) - Spis z natury
Szkolenie z księgowości dla średniozaawansowanych (odc. 13) - Wyposażenie
Szkolenie z księgowości dla średniozaawansowanych (odc. 12) - Dokumenty księgowe
Szkolenie z księgowości dla średniozaawansowanych (odc. 11) - Zatrudnienie pr...
Szkolenie z księgowości dla średniozaawansowanych (odc. 10) - Towary handlowe
Szkolenie z księgowości dla średniozaawansowanych (odc. 9) - Prowadzenie KPiR...
Szkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowania
Rozliczenia roczne PIT (cz. 2)
Rozliczenia roczne PIT (cz. 1)
Szkolenie z księgowości dla średniozaawansowanych (odc. 7) - Formy współpracy
Szkolenie z księgowości dla średniozaawansowanych (odc. 6) - Pełnomocnictwa
Szkolenie z księgowości dla średniozaawansowanych (odc. 5) - PKD i PKWiU
Szkolenie z księgowości dla średniozaawansowanych (odc. 4) - Dotacje i dofina...
Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...
ZUS - szkolenie z podstaw księgowości
VAT - szkolenie z podstaw księgowości
PIT - szkolenie z podstaw księgowości
KPiR-szkolenie z podstaw księgowości
Raport inFakt: Czy mikroprzedsiębiorcy i księgowi są gotowi na JPK

Microservieces and their communication (RabbitMQ/SIDEKIQ)

  • 1. MICROSERVICES AND THEIR COMMUNICATION (RABBITMQ / SIDEKIQ) Kraków, październik 2016 Radek Rochmalski, KRUG
  • 5. Dlaczego warto? Sprawne wytwarzanie i rozwój oprogramowania.
  • 9. Co może być wyzwaniem?
  • 10. Co może być wyzwaniem? Testowanie systemu usług
  • 11. Co może być wyzwaniem? Dekompozycja systemu monolitycznego
  • 12. Co może być wyzwaniem? Zarządzanie i monitorowanie
  • 18. Klient HTTP - EXCON gemfile gem 'excon' simple_client.rb connection = Excon.new('https://example.com')
 get_response = connection.get(path: '/resources')
 post_response = connection.post(path: '/resources')
 delete_response = connection.delete(path: '/resource/1') api_client.rb connection = Excon.new('https://example.com/api/v1/resources', headers: {'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'}) connection.request(method: :get, query: { page: 1, per_page: 10 }) connection.request(method: :post, body: object.attributes.to_json)
 Excon.new('https://example.com', retry_limit: 5, idempotent: true)
  • 19. Klient HTTP - FARADAY gem 'faraday' connection = Faraday.new('https://example.com')
 get_response = connection.get('/resources')
 post_response = connection.post('/resources')
 delete_response = connection.delete('/resource/1') connection = Faraday.new('https://example.com/api/v1', headers: {'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'}) connection.get '/resources', { page: 1, per_page: 10 }
 connection.post '/resources', object.attributes.to_json
 connection.get '/resources', options: { timeout: 5, open_timeout: 2 } gemfile simple_client.rb api_client.rb
  • 20. Klient HTTP - REST-CLIENT gem 'rest-client' get_response = RestClient.get('https://example.com/resources')
 post_response = RestClient.post('https://example.com/resources', {})
 delete_response = RestClient.delete('https://example.com/resource/1') RestClient.get('http://example.com/api/v1/resources', {content_type: :json, accept: :json, 'X-Api-Key' => 'secret', params: { page: 1, per_page: 10 }) RestClient.post('https://example.com/api/v1/resources', {content_type: :json, accept: :json, 'X-Api-Key' => 'secret'}, object.attributes.to_json) gemfile simple_client.rb api_client.rb
  • 21. Kolejkowanie i obsługa zdarzeń SIDEKIQ
  • 22. Kolejkowanie i obsługa zdarzeń SIDEKIQ Prosty w integracji priorytety, ponawiane zadań, kontrola współbieżności Wydajny, wielowątkowy 4 500 requests per second (req/s) Oparty na Redis'ie
  • 23. Kolejkowanie i obsługa zdarzeń SIDEKIQ gem 'sidekiq' class MyWorker
 include Sidekiq::Worker sidekiq_options queue: 'critical' def perform(url, json_data) connection = Excon.new(url, headers: {'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'}) connection.request(method: :post, body: json_data) end end MyWorker.perform_async(’http://…’, { name: ’Jhon’ }.to_json) MyWorker.perform_in(3.minutes, ’http://…’, { name: ’Jhon’ }.to_json) gemfile my_worker.rb usage
  • 24. Kolejkowanie i obsługa zdarzeń RABBITMQ
  • 25. Kolejkowanie i obsługa zdarzeń RABBITMQ Bardzo wydajny 44 824 req/s (max. wysyłka 149 910 req/s, max. odbiór 64 315 req/s Obsługuje różne platromy programistyczne Ruby, Java, Python, Node.js, C / C++, Erlang, Go Dostępny dla większości systemów MacOS X | Debian / Ubuntu | Amazon EC2 | Cloud Foundry | Windows
  • 26. Kolejkowanie i obsługa zdarzeń RABBITMQ
  • 27. Kolejkowanie i obsługa zdarzeń RABBITMQ - podstawowe pojęcia Connection - połączenie TCP z brokerem wiadomości Channel - wirtualne połączenie wewnątrz TCP Message - wiadomość o dowolnej formie i treści Queue - kolejka do której wysyłane są wiadomości Exchange - przyjmuje wysłane wiadomości i rozsyła je do kolejek Exchange: Direct, Fanout, Topic, Headers
  • 29. Kolejkowanie i obsługa zdarzeń BUNNY Funkcjonalny Oferuje wszystko co posiada RabbitMQ Wygodny Sam odzyskuje połączenia i wiadomości po awarii Zaawansowany Dowolność w sposobie konfiguracji
  • 30. Kolejkowanie i obsługa zdarzeń BUNNY gem 'bunny' producer.rb require 'bunny' connection = Bunny.new connection.start channel = connection.create_channel
 queue = channel.queue('app.events.user.created.development') exchange = channel.default_exchange exchange.publish({ url: 'https://example.com/api/v1/users',
 data: { name: 'John', age: 21 } }.to_json, routing_key: queue.name) connection.close usage ruby producer.rb gemfile
  • 31. Kolejkowanie i obsługa zdarzeń BUNNY require 'bunny' connection = Bunny.new connection.start
 channel = connection.create_channel queue = channel.queue('app.events.user.created.development') loop do
 queue.subscribe do |delivery_info, metadata, payload| # Excon... end end connection.close usage ruby consumer.rb producer.rb
  • 32. Kolejkowanie i obsługa zdarzeń SNEAKERS Bardzo wydajny Ogranicznony jedynie prędkością brokera (min. 1000 req/s) Prosty w integracji Mocno wzorowany na Sidekiq Zaawansowana semantyka wiadomości Reject, requeue, acknowledge
  • 33. Kolejkowanie i obsługa zdarzeń SNEAKERS gem 'sneakers' my_consumer.rb class Consumer
 include Sneakers::Worker
 from_queue 'app.events.user.created.development', prefetch: 25, threads: 20, timeout_job_after: 15 def process(message) # Excon...
 ack! end end usage sneakers work Consumer --require consumer.rb require 'sneakers/tasks'
 $ WORKERS=Consumer rake sneakers:run gemfile
  • 34. Kolejkowanie i obsługa zdarzeń HUTCH Prosty w integracji connect, publish, consume Specyficzny Wysyłka wiadomości tylko Topic Oparty na Bunny lub March Hare (JRuby)
  • 35. Kolejkowanie i obsługa zdarzeń HUTCH gem 'hutch' producer.rb require 'hutch' Hutch.connect Hutch.publish('app.events.user.created.development',
 url: 'https://example.com/api/v1/users',
 data: { name: 'Jhon', age: 21, email: 'jhon@mail.com' }.to_json) usage hutch --require hutch/producer.rb hutch --require consumer.rb --pidfile path_to_hutch_pid --daemonise gemfile
  • 36. Kolejkowanie i obsługa zdarzeń HUTCH require 'hutch' class Consumer
 include Hutch::Consumer
 consume 'app.events.user.*.development' def process(message)
 url, data = message.url, message.user_data connection = Excon.new(url, headers:
 {'Content-Type' => 'application/json', 'X-Api-Key' => 'secret'}) connection.request(method: :post, body: data) end end usage hutch --require hutch/consumer.rb consumer.rb
  • 37. Aplikacje zewnętrzne na przykładzie mikro-frameworka Roda
  • 38. Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA Szybka i prosta Core aplikacji to drzewo routing'u Niezawodna i wydajna Inteligentny cache struktur danych Elastyczna Wiele wtyczek oraz dodatków
  • 39. Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA require 'roda' class App < Roda plugin :render route do |r| r.root { view :index } # GET / request r.on 'resources' do # /resources branch r.is do # GET /resources request r.get { view :resources } # POST /resources request r.post { Creator.perform(r.params); r.redirect } end end end app.rb
  • 40. Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA require 'roda' class App < Roda plugin :render plugin :rest_api route do |r| r.root { view :index } r.api r.version 1 do unless r.env['HTTP_X_API_KEY']) == 'secret' r.redirect('Unauthorized', 401) end # .... end end app.rb
  • 41. Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA require 'roda' class App < Roda plugin :render plugin :rest_api route do |r| r.api r.version 1 do r.resource :resources do |resources| resources.save { ResourceCreator.perform(r.params) } resources.list { |params| ResourceCollector.perform(params) } resources.routes :index, :create resources.permit r.params end end end end app.rb
  • 42. Aplikacje zewnętrzne na przykładzie mikro-frameworka RODA require 'roda' class App < Roda plugin :path plugin :assets plugin :render, views: 'app/views', engine: 'erb' plugin :error_handler plugin :json_parser plugin :json plugin :basic_auth route do |r| r.root { view :index } end end app.rb
  • 46. Dane kontaktowe Radosław Rochmalski Ruby Developer e-mail: radoslaw.rochmalski@infakt.pl