【问题标题】:How can I make the "Azure Service Bus" message be handled by a single server instance from the instance pool?如何使“Azure 服务总线”消息由实例池中的单个服务器实例处理?
【发布时间】:2021-01-15 22:57:41
【问题描述】:

我有一个在 Azure 应用服务中运行的 Asp.Net 核心 Web Api。 我还想制作一个定期浏览数据库的 BackgroundWorker。并且如果有必要的记录通过 Azure Bus 向 WebApi 发送消息,WebApi 应该在收到消息时向移动设备发送通知。

如果只有一个 WebApi 实例,则毫无疑问。但是启用了自动缩放。也就是说,在高负载的情况下,可能会有很多 WebApi。并且当 BackgroundWorker 发送消息时,会被多个服务接收,并重复重复发送通知给用户。

是否已经有在这种情况下使用的现成机制?消息的订阅者很多,他们都可以收到,但如果一个人收到了,其他人都不应该收到。

【问题讨论】:

  • 您使用的是服务总线队列还是主题?

标签: azure asp.net-core


【解决方案1】:

有两种接收模式:

  • 接收并删除
  • PeekLock

两者都适用于您的情况,因为第一个获取消息的消费者会得到它,而其他消费者将看不到它。

不同之处在于如果发生崩溃会发生什么。使用 ReceiveAndDelete 消息会丢失并且不会被处理。使用 PeekLock 取决于它在崩溃前的距离,消息可能会被处理两次。

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

【讨论】:

  • 不是只适用于队列吗?使用 Topic 时可以 ReceiveAndDelete 吗?
  • 是的,这适用于队列。主题用于向多个订阅者发送相同的消息。因此,要么您需要使用队列,要么为第一个读取消息的订阅者设置一些逻辑,说明他将要处理它。
  • 我明白了,谢谢。我只是以为有一个内置机制Topic + ReceiveAndDelete。所以我必须自己编造一些东西。
猜你喜欢
  • 2018-12-31
  • 2020-07-20
  • 2017-11-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多