RabbitMQ プロデューサーを使用して、実行時間の長いタスク (30 分以上) をコンシューマーに送信しています。問題は、サーバーへの接続が閉じられ、未確認のタスクが再度キューに入れられたときに、コンシューマーがまだタスクを処理していることです。
調査の結果、ハートビートまたは接続タイムアウトの増加を 使用してこれを解決できることがわかりました。これらのソリューションはどちらも、試行時にエラーを発生させます。同様の投稿への回答を読んで、回答が投稿されてから多くの変更がRabbitMQに実装されたことも知りました(たとえば、RabbitMQ 3.5.5より前のデフォルトのハートビートタイムアウトは580から60に変更されました)。
ハートビートおよびブロックされた接続のタイムアウトを指定する場合:
credentials = pika.PlainCredentials('user', 'password')
parameters = pika.ConnectionParameters('XXX.XXX.XXX.XXX', port, '/', credentials, blocked_connection_timeout=2000)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
次のエラーが表示されます。
TypeError: __init__() got an unexpected keyword argument 'blocked_connection_timeout'
接続パラメーターで指定するheartbeat_interval=1000
と、同様のエラーが表示されます。TypeError: __init__() got an unexpected keyword argument 'heartbeat_interval'
同様にsocket_timeout = 1000
、次のエラーが表示されます。TypeError: __init__() got an unexpected keyword argument 'socket_timeout'
Ubuntu 14.04 で RabbitMQ 3.6.1、ピカ 0.10.0、および python 2.7 を実行しています。
- 上記のアプローチでエラーが発生するのはなぜですか?
- 長時間実行される継続的なタスクがある場合、ハートビート アプローチを使用できますか? たとえば、30 分以上かかる大規模なデータベース結合を実行するときにハートビートを使用できますか? データベース結合などのタスクにかかる時間を判断するのは難しい場合が多いため、私はハートビート アプローチを支持します。
同様の質問への回答を読みました
更新:ピカのドキュメントからコードを実行すると、同じエラーが発生します。