RabbitMQ – princip workflow

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomlp79
Člen | 23
+
0
-

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
+
0
-

@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
+
0
-

@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
+
+3
-

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

tomlp79
Člen | 23
+
0
-

@PavelJanda Chtel jsem zkusit tvuj extension pro rabbit, vypada to pekne, ale v composeru vyzadujes kdyby/console ~2.6.1 – ja mam jiz verzi 2.7.0. Dalo by se s tim prosim neco udelat? :)

Pavel Janda
Člen | 977
+
0
-

@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
+
0
-

Snazil jsem se o to ale nejak se mi nezadarilo. Radeji pockam na zkusenejsiho :) Moc diky.

Pavel Janda
Člen | 977
+
0
-

@tomlp79 Viz 1.2.0

tomlp79
Člen | 23
+
0
-

@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
+
0
-

@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
+
0
-

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
+
0
-

@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.

Pavel Janda
Člen | 977
+
0
-

@tomlp79 composer update

tomlp79
Člen | 23
+
0
-

@PavelJanda bezva diky moc za rychlost :)