4

Ruby で AMQP に基づくメッセージング システムを構築しています。ただし、エラー処理に問題があります。

安全な例外のホワイトリストを維持しており、RabbitMQ のメッセージは確認されずに別のワーカーによって再試行される可能性があります。ただし、不明または予期しないエラーの場合、ワーカーがメッセージを何度試行しても、常に同じエラーが発生すると想定しています。

つまり、不明なエラーが発生した場合は、それをキャプチャしてどこかに記録し (現在は MySQL)、ACKRabbitMQ に呼び出しを送信してキューからメッセージを削除する必要があります。

現在、すべてが EventMachine でイベント化される amqp gem を使用して構築されています。これにより問題が発生し、メソッドが呼び出されますが、gem の非同期動作のおかげで、RabbitMQ に送信された#ackわけではありません。ACK

以前、私はこの問題を回避するために、raise コードを .xml 内に大雑把に配置しましたEM.next_tick。ここで、パフォーマンスのために各 Ruby ワーカーをマルチスレッド化する必要がありますが、next_tick機能しません。

要するに:

amqp gem 内で非同期 ACK 呼び出しの直後に特定のコードを同期的に実行するにはどうすればよいでしょうか? コールバックがあればいいのですが、利用できるものはありません。少なくとも、深刻な悪意のあるモンキー パッチを適用しない限りはそうではありません。

4

1 に答える 1

2

喜んで修正させていただきますhttps://github.com/ruby-amqp/amqp/issues/issue/9現時点では、gem は正常な非同期ライブラリとして動作せず、コールバックが欠落しています多くの場所で。この問題の修正に取り組んでいます。今日リリースする 0.7 までに修正しようと思います。

于 2011-01-17T12:46:20.973 に答える