HTTPリクエスト(Tornadoを使用)を受信して解析し、pikaを使用してRabbitMQブローカに送信するスクリプトを作成しています。3つのハートビートの後でPika接続が終了しました
コードは次のようになります。
def main():
conn_params = pika.ConnectionParameters(
host=BROKER_NAME,
port=BROKER_PORT,
ssl=True,
virtual_host=VIRTUAL_HOST,
credentials=pika.PlainCredentials(BROKER_USER, BROKER_PASS),
heartbeat_interval=HEARTBEAT_INTERVAL
)
conn = pika.BlockingConnection(conn_params)
channel = conn.channel()
# Create the web server which handles application requests.
application = tornado.web.Application([
(URL_BILLING, SomeHandler, dict(channel=channel))
])
# Start the server
application.listen(LISTENING_PORT)
tornado.ioloop.IOLoop.instance().start()
あなたが見ることができるように、私は単一の接続とチャンネルを開いて、作成されたハンドラの任意のインスタンスにチャネルを通過し、アイデアがトラフィックを保存することリクエストごとに新しい接続/チャンネルを開くのを避けてください。
問題は、3ハートビートの後に接続が閉じられていることです。私はWiresharkを使用して問題の原因を突き止めましたが、私が見ることができるのは、サーバーがPSH(私はこれがハートビートであると仮定しています)を送信し、スクリプトがACKで応答することです。この間にHEARTBEAT_INTERVALを3回実行すると、サーバーはFINを送信して接続が切断されます。
それはなぜ起こりますか?また、接続を開いたままにするか、送信する必要があるメッセージごとに新しいメッセージを作成する方がよいでしょうか?
ありがとうございました。
UPDATE:私はRabbitMQのログで見て、それは言う:私は、サーバーがクライアントにハートビートを送信することを意図していたと思ったMissed heartbeats from client, timeout: 10s
、それは答えることを確認し、そしてこれは、私はWiresharkのを使用して観察するものと一致することしかし、このログからは、それはサーバに報告することを目的としたクライアントであると思われ、クライアントは明らかに報告しません。私はこの権利を得ていますか?
更新日:それを分かりました。ブロッキング接続(私が使用したもの)は、うまくブロックされているので、ハートビートを送信できません。 this issueで説明したように、heartbeat_interval
パラメータはサーバーとの接続をネゴシエートするためにのみ使用されますが、クライアントは実際にハートビートを送信しません。これが事実なので、ピカとの長期的な関係を維持する最良の方法は何ですか?私はハートビートに10分ごとにheartbeat_interval
、サーバーの既定値を指定していないので、接続は将来の訪問者のための... 30分後に