RabbitMQ easy start

čtvrtek 26. června 2014

Už nějaký čas si hraju s message brokerem, konkrétně tedy s RabbitMQ. Tady je pár tipů pro práci s ním.

Instalace

Klasický instalation guide je k nalezení na oficiálních stránkách

Po nainstalování budete mít prázdný konfigurační soubor v
config file(s) : /etc/rabbitmq/rabbitmq.config

Buďto tedy projdete všechny možné konfigurační volby nebo zkusíte použít nějaké GUI.

RabbitMQ má docela šikovnou grafickou nástavbu v pluginu rabbitmq_management

Povolíte jej jednoduchým příkazem
rabbitmq-plugins enable rabbitmq_management

Poté je možné se přihlásit na adrese
http://example.com:15672/
pozn. Dejte si pozor na firewall, port 15672 obvykle nebývá odblokovaný :)

Přihlásíte se můžete loginem guest / guest.

Měli byste vidět takového GUI

První co důrazně doporučuji je vytvořit si nového administrátora v Admin/Users a guest přístup zablokovat.

Producer, Exchanges, Queues, Consumer

Chvilku mi trvalo než jsem pochopil jakej je v tom rozdíl a co to vlastně je. Producer zprávu odesílá na exchange což je jenom takový pošťák, který na základě routovacích pravidel doručí zprávu do patřičné queue.

Máme dvě aplikace jedna je signup, která chce odesílat důležité emaily o registraci uživatele apod. A pak máme aplikaci, která chce rozesílat newsletter.

Když newsletter dorazí o půl hodiny později, pravděpodobně se svět nezboří, ale neplatí to naopak u signup. Pokud uživatel čeká na daný email, tak asi není vhodné aby čekal pul hodiny.

Proto využijeme routingu a emaily budeme posílat s route "email.low" nebo "email.top". Aplikace tedy pošle zprávu na exchange s nějakou routou a o víc se nestará.

Exchange v sobě drží pravidla o routování a na základě charakteru té zprávy je přiřadí konkrétní Queue. Z Queue potom putuje ke konkrétnímu Consumerovi, který ji zpracuje a odešle jako email dále do světa. 

Producer - vytváří zprávy pro rabbita
Exchange - pošták který na základě route nebo argumentů zprávu zařadí do Queue
Queue - FIFO list zpráv
Consumer - Konzumuje zprávy z Queue.

RabbitMQ Simulator

Asi by bylo fajn kdybyste si mohli nasimulovat chování v Rabbitu bez nutnosti provozování všech consumerů a producerů. 
Existuje utilitka RabbitMQ Simulator, která vám toto umožní.

Vyzkoušet si ji můžete na www.tryrabbitmq.com. Pokud budete chtít importy / exporty nastavení do vašeho rabbita tak si ji musíte rozběhat na serveru jako nodeJS aplikaci. Instalace a zdrojáky jsou na github.com/RabbitMQSimulator/RabbitMQSimulator

Zprávy

Queue mohou být dvojího typu.
  • Durable - zprávy jsou v Rabbitu zapsány na disk a v případě restartu serveru jsou obnovena z disku
  • Transient - zprávy se ztratí po restartu serveru
V momentě kdy RabbitMQ zprávu doručí, tak jí trvale maže a není možné jí obnovit. Co to ale znamená, že jí doručí? Záleží na parametrech zprávy, jsou opět dva.
  • Non-persistent - zpráva je odeslána na consumera a smazána
  • Persistent - rabbit po odeslání zprávy čeká na potvrzení od consumera. Pokud toto potvrzení nedostane do definovaného času, tak ji zkusí doručit znovu.
Best practise - Vždy potvrzujte zprávu až potom co ji zpracujete, nikoliv v momentě kdy ji přijmete! Mohlo by se totiž stát, že v průběhu zpracování zprávy vám consumer spadne a vy nebudete schopni tuto operaci dokončit. Čímž o zprávu přijdete.

Jak dál?

Tématika Rabbitu je opravdu rozsáhlá, dalo by se napsat ještě spousta věcí například o HA clusteru, posílání odpovědí, topic/direct, virtual host atd.
Buďto se mrkněte do oficiálních tutoriálů www.rabbitmq.com/getstarted.html nebo piště do komentářů.

Záměrně jsem se vyhnul textu o producerech a consumerech v PHP, protože jej napsal můj kamarád Filip Procházka na svém blogu http://filip-prochazka.com/blog/kdyby-rabbitmq-aneb-asynchronni-kdyby-events