【问题标题】:Configure Deduplication on Azure Service Bus Queue with MassTransit使用 MassTransit 在 Azure 服务总线队列上配置重复数据删除
【发布时间】:2020-09-19 01:50:16
【问题描述】:

我发现以下问题 (How to configure the RequiresDuplicateDetection for AzureServiceBus topics) 是关于在 MassTransit 中从生产者应用程序配置发布主题时如何设置 RequiresDuplicationDetection 属性的。但是,对于使用Send 而不是Publish 传输到队列的命令,我无法找到如何执行此操作。

此外,我发现在配置相关队列的消费者时,我可以轻松设置属性,如下所示。但是,这对于我的用例来说并不理想,如果可能的话,我更希望生产者在启动并创建队列时设置此属性。

cfg.ReceiveEndpoint(queue, e =>{
  e.RequiresDuplicateDetection = true;
  e.ConfigureConsumer<JobEventConsumer>(registrationContext, consumerConfig =>{
    consumerConfig.UseMessageRetry(r =>{
      r.Interval(10, TimeSpan.FromMilliseconds(200));
      r.Ignore<ValidationException>();
    });
  });
});

更新:经过更多调查,我还发现在全局配置级别将属性设置为 true 似乎也不起作用。代码如下所示

class Program {
  static async Task Main(string[] args) {
    EndpointConvention.Map<ExtractionRequest>(new Uri("queue:test-queue"));
    var busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>{
      cfg.Host("My connection string");
      cfg.RequiresDuplicateDetection = true;
      cfg.EnablePartitioning = true;
    });

    await busControl.StartAsync();
    try {
      do {
        string value = await Task.Run(() =>{
          Console.WriteLine("Enter message (or quit to exit)");
          Console.Write("> ");
          return Console.ReadLine();
        });

        if ("quit".Equals(value, StringComparison.OrdinalIgnoreCase)) break;

        await busControl.Send<ExtractionRequest>(new {});
      }
      while (true);
    }
    finally {
      await busControl.StopAsync();
    }
  }

}

public interface ExtractionRequest {}

欢迎任何关于如何从生产者那里为队列打开 RequiresDuplicationDetection 的建议。

提前致谢,詹姆斯。

【问题讨论】:

    标签: c# masstransit


    【解决方案1】:

    您不能从消息发送方设置队列属性,这是接收端点的责任。

    接收端点是负责的组件,因为它声明了队列和相关属性。

    发布不同的原因是因为主题可以由生产者配置,因为单个主题可能有多个消费者订阅。

    【讨论】:

    • 假设您有两个 Web 应用程序 - A 和 B,您在 B 中配置具有重复检测和使用者的接收端点。您从 A 生成消息。部署后 - A 启动并启动发送消息,但 B 尚未启动。因为您无法从发件人配置重复检测,所以您现在有一个没有重复检测的队列,因为 B 在创建后无法更改它。从您的角度来看,这是疏忽还是按预期工作?
    • 这是现实,并且正在按预期工作。您应该在部署使用它们的客户端之前部署您的服务。这是一种显而易见的常识。如果这不适合您,您始终可以在部署之前自己创建消息传递实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2021-12-15
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多