RabbitMQ – princip workflow
- tomlp79
- Člen | 23
Chtel bych se zeptat jak mate principialne resene workflow s Rabbitem (pouzivam kdyby/rabbitmq). Jde mi o tohle:
- na serveru mi bezi vice samostatnych projektu (webu), kazdy z nich musi komunikovat s rabbitem
- do rabbita mi prijde vyhodne mit jeden login pro vsechny uzivatele. Projekty vznikaji dynamicky tak bych musel nejak dynamicky generovat pristupove udaje extra pro kazdy projekt. Nebo je lepsi zpusob?
- a ted jde o to jak odlisit, z ktereho projektu ta zprava v queue pochazi. Kdybych spustil consumera na jinem projektu nez mam, pracoval by s jinymi daty.
Anebo se veskera data posilate uz do rabbitu a nakonec je jedno, pres ktery projekt se consumer spusti?
Dik za nakopnuti
- Pavel Janda
- Člen | 977
@tomlp79 Od toho máš v rabbitu různé fronty (popř exchanges). Mrkni do dokumentace rabbitu, je to tam všechno výborně popsáno.
Btw, můžeš zkusit https://github.com/…tte-rabbitmq :) Je to rychlejší a samo to vytvoří fornty/exchanges/etc
- Pavel Janda
- Člen | 977
@tomlp79 Samozřejmě nejlepší řešení je mít rabbit v dockeru samostatně pro každou další aplikaci, ale to už je asi jiná kapitola. :)
- jiri.pudil
- Nette Blogger | 1029
Asi bych zbytečně neobcházel mechanismy, které RabbitMQ nabízí, a ty jednotlivé projekty logicky oddělil tím, že bych pro každý vytvořil vlastní virtual host (samozřejmě za předpokladu, že si nepotřebují posílat zprávy i mezi sebou). Tím máš projekty odlišené jaksi implicitně, protože klient (producer či consumer) se připojuje vždy jen k jednomu vhostu.
Projekty vznikaji dynamicky tak bych musel nejak dynamicky generovat pristupove udaje extra pro kazdy projekt
To bych neviděl jako problém, Rabbit umí vhosty i uživatele vytvářet
bez výpadku za běhu přes rabbitmqctl
nebo HTTP API, takže
i pokud to opravdu potřebuješ mít automatizované, možnosti tu jsou
- Pavel Janda
- Člen | 977
@tomlp79 Jasně. Vyskoušej, zda to funuguje s console 2.7.0 a pak
můžeš poslat PR. :)
Pokud se k tomu nedostaneš, tak to udělám během týdne. Ale rád PR
přijmu.
- tomlp79
- Člen | 23
@PavelJanda Bezva moc diky, uz mi to pekne jede. Muzu mit jeste par zacatecnickych dotazu?
1/ muzu nejak definovat vhost mimo neon? Ptam se na to v navaznosti na muj puvodni dotaz, kdy jak radil @jiri.pudil bych mel pro kazdy projekt vlastni vhost. Jenze projekty maji spolecne jadro, takze bych musel pro kazdy projekt vytvarel neco jako config.local.neon jestli mi rozumis…
2/ jak nyni poslu zpravy z queue do consumeru? jestli jsem to pochopil tak ta knihovna bunny/bunny na to ma featuru $channel->run().
- Pavel Janda
- Člen | 977
@tomlp79
ad 1, Když startuješ rabbitmq connection, musíš jako jeden z parametrů
uvést vhost
. Je to podobné jako například dbname
u připojení k databázi.
Co z toho vyplývá: Pokud chceš v projektu používat více připojení
k rabbitmq, úplně normálně si jich víc nadefinuj a jednotlivým queues
potom řekni, které připojení mají používat:
rabbitmq:
connections:
projectFoo:
user: guest
password: guest
host: 127.0.0.1
port: 5672
vhost: /foo
projectBar:
user: guest
password: guest
host: 127.0.0.1
port: 5672
vhost: /bar
queues:
mailing:
connection: projectFoo
smsPayments:
connection: projectFoo
somethingElse:
connection: projectBar
ad 2, Jakmile máš definované consumery:
consumers:
mailingConsumer:
queue: mailing
callback: [@App\Queue\RabbitMQ\MailingConsumer, consume]
, máš dvě možnosti, jak zpracovávat frontu:
Možnost první: spustit consumera, který poběží určitý počet sekund:
php index.php rabbitmq:consumer mailingConsumer 3600
Možnost druhá: spustit consumera, který zpracuje pouze určitě množství zpráv:
vphp index.php rabbitmq:staticConsumer mailingConsumer 20
(Viz docu: https://github.com/…tte-rabbitmq#…)
Editoval Pavel Janda (12. 7. 2017 13:42)
- tomlp79
- Člen | 23
Diky @PavelJanda . Jeste se te zeptam – ikdyz consumer vrati IConsumer::MESSAGE_REJECT, zprava se vrati do queue. Koukal jsem ze volas bunny metodu reject(Message $message, $reqeue = true) bez druhyho parametru, takze se vzdy requeue provede. Je to chyba nebo koukam blbe?
Diky.
- Pavel Janda
- Člen | 977
@tomlp79 Chybka, díky, že jsi na ní upozornil, jdu pushnout fix. Reject metoda by měla odmítnout zpracování zprávy bez znovuzařazení do fronty. O tom, zda bude tato volba konfigurovatelná, mohou rozhodnout klidně budoucí issues/pull-requesty. Zatím bych nechal bez znovuzařazení do fronty.