Pourquoi est-RabbitMQ pas la persistance des messages sur une semelle de file d'attente?
Je suis à l'aide de RabbitMQ avec Django, par le biais de Céleri. Je suis en utilisant le plus de la configuration de base:
# RabbitMQ connection settings
BROKER_HOST = 'localhost'
BROKER_PORT = '5672'
BROKER_USER = 'guest'
BROKER_PASSWORD = 'guest'
BROKER_VHOST = '/'
J'ai importé un Céleri tâche et en file d'attente pour exécuter un an plus tard. À partir de la iPython shell:
In [1]: from apps.test_app.tasks import add
In [2]: dt=datetime.datetime(2012, 2, 18, 10, 00)
In [3]: add.apply_async((10, 6), eta=dt)
DEBUG:amqplib:Start from server, version: 8.0, properties: {u'information': 'Licensed under the MPL. See http://www.rabbitmq.com/', u'product': 'RabbitMQ', u'version': '2.2.0', u'copyright': 'Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.', u'platform': 'Erlang/OTP'}, mechanisms: ['PLAIN', 'AMQPLAIN'], locales: ['en_US']
DEBUG:amqplib:Open OK! known_hosts []
DEBUG:amqplib:using channel_id: 1
DEBUG:amqplib:Channel open
DEBUG:amqplib:Closed channel #1
Out[3]: <AsyncResult: cfc507a1-175f-438e-acea-8c989a120ab3>
RabbitMQ reçu ce message dans le céleri file d'attente:
$ rabbitmqctl list_queues name messages durable
Listing queues ...
KTMacBook.local.celeryd.pidbox 0 false
celery 1 true
celeryctl_KTMacBook.local 0 true
...done.
J'ai ensuite tué RabbitMQ en appuyant sur control-C, suivi de 'a' à l'abandonner. Quand je lance le serveur et vérifiez à nouveau avec rabbitmqctl, il dit qu'il n'y a pas de messages dans le céleri file d'attente:
$ rabbitmqctl list_queues name messages durable
Listing queues ...
celery 0 true
celeryctl_KTMacBook.local 0 true
...done.
Le céleri file d'attente a été durable. Pourquoi les messages qui ne sont pas persisté? Que dois-je faire pour rendre les messages persistants?
OriginalL'auteur hekevintran | 2011-02-18
Vous devez vous connecter pour publier un commentaire.
Pour découvrir les messages
delivery_mode
vous pouvez le consommer et de regarder les propriétés du message:OriginalL'auteur asksol
De faire une file d'attente de durable n'est pas la même que la création de messages sur ce persistante. Durable les files d'attente de dire qu'ils viennent à nouveau automatiquement lorsque le serveur a redémarré - qui, à l'évidence qui s'est passé dans votre cas. Mais cela n'affecte pas les messages eux-mêmes.
De faire des messages persistants, vous devez également indiquer que le message est
delivery_mode
propriété à 2. Voir le classique de l'écriture jusqu'à Les lapins et les Warrens pour une explication complète.Edit: lien Complet est cassé, mais comme d'Déc 2013 vous pouvez toujours trouver le billet de blog de l'URL principale: http://blogs.digitar.com/jjww/
Est-il possible que je peux inspecter le message pour vérifier son mode de livraison?
Quelle est la version de Kombu utilisez-vous? (utilisé par de Céleri) Kombu 1.0.0 avait un bug où les messages delivery_mode n'a pas été correctement défini.
Je suis en utilisant le kombu-1.0.2, le céleri-2.2.2, et django_celery-2.2.2.
L'autre chose que vous voulez faire est d'utiliser des transactions / confirme. De cette façon, vous savez que le Lapin n'a pas seulement reçu le message, mais il a été envoyé sur le disque.
OriginalL'auteur Daniel Roseman
Vous pourriez avoir tout simplement faute de frappe d votre commentaire (dans l'un des autres réponses), mais juste au cas où: la ligne
ne pas définir la
delivery_mode
de la valeur, car==
compare deux nombres en Python, il est=
qui est en fait l'opérateur d'affectation. De sorte que la déclaration que vous citez comparedelivery_mode
à2
, puis jette leTrue
ou (plus probable)False
que les résultats. Pour une valeur, utilisez:OriginalL'auteur Brandon Rhodes