Ruby で AMQP に基づくメッセージング システムを構築しています。ただし、エラー処理に問題があります。
安全な例外のホワイトリストを維持しており、RabbitMQ のメッセージは確認されずに別のワーカーによって再試行される可能性があります。ただし、不明または予期しないエラーの場合、ワーカーがメッセージを何度試行しても、常に同じエラーが発生すると想定しています。
つまり、不明なエラーが発生した場合は、それをキャプチャしてどこかに記録し (現在は MySQL)、ACK
RabbitMQ に呼び出しを送信してキューからメッセージを削除する必要があります。
現在、すべてが EventMachine でイベント化される amqp gem を使用して構築されています。これにより問題が発生し、メソッドが呼び出されますが、gem の非同期動作のおかげで、RabbitMQ に送信された#ack
わけではありません。ACK
以前、私はこの問題を回避するために、raise コードを .xml 内に大雑把に配置しましたEM.next_tick
。ここで、パフォーマンスのために各 Ruby ワーカーをマルチスレッド化する必要がありますが、next_tick
機能しません。
要するに:
amqp gem 内で非同期 ACK 呼び出しの直後に特定のコードを同期的に実行するにはどうすればよいでしょうか? コールバックがあればいいのですが、利用できるものはありません。少なくとも、深刻な悪意のあるモンキー パッチを適用しない限りはそうではありません。