【问题标题】:Azure Service Bus Topic: Why is message duplication caused?Azure 服务总线主题:为什么会导致消息重复?
【发布时间】:2017-01-24 21:06:58
【问题描述】:

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

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

什么情况下会出现重复消息泛滥?我想网络干扰可能会导致这种情况。还有什么?

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

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

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);
        }

【问题讨论】:

  • 回答这个问题需要更多细节。你的发布逻辑是什么?如果您使用不同的 ID 发布相同的有效负载 20 次,那么是的,您将拥有该事件的 20 个“副本”。你的拓扑是什么样的?如果没有这些信息的回答,这是非常猜测。
  • 我已编辑问题以添加与我的实际实现非常相似的代码示例。有趣的是,我看到了大约 20 条正文为“someId”的消息。在日志的帮助下,我知道这个方法只被 'someId' 调用过一次。
  • 确实,没什么特别的。您在该主题下的主题设置是什么?
  • 我有一个主题下有 10 个订阅。
  • 我明白了。但是,您的设置中的某些内容有所不同。发件人很简单。接收器也是如此。缺少拓扑。需要看看。在 gmail 的电子邮件 lastname.firstname 上联系我。

标签: azure azure-servicebus-topics


【解决方案1】:

两个建议:

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

  2. 如果 #1 没有帮助,它可能是拓扑设置(实体)。看看有没有什么比粉丝回到同一个话题更有趣的了。

【讨论】:

  • 我已将此答案标记为已接受,因为它提供了一些洞察我可以采取的后续步骤来追踪此问题。感谢您解释导致重复发生的原因的其他答案。
  • @ArxoClay 你找到重复的来源了吗?
  • 我们发现了一个重复来源。我怀疑那里可能还有更多。我们发现的一个来源是这样的:如果您在更新订阅的同时仍在处理订阅上的消息,它似乎会影响当前正在从该订阅处理的消息的锁定。我们有这种将消息“放回”订阅的模式(轮询场景),因此在我们的案例中,原始案例无法“完成”,并且我们的代码在订阅中放置了副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2012-08-22
  • 2014-05-16
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多