0

私が本当にやろうとしているのは、現在の消費者によって拒否された場合に備えて、メッセージをキューに残すことです。RabbitMQ では、これを達成するために NACK を送信できます。NACK は EasyNetQ でサポートされていますか? 私が探している動作を達成する別の方法はありますか?

更新: 多くの応答はありません。そのため、EasyNetQ での NACK の欠如を一般的にどのように処理しているのか疑問に思っています。basic.reject消費者を「すべてのメッセージをいつでも処理できる」シナリオに制限するのと同等のものを持たないこと。コンシューマーが特定の「拒否された」例外をスローして、EasyNetQ がメッセージをエラー キューにデキューし、それらのエラーを含むメッセージを再度キューに入れることができると思います。他に他の回避策を講じている人はいますか?

4

3 に答える 3

4

私はほぼ 1 年間 EasyNetQ を使用しましたが、どのように調整しても (とりわけ、独自の の実装を追加しましたIConsumerErrorStrategy)、思い通りに動作することはありませんでした。シングル スレッドであるためRequestAsyncSubscribeAsyncハンドラー内で実行すると、予期しない動作 (デッドロックが発生することもある) が発生しました。

私たちにとっての解決策は、EasyNetQ から移行することでした。公式の RabbitMq クライアントをしばらく使用した後、その上に超シンクライアントを作成するのに数日を費やしました。これは EasyNetQ の影響を受けており、EasyNetQ が持つほとんどの概念をサポートしています。ただし、プラグイン可能なメッセージ コンテキストなどの優れた機能をいくつか追加しました。私がIAdvancedMessageContext追加したばかりの Nack 機能は、あなたにとって何かになると思います:

var client = service.GetService<IBusClient<AdvancedMessageContext>>();
client.RespondAsync<BasicRequest, BasicResponse>((req, ctx) =>
{
  ctx?.Nack(); // the context implements IAdvancedMessageContext.
  return Task.FromResult<BasicResponse>(null);
}, cfg => cfg.WithNoAck(false));

興味がある場合は、 Github ページ(特に)で詳細を読むことができますNackTests.cs

于 2015-11-14T21:58:55.010 に答える