我们在 Azure 服务总线上遇到了一些奇怪的行为,除了 Azure 中的一些错误之外,我们无法弄清楚如何解释。这就是发生的事情:
- 我们已向 Azure 服务总线发送过一次消息
- 发送消息的调用执行时间略长于一分钟,但仍然成功,并且此后消息收到良好
- 出现了重复的消息
EnqueuedTimeUtc
大约半秒后SequenceNumber
与第一条消息不同,但内容相同并且MessageId
我们生成的
现在我们相当确定我们只打过一次电话SendMessage
因为我们在此之前记录了所有收到的消息。
我们也不认为这是客户端库执行此操作,因为在总线上出现的这两条消息之间还发送了其他消息,并且我不认为客户端库在允许其他消息通过的同时在后台执行此操作。但并不能 100% 确定这一点。这是我们发现发生的事情:
- 第一条消息已发送
- 完成操作大约需要 63 秒
- 之后发送一些其他消息
- 第一条消息发送后大约 30 秒,会出现一条重复消息(至少根据 EnqueuedTime)。
所以问题是:有人经历过类似的事情吗?这可能是 Azure 本身的错误/时间问题吗?他们有任何保证不会发生这种情况吗?由于通话时间超过一分钟,我怀疑当时 Azure 中发生了某些事情,可能导致了这种情况(例如更新或类似的事情)
这种情况可能会发生,而且是“正常”的。服务总线 SDK 具有内部自动重试策略来克服暂时性错误。因此,如果第一次尝试成功,但由于网络问题导致响应丢失,它将重试并有效地传递消息两次。
客户端或网络级别可能会提前发生错误,并且已发送的消息可能会被提交到队列中,但确认未成功返回给客户端。这种情况使客户端对发送操作的结果产生疑问。
要解决此问题,您可以启用重复检测 https://learn.microsoft.com/en-us/azure/service-bus-messaging/duplicate-detection有一定的间隔。这将防止在该时间间隔内发送重复的消息 ID。
有一个缺点:
请注意,启用重复检测和窗口大小会直接影响队列(和主题)吞吐量,因为所有记录的消息 ID 必须与新提交的消息标识符相匹配。
理想情况下,您将拥有幂等接收器,这意味着它已准备好进行重复。但这并不总是可行/方便。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)