2015-10-28 1 views
0

J'ai vérifié la partie "Durabilité du message" de RabbitMQ tutorial. Mais il a cette note:File d'attente vraiment durable dans RabbitMQ

Marquer les messages comme persistants ne garantit pas entièrement qu'un message ne sera pas perdu. Bien qu'il dise à RabbitMQ de sauvegarder le message sur le disque, il y a encore une petite fenêtre temporelle quand RabbitMQ a accepté un message et ne l'a pas encore enregistré. En outre, RabbitMQ ne fait pas fsync (2) pour chaque message - il peut être juste sauvé en cache et pas vraiment écrites sur le disque

Mais si je dois vraiment file d'attente durable? Quelles sont les meilleures pratiques que je peux utiliser? Dois-je avoir "queue" dans la base de données et un certain "resender" par cron si, par exemple, le message n'a pas été ACK dans 2 minutes? Y a-t-il de meilleures solutions?

En outre, que se passe-t-il si mon consommateur s'est brisé après avoir traité le message et avant il a envoyé ACK? UPD: ma question a été marquée comme "possible duplicate" de la question de clustering. Je ne sais pas comment les grappes peuvent aider à résoudre ces problèmes.

+0

http://stackoverflow.com/questions/29095990/rabbitmq-clustering – jpaljasma

+0

Que se passe-t-il si le cluster entier s'est bloqué? –

+0

La probabilité est très faible ... Pourtant, si vous êtes vraiment inquiet et n'avez pas besoin d'ACK au niveau de l'application, vous pouvez avoir votre propre file d'attente pour des situations comme celle-là. Selon l'application - peut-être une petite instance Redis installée sur le serveur web local + python/php via l'application cron/node.js pour pousser la file d'attente d'envoi après que RabbitMQ soit à nouveau disponible? – jpaljasma

Répondre

2

S'il vous plaît lire here à propos livraison garantie avec Tx

L'éditeur utiliserait quelque chose comme:

ch.txSelect(); 
ch.basicPublish("", QUEUE_NAME,MessageProperties.PERSISTENT_BASIC,"nop".getBytes()); 
ch.txCommit(); 

Note: Ceci peut tuer votre application de performance!

EDIT

Lire aussi "Editeur Confirme" https://www.rabbitmq.com/confirms.html comme suggesgted par @old_sound

+0

> Le mot clé ici est devrait, puisque le message peut encore être perdu si le courtier tombe en panne avant qu'il ait eu une chance d'écrire le message sur le disque. –

+0

Oui, et vous pouvez le gérer à partir de votre client, puisque la validation échoue – Gabriele

+1

vous n'aurez jamais une communication 100% fiable avec n'importe quel système. fin de l'histoire. planifier l'échec et construire un système qui gère les fautes les plus courantes et attendues. rabbitmq va tomber à un moment donné. Votre système doit savoir comment gérer cela. le plus souvent, ceci est géré avec le cache de messages en mémoire ou sur disque du côté de l'éditeur, en attente de la confirmation de l'envoi pour le retirer du cache local –