Dík za článek, zrovna s celery zaobírám. Narazil jsem ale na jeden bug, když se použije jako backend rabbitmq a to, že po asi minutě worker přestane odpovídat.
Podle FAQ je to známý bug, prý "někteří AMQP klienti mají problém", ale už není zmíněno, kteří ten problém nemají: http://docs.celeryproject.org/en/latest/faq.html#why-is-task-delay-apply-the-worker-just-hanging
Zkoušel jsem měnit verze amqp, vidím že si to dotáhlo i závislost na kombu, ale nevím, která část ten problém způsobuje. Různé verze akorát generují jiné errory v rabbitmq logu (typicky "client unexpectedly closed TCP connection" nebo ztráta heartbeatu).
Neví někdo, za co teda kombu+amqp vyměnit a jak to nakonfigurovat na celery?
heartbeat se dá v celery nastavit, pošlu ti naši konfiguraci, až ji najdu :-) V každém případě by kombinace Celery+RabbitMQ měla fungovat bez problémů, takto se to i běžně nasazuje na produkci.
Zkuste možná nějakou kombinaci těchto přepínačů
celery worker -P solo --concurrency=1 --prefetch-multiplier=128 -Ofair --without-gossip --without-mingle --without-heartbeat
pro začátek by to mělo pomoci alespoň s odladěním
Dík, snad to pomůže. Zkoušel jsem měnit i broker_heartbeat a broker_heartbeat_checkrate nahoru i dolů, ale pořád se to rozpadne.
Myslím, že ty bugy jsou tam dva: jednou request přijde workeru, ale nelze dostat odpověď zpět (zasekne se result.get()) a v druhém případě ani na worker nedorazí (task.delay() s zasekne a klient se snaží zuřivě připojit v cyklu donekonečna). Vypadá, že to nezávisí od nastavení heartbeatů.
to je zvlastni bug, ktery imho primo s Celery nebude souviset. Nesnazi se to pripojit treba pres jine sitove rozhrani nez localhost? Zkusil bych mozna pouzit ten Redis, hodit si tam logy na max a sledoval cvrkot po siti (ethereal).
já narazil asi před rokem na něco podobného a můj problém souvisel s tím, že tam něco nebylo thread-safe. ale už nevím, jestli to bylo na straně celery, nebo amqp klienta. tak jsem celery zahodil a vyřešil to jinak. :)
Dělá mi to i s nejjednodušší aplikací, třeba s tím součtem z tutorialu.
S redis je to zas bez problému.
Logy vždy ukazují heartbeat loss a pak případně zuřivé reconnecty.
tak to nevím.
ad heartbeaty: jak celery, tak rabbitmq mají vlastní mechanismy na heartbeaty. takže informace, že log ukazuje chybějící heartbeat moc nepomůže.
ad "zasekne se result.get()": celery komunikuje pomocí dvou mechanismů. jeden je message broker a druhý je result backend. výsledky se vrací skrz ten result backend. zkuste si nejdřív rozhodit práci s message brokerem, zkontrolovat, jestli se úlohy spouští a teprve potom řešit vracení výsledků.
a ještě mě napadlo: s celery se worker a klient, co se k workeru připojuje, spouští nezávisle. jdou nastavit různě.