2015-12-14 12 views
7

Ho letto molti (grandi) articoli sull'integrazione di RabbitMQ in un'applicazione Symfony.Symfony: dovrei aggiungere il comando rabbitmq: consumer a crontab?

Il RabbitMqBundle lo rende molto facile da ingrato esso, e fornisce il comodo rabbitmq:consumer comando per consumare messaggi da una coda simile a questo:

app/console rabbitmq:consumer -m 50 upload_picture 

Ho una domanda però. Dovresti raccomandare di aggiungere questo comando a crontab? Ci sono delle migliori pratiche al riguardo?

+1

Una nota a margine -m 50 non è affidabile tutto il tempo. Ad esempio, se hai qualche metodo in coda di tanto in tanto, avrai problemi con le connessioni perse. Succede a causa di un lungo periodo di inattività. Meglio limitare il tempo effettivo in cui il comando funziona. Il timeout di tutte le connessioni potrebbe essere limitato a questo limite. Il consumatore lavora per 1 ora ed esce quindi il timeout può essere impostato su 1 ora e 20 minuti. Questo è qualcosa che manca a bundle di rabbitmq ma è disponibile in enqueue bundle (opzione --limit-time = "now + 1 hour"). –

risposta

6

Il metodo più accettato è quello di mantenere il vostro utente in esecuzione. Ci sono strumenti come Supervisor e Circus che possono aiutarti in questo. Vedi this discussion. Ma se riesci a far uscire il tuo consumatore quando non ci sono più messaggi, puoi usare anche cron. Sebbene ciò potrebbe causare un ritardo nel consumo dei messaggi. Non puoi reagire immediatamente ai messaggi. Gli utenti potrebbero dover attendere un minuto prima che venga avviata qualsiasi attività o che la posta sia ricevuta.

Si prega di prendere in considerazione quanto segue quando si esegue il vostro consumatore (o qualsiasi codice PHP per questo) per un lungo periodo:

cercare di evitare l'accumulo di utilizzo della memoria. Non continuare ad accodare gli array senza mai cancellarli. Ciò significa ad esempio che non si dovrebbe usare FingersCrossedHandler in Monolog poiché mantiene un buffer di messaggi di registro. Va bene per una singola richiesta, non per un dayworth dei messaggi di debug.

Anche quando si presta attenzione, PHP potrebbe perdere memoria. Cosa puoi dire, PHP ... (Questo potrebbe essere davvero uno slogan) Nella mia situazione ho un cronjob installato che riavvia i lavoratori ogni notte, ma in teoria i consumatori potrebbero correre circa un mese prima che finiscano la memoria.

+5

Grazie per la risposta. Questo è esattamente ciò che stavo cercando perché non è mai stato menzionato nel RabbitMQ per i tutorial di Symfony. Sembra che ci sia un interessante bundle Symfony per gestire la configurazione automatica di Supervisord per RabbitMQBundle: https://github.com/Phobetor/rabbitmq-supervisor-bundle –

+1

Il link di problema in "questa discussione" è disattivato. – Cassiano

+1

Eviterei il bundle menzionato nel primo commento che ha problemi reali di affidabilità. –

Problemi correlati