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);
}
两条建议:
确认您的发布者没有复制消息。在 PublishSomeId
中添加一条日志语句,以查看 someId
值是什么。我怀疑可以多次调用此方法。除此之外,如果您没有看到重复记录,您可以启用重复检测。为此,您应该将 someId
分配给代理消息 MessageId
。不确定生成重复项的时间段是多少,但您可以进行试验。
如果#1 没有帮助,它可能是拓扑设置(实体)。检查没有什么比与粉丝回到同一主题的乐趣更时髦的了。
我一直在生产应用程序中使用 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);
}
两条建议:
确认您的发布者没有复制消息。在
PublishSomeId
中添加一条日志语句,以查看someId
值是什么。我怀疑可以多次调用此方法。除此之外,如果您没有看到重复记录,您可以启用重复检测。为此,您应该将someId
分配给代理消息MessageId
。不确定生成重复项的时间段是多少,但您可以进行试验。如果#1 没有帮助,它可能是拓扑设置(实体)。检查没有什么比与粉丝回到同一主题的乐趣更时髦的了。