RabbitMQ には、メッセージが処理されたというクライアントからの確認応答にタイムアウトがありません。この投稿を参照してください(スレッド全体が興味深いかもしれません)。投稿からのいくつかの顕著な点:
サブスクリプションと「プル」の AMQP ack モデルは同じです。どちらの場合も、メッセージはサーバーに保持されますが、確認応答される (および削除される) か、応答拒否される (basic.reject を使用。ただし、RabbitMQ はそれを実装していません)、または channel/接続が閉じられます (その時点で、メッセージは他のコンシューマーが利用できるようになります)。
そして(私の強調)
ack の待機にタイムアウトはありません。通常、これは問題ではありません。
なぜなら、ACK が見つからないという一般的なケース (ネットワークまたはクライアントの障害) では、接続が切断される(したがって、上記の動作が引き起こされる) ためです。それでも、タイムアウトは、たとえば、生きているが応答しないコンシューマーに対処するのに役立ちます。それは以前に議論に出てきました。そのような機能を必要とする具体的なユースケースはありますか?
この問題が発生している可能性があります。クライアント プル モデルでは、サーバーが切断された接続を検出するのが (生きているが応答しないコンシューマーとは対照的に) 難しいためです。
更新: Linux では、SIGTERM および/または SIGKILL および/または SIGINT のシグナル ハンドラーをアタッチし、うまくいけば、クライアントから正常な方法で接続を閉じることができます。Windows では、タスク マネージャーを閉じると Win32 TerminateProcess
API が呼び出されると思います。これについて MSDN は次のように述べています。
プロセスが によって終了された場合、プロセス
TerminateProcess
のすべてのスレッドはすぐに終了し、追加のコードを実行する機会はありません。これは、スレッドが終了ハンドラ ブロックでコードを実行しないことを意味します。さらに、アタッチされた DLL には、プロセスがデタッチ中であることが通知されません。
これは、終了を見つけて整然と閉鎖することが難しい可能性があることを意味します。
ACK タイムアウトの独自のユースケースを使用して、RabbitMQ リストを追求する価値があるかもしれません。