首页 > 解决方案 > 如何使“Azure 服务总线”消息由实例池中的单个服务器实例处理?

问题描述

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

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

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

标签: azureasp.net-core

解决方案


有两种接收模式:

  • 接收并删除
  • 偷看锁

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

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

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


推荐阅读