代码之家  ›  专栏  ›  技术社区  ›  Ilya Chernomordik

Azure服务总线是否可能创建了消息的副本?

  •  1
  • Ilya Chernomordik  · 技术社区  · 6 年前

    我们在Azure服务总线中遇到了一些奇怪的行为,除了Azure中的一些bug之外,我们无法解释这些行为。事情是这样的:

    1. 我们曾经向Azure服务总线发送过一条消息
    2. 执行发送消息的调用花费了略长于一分钟的时间,但还是成功了,消息在这之后就可以正常接收了
    3. EnqueuedTimeUtc SequenceNumber 这与第一条消息不同,但内容和内容相同 MessageId 我们创造的

    SendMessage

    我们也不认为这是客户端库做的,因为在总线上出现的这两条消息之间发送了其他消息,我不认为客户端库在后台做这件事,同时允许其他人通过。但不是100%确定。以下是我们发现的情况:

    1. 操作需要约63秒才能完成
    2. 之后会发送一些其他消息
    3. 在发送第一条消息大约30秒后,会出现一个重复的消息(至少根据EnqueuedTime)。

    所以问题是:有没有人经历过类似的事情,这可能是Azure本身的bug/暂时性问题,他们有没有保证不会发生这种情况?由于通话时间超过一分钟,我怀疑当时Azure中有什么东西可能导致了通话(例如更新或类似情况)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mikhail Shilkov    6 年前

    这种情况可能发生,而且有点“正常”。Service Bus SDK具有内部自动重试策略以克服暂时性错误。因此,如果第一次尝试成功,但由于网络问题导致响应丢失,它将再次尝试,并有效地传递消息两次。

    要解决此问题,可以启用 Duplicate Detection 有一段时间。这将防止在该间隔内发送重复的消息ID。

    有一个缺点:

        2
  •  1
  •   Ranjith Eswaran    6 年前

    我认为您的消息发送应用程序在向服务总线消息发送消息时遇到了一些错误或延迟实体。所以呢它已重试发送具有相同消息Id但序列号不同的相同消息。

    属性以防止接收队列中消息的重复副本,即具有相同消息ID的消息。通过使用预定义的时间间隔设置重复检测时间历史记录来启用队列的重复检测属性时,队列中只有一条具有相同消息Id的消息可用,并且具有重复消息Id的消息将丢失。

    您可以通过使用重复检测属性来避免问题,还可以向服务总线队列或主题发送具有自定义消息Id的消息。