我有一堆 celery 任务,它们获取结果并将它们发布到 RabbitMQ 消息队列。发布的结果可能会变得非常大(最多几兆)。关于在 RabbitMQ 消息中放入大量数据是否是一个好主意的观点参差不齐,但我在其他情况下看到了这种方法,只要控制内存,它似乎就可以工作。
但是,对于我当前的一组任务,rabbit 似乎只是在丢弃似乎太大的消息。我已将其简化为一个相当简单的测试用例:
#!/usr/bin/env python
import string
import random
import pika
import os
qname='examplequeue'
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='mq.example.com'))
channel = connection.channel()
channel.queue_declare(queue=qname,durable=True)
N=100000
body = ''.join(random.choice(string.ascii_uppercase) for x in range(N))
promise = channel.basic_publish(exchange='', routing_key=qname, body=body, mandatory=0, immediate=0, properties=pika.BasicProperties(content_type="text/plain",delivery_mode=2))
print " [x] Sent 'Hello World!'"
connection.close()
我有一个 3 节点的 RabbitMQ 集群,以及mq.example.com
每个节点的循环。客户端在 Ubuntu 12.04 上使用 Pika 0.9.5,RabbitMQ 集群在 Erlang R14B04 上运行 RabbitMQ 2.8.7。
执行此脚本会打印 print 语句并退出,不会引发任何异常。该消息永远不会出现在 RabbitMQ 中。
更改N
为10000
使其按预期工作。
为什么?