結果を受け取ってRabbitMQメッセージキューに投稿するセロリタスクがたくさんあります。投稿される結果は非常に大きくなる可能性があります (最大で数メガ)。RabbitMQ メッセージに大量のデータを入れることが良いアイデアかどうかについては意見が分かれていますが、私は他の状況でこの作業を見てきました.メモリが制御されている限り、うまくいくようです.
しかし、私の現在の一連のタスクでは、うさぎは大きすぎると思われるメッセージをドロップしているようです。私はそれをかなり単純なテストケースに減らしました:
#!/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
と、期待どおりに動作します。
なんで?