【问题标题】:Temporarily suspend : Azure Service bus Message Queue暂时挂起:Azure 服务总线消息队列
【发布时间】:2019-03-27 19:16:21
【问题描述】:

我们正在使用 Azure 服务总线消息队列来处理在第三方 API 上执行的一些操作,我们遇到第三方 API 已关闭的问题,我们要做的是暂时挂起队列,以便我们可以保留消息直到第三方服务重新开始工作,或者有其他方法可以保留消息以便我们再次重新处理它们。

【问题讨论】:

  • 描述令人困惑。拥有队列的全部意义在于解耦和加载级别。如果第 3 方遇到问题,消息将保留在队列中,您无需执行任何操作。如果不是这种情况,您应该添加更多详细信息来说明问题所在。
  • 问题是天蓝色函数获取消息并开始处理它,但第三方 api 已关闭,因此消息被消耗但没有有效地得到我们想要的结果我们应该在第三方 api 时再次发送相同的消息又起来了。
  • 您是否控制接收消息并调用第 3 方的函数?
  • @SeanFeldman 我们可以控制处理队列中消息的函数。
  • 在这种情况下,禁用 Azure Function 似乎是一种合适的方法。我会添加一个答案。

标签: message-queue azureservicebus fault-tolerance


【解决方案1】:

队列、主题和订阅可以暂时挂起。挂起将实体置于禁用状态,所有消息都保存在存储中。但是,不能删除或添加消息,并且相应的协议操作会产生错误。

可以由用户或系统执行暂停或重新激活。系统仅因严重的行政原因(例如达到订阅支出限制)而暂停实体。系统禁用的实体无法由用户重新激活,但在解决暂停原因后会恢复。

在门户中,各个实体的Properties 部分可以更改状态;以下屏幕截图显示了队列的切换: 注意:门户只允许完全禁用队列(队列被暂停)。

更多详情,您可以关注article

【讨论】:

  • 我们希望在我们的第三方 API 关闭后立即禁用队列,我们​​会禁用队列并在它再次启动时启用它。
【解决方案2】:

根据 cmets,调用 3rd 方 API 的 Azure 函数可能会失败。在这种情况下,disabling Azure Function 可能是一种更简单的方法 - 没有处理尝试,没有消息重试,没有更改 Azure 服务总线命名空间/实体。一旦您确信可以重新启用 Azure Function,消息将再次得到处理。

【讨论】:

  • 为了做到这一点,有人必须监视第三方 API 并手动停止我们想要以编程方式处理此场景的 azure 函数,Azure 函数是否有办法暂时禁用队列直到第三派对复活并再次启用?
  • 禁用队列或函数将需要一个带有逻辑的附加组件。无论哪种方式,它都不是“坐视然后行动”,而是自动监控/探测。对于第 3 方,它可能是一个 ping。或者,您可以设置监控一段时间内队列大小的增加/减少,以调用另一个可以启用/禁用您的函数或队列的函数。
【解决方案3】:

您可以将队列状态更新为 ReceiveDisabled。这将有助于停止 Azure 函数触发器。

Service Bus Suspension States

【讨论】:

    【解决方案4】:

    在服务总线队列上使用 PeekLock 模式。

    这样您就可以在将消息从队列中删除之前获取并开始处理它。如果第 3 方不可用,您可以调用 AbandonAsync,它将消息放回队列中。如果第 3 方离线时间过长,您的消息应该最终进入某个死信队列,您可以从那里将消息移回原始队列,以便再次处理它们。

    更多详情:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-queues-topics-subscriptions

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 2014-11-03
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2016-02-06
      相关资源
      最近更新 更多