RabbitMQ - identifikace posledniho prvku rubrika: Programování: PHP

7 Michal Kleiner
položil/-a 15.6.2015

Ahoj,

resim pro jeden projekt asynchronni zpracovani dat na pozadi pomoci RabbitMQ a PHP workeru bezich na pozadi hlidanych pres Supervisord.

Pro komunikaci klient - worker pouzivam toto schema - https://www.rabbitmq.com/tutorials/tutorial-three-php.html. Klient dostane pozadavek na zpracovani dat (cron), naparsuje je a nacpe do fronty pro workery ke zpracovani. Workeru muze byt vice, jednotlive ulohy jsou na sobe nezavisle, muzou bezet paralelne. Worker se sam hlida a kdyz se blizi zadanemu limitu vyuziti pameti nebo casu, sam se ukonci a Supervisor nastartuje novou instanci.

Pred zahajenim a po skonceni importu bych potreboval v systemu provest dalsi ukony. Zacatek je jednoduchy (pred prvnim poslanim do fronty), ale tim, ze klientsky skript skonci po nacpani vsech tasku do fronty, ktere se mohou zpracovavat jeste nejaky cas, potreboval bych reagovat po poslednim prvku. Mohu si s prvkem predat nejake atributy, ze je posledni, ale tim, ze je zpracovani asynchronni, muze byt prvek oznaceny jako posledni zpracovan treba predposledni.

Co je potreba vykonat po dobehnuti importu lze udelat jak z klienta, tak klidne z workeru, jen to musi probehnout az po vsech polozkach. Pro ilustraci muze jit o zapis casu dokonceni importu posledni polozky.

Pokud bych sel cestou RPC, tak budu muset u klientskeho skriptu pockat na obdrzeni vsech potvrzeni a v podstate z vnejsku se to bude jevit jako synchronni, coz uplne nechci.

Predpokladam, ze bez pravidelne kontroly stavu fronty se asi neobejdu. Napada nekoho nejake jine reseni nez checkovat, co je jeste ve fronte?

Diky za napady a postrceni.

Michal

edit a doplneni:

  • odstranil jsem z otazky 'RPC'
  • neni potreba komunikovat k uzivateli, tzn. akce po poslednim prvku probehne jenom uvnitr systemu

doplneni:

odkaz
8 Jakub Macek
odpověděl/-a 15.6.2015

Pokud nejde o činnost směrem k uživateli, tak jeden z běžnějších přístupů je mít nějaký objekt pro celou transakci (třeba záznam v ACID databázi, důležité je někde mít zámek) a na něm si ukládat počet (popř. výčet) jednotlivých úloh a počitadlo nesplněných (popř. označovat splněné).

Poslední zpracovávající worker pak může do fronty přidat novou úlohu pro závěrečnou práci, pokud zjistí, že zapsal poslední splněnou dílčí úlohu - tj. počitadlo je na nule.

Komentáře

  • Honza Břešťan : Akorat to moc dobre nefunguje, protoze workery nebo sit mezi nimi a tim semaforem muzou selhat a uloha tak bude navzdy nesplnena z pohledu toho nasledujiciho kroku. Pak je potreba mit jeste mechanismus, ktery se postara o znovuspusteni selhanych uloh, coz znamena, ze musi byt identifikovatelne a idempotentni... Neni to zrovna jednoduchy problem, bohuzel. 15.6.2015

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.