SlideShare a Scribd company logo
1 of 46
Download to read offline
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

Viewers also liked

Togtoh hicheel
Togtoh hicheel Togtoh hicheel
Togtoh hicheel
togtohoo79
 
משואה התנגדות 1-3-2012
משואה התנגדות 1-3-2012משואה התנגדות 1-3-2012
משואה התנגדות 1-3-2012
acri009
 
La storia del cane
La  storia del caneLa  storia del cane
La storia del cane
laurany2006
 
חן קוסובר יישום פיקוח על שכר הדירה בישראל
חן קוסובר   יישום פיקוח על שכר הדירה בישראלחן קוסובר   יישום פיקוח על שכר הדירה בישראל
חן קוסובר יישום פיקוח על שכר הדירה בישראל
acri009
 
41681421 kotak-mahindra
41681421 kotak-mahindra41681421 kotak-mahindra
41681421 kotak-mahindra
Rahul Desai
 
3) music video genre research
3) music video genre research3) music video genre research
3) music video genre research
alegge
 
I am thankful for... emir bilgili
I am thankful for...   emir bilgiliI am thankful for...   emir bilgili
I am thankful for... emir bilgili
skipperlauren
 

Viewers also liked (20)

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

Similar to Microservieces and their communication (RabbitMQ/SIDEKIQ)

Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz
 
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadkuDrobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Logicaltrust pl
 
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadkuDrobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Logicaltrust pl
 

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

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

More from infakt

More from infakt (20)

Szkolenie z księgowości dla średniozaawansowanych (odc. 15) - Akta osobowe
Szkolenie z księgowości dla średniozaawansowanych (odc. 15) - Akta osoboweSzkolenie z księgowości dla średniozaawansowanych (odc. 15) - Akta osobowe
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. 14) - Spis z naturySzkolenie z księgowości dla średniozaawansowanych (odc. 14) - Spis z natury
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. 13) - WyposażenieSzkolenie z księgowości dla średniozaawansowanych (odc. 13) - Wyposażenie
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. 12) - Dokumenty księgoweSzkolenie z księgowości dla średniozaawansowanych (odc. 12) - Dokumenty księgowe
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. 11) - Zatrudnienie pr...Szkolenie z księgowości dla średniozaawansowanych (odc. 11) - Zatrudnienie pr...
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. 10) - Towary handloweSzkolenie z księgowości dla średniozaawansowanych (odc. 10) - Towary handlowe
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. 9) - Prowadzenie KPiR...Szkolenie z księgowości dla średniozaawansowanych (odc. 9) - Prowadzenie KPiR...
Szkolenie z księgowości dla średniozaawansowanych (odc. 9) - Prowadzenie KPiR...
 
Szkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowania
Szkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowaniaSzkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowania
Szkolenie z księgowości dla średniozaawansowanych (odc. 8) - Formy opodatkowania
 
Rozliczenia roczne PIT (cz. 2)
Rozliczenia roczne PIT (cz. 2)Rozliczenia roczne PIT (cz. 2)
Rozliczenia roczne PIT (cz. 2)
 
Rozliczenia roczne PIT (cz. 1)
Rozliczenia roczne PIT (cz. 1)Rozliczenia roczne PIT (cz. 1)
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. 7) - Formy współpracySzkolenie z księgowości dla średniozaawansowanych (odc. 7) - Formy współpracy
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. 6) - PełnomocnictwaSzkolenie z księgowości dla średniozaawansowanych (odc. 6) - Pełnomocnictwa
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. 5) - PKD i PKWiUSzkolenie z księgowości dla średniozaawansowanych (odc. 5) - PKD i PKWiU
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. 4) - Dotacje i dofina...Szkolenie z księgowości dla średniozaawansowanych (odc. 4) - Dotacje i dofina...
Szkolenie z księgowości dla średniozaawansowanych (odc. 4) - Dotacje i dofina...
 
Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...
Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...
Szkolenie z księgowości dla średniozaawansowanych (odc. 1) - Zakładanie dział...
 
ZUS - szkolenie z podstaw księgowości
ZUS - szkolenie z podstaw księgowościZUS - szkolenie z podstaw księgowości
ZUS - szkolenie z podstaw księgowości
 
VAT - szkolenie z podstaw księgowości
VAT - szkolenie z podstaw księgowościVAT - szkolenie z podstaw księgowości
VAT - szkolenie z podstaw księgowości
 
PIT - szkolenie z podstaw księgowości
PIT - szkolenie z podstaw księgowościPIT - szkolenie z podstaw księgowości
PIT - szkolenie z podstaw księgowości
 
KPiR-szkolenie z podstaw księgowości
KPiR-szkolenie z podstaw księgowościKPiR-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
Raport inFakt: Czy mikroprzedsiębiorcy i księgowi są gotowi na JPKRaport inFakt: Czy mikroprzedsiębiorcy i księgowi są gotowi na JPK
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