Warum ist RabbitMQ nicht persistenten Nachrichten auf einem dauerhaften Warteschlange?
Ich bin mit RabbitMQ mit Django durch Sellerie. Ich bin mit dem meisten basic-setup:
# RabbitMQ connection settings
BROKER_HOST = 'localhost'
BROKER_PORT = '5672'
BROKER_USER = 'guest'
BROKER_PASSWORD = 'guest'
BROKER_VHOST = '/'
Ich importierte eine Sellerie Aufgabe und in der Warteschlange und es laufen ein Jahr später. Aus der 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 diese Nachricht erhalten, in der Sellerie-Warteschlange:
$ rabbitmqctl list_queues name messages durable
Listing queues ...
KTMacBook.local.celeryd.pidbox 0 false
celery 1 true
celeryctl_KTMacBook.local 0 true
...done.
Ich dann getötet RabbitMQ durch drücken von control-C, gefolgt von 'a' zum Abbrechen. Wenn ich den server wieder starten, und überprüfen Sie es mit rabbitmqctl, es sagt, dass es keine Nachrichten in der Sellerie-Warteschlange:
$ rabbitmqctl list_queues name messages durable
Listing queues ...
celery 0 true
celeryctl_KTMacBook.local 0 true
...done.
Sellerie queue langlebig. Warum wurden die Nachrichten nicht gespeichert? Was muss ich tun, damit die Nachrichten persistent?
InformationsquelleAutor hekevintran | 2011-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um herauszufinden, die Nachrichten
delivery_mode
können Sie verbrauchen, und betrachten Sie die Eigenschaften der Nachricht:InformationsquelleAutor asksol
Machen eine Warteschlange langlebig ist nicht dasselbe wie machen die Nachrichten, auf die es beharrlich. Dauerhafte Warteschlangen bedeutet, Sie kommen automatisch wieder, wenn der server neu gestartet wurde - das hat offensichtlich passiert in deinem Fall. Aber dies betrifft nicht die Nachrichten selbst.
Machen Nachrichten persistent, müssen Sie auch markieren Sie die Nachricht
delivery_mode
- Eigenschaft auf 2. Siehe die klassische Zuschreibung Kaninchen und Warrens für eine vollständige Erklärung.Edit: Vollständigen link ist defekt, aber als der Dezember 2013 könnte man immer noch finden Sie den blog-post von der Haupt-URL: http://blogs.digitar.com/jjww/
Gibt es eine Möglichkeit, die ich überprüfen können, die Nachricht zu überprüfen, die Lieferung Modus?
Welche version von Kombu verwenden Sie? (mit Sellerie) Kombu 1.0.0 hatte einen Fehler, bei dem Nachrichten delivery_mode war nicht richtig eingestellt.
Ich bin mit kombu-1.0.2 -, Sellerie-2.2.2, und django_celery-2.2.2.
Die andere Sache, die Sie tun möchten, verwenden Transaktionen / bestätigt. Auf diese Weise wissen Sie sicher, dass die Kaninchen nicht nur die Nachricht erhalten, aber es wurde geschickt auf die Festplatte.
InformationsquelleAutor Daniel Roseman
Haben Sie vielleicht einfach nur die typo würde dein Kommentar (mehr in einer der anderen Antworten), aber nur für den Fall: die Linie
tut nicht legen Sie die
delivery_mode
Wert, weil==
vergleicht zwei zahlen in Python; es ist=
was ist eigentlich der Zuweisungsoperator. Also die Aussage, die Sie zitieren, vergleichtdelivery_mode
zu2
, und dann wirft Sie Weg, dieTrue
oder (wahrscheinlich)False
dass die Ergebnisse. Um tatsächlich einen Wert festzulegen, verwenden Sie:InformationsquelleAutor Brandon Rhodes