【问题标题】:Sending Fault Messages to Topic Subscription Dead Letter Queue with Masstransit and Azure Service Bus使用 Masstransit 和 Azure 服务总线将故障消息发送到主题订阅死信队列
【发布时间】:2020-04-06 17:04:34
【问题描述】:

当主题的订阅者抛出异常时,未处理的消息将进入{subscribername}_error 队列。

举个例子:

const string subsriberName = "AnotherSubscriber";
cfg.SubscriptionEndpoint<AnotherThingHappened>(host, subsriberName, configurator =>
{
    configurator.Handler<AnotherThingHappened>(context =>
    {
        Console.WriteLine(context.Message.AnotherThingType);
        if (Random.NextDouble() < 0.1)
        {
            throw new Exception("Oups, I failed :(");
        }
        return Task.CompletedTask;
    });
});

它在主题 ObjectCreatedA 上创建了“AnotherSubscriber”订阅。但是当它失败时,消息会进入队列anothersubscriber_error。它使诊断、监控和重播消息变得更加困难。因为从 ASB 的角度来看,这只是一个普通的队列。

如何将故障路由到主题 ObjectCratedA/AnotherSubscriber 而不是 **_error one 的 DLQ?

提前致谢。

【问题讨论】:

  • 你不能,MassTransit 不是这样工作的。
  • 请问,为什么要这样设计?例如。如果我有一个监听 5 种类型事件的 WebJob,那么我需要创建 5 个具有唯一名称(如 WebJobType)的订阅端点,那么来自这些处理程序的错误将最终出现在一个非常混乱的队列中。我不能轻易地重播它们。
  • 那么为每种类型创建一个唯一的订阅名称?我不知道,这就是它的工作方式。如果您有更好的建议,我会全力以赴,但我不相信您可以将消息写入订阅 DLQ。

标签: masstransit


【解决方案1】:

现在从 MassTransit 6.2 开始可以实现,请参阅相关的 GitHub issue

您的配置现在需要如下所示:

cfg.SubscriptionEndpoint(
    "my-subscription",
    "my-topic",
    e =>
    {
        e.ConfigureConsumer<MyConsumer>(provider);
        // Send failures to built-in Azure Service Bus Dead Letter queue
        e.ConfigureDeadLetterQueueDeadLetterTransport();
        e.ConfigureDeadLetterQueueErrorTransport();
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-19
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多