Azure Service Bus 专题:为什么会造成消息重复?

Azure Service Bus Topic: Why is message duplication caused?

我一直在生产应用程序中使用 Azure 服务总线主题。我的理解是系统保证消息发布时订阅端至少有一份。

在实践中,我通常看到 1 条消息对应一个发布。在某些退化的情况下,尽管我看到了倍数。例如:1 个发布对应于相关订阅中的 ~20 条消息。目前没有任何东西消耗这个订阅,这让我相信这是发布逻辑。

在什么情况下会大量复制消息?我想网络干扰可能会导致这种情况。还有什么?

请注意,默认的重复处理逻辑无法处理此问题。您将拥有多条具有相同正文和不同消息 ID 的消息——据我所知,这些消息用于建立消息 "identity".

编辑: 我的发布逻辑非常简单,类似于以下内容:

public void PublishSomeId(Guid someId, int eventDelayInMinutes, string componentName)
        {
            var topicClient = ServiceBusManager.GetTopicClient();

            var message = new BrokeredMessage(someId);
            message.To = componentName;
            message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(eventDelayInMinutes);
            topicClient.Send(message);
        }

两条建议:

  1. 确认您的发布者没有复制消息。在 PublishSomeId 中添加一条日志语句,以查看 someId 值是什么。我怀疑可以多次调用此方法。除此之外,如果您没有看到重复记录,您可以启用重复检测。为此,您应该将 someId 分配给代理消息 MessageId。不确定生成重复项的时间段是多少,但您可以进行试验。

  2. 如果#1 没有帮助,它可能是拓扑设置(实体)。检查没有什么比与粉丝回到同一主题的乐趣更时髦的了。