我正在尝试评估Azure Service Bus是否符合我的要求。
我需要能够让多个客户端监听消息,但我想确保这些客户端中只有一个可以在任何给定时间处理消息。因此,当我想要在处理消息时锁定整个队列以进行读取时。 (该消息基本上是一个启动某些数据库聚合作业的信号)
因此,如果消息A到达并且客户端1开始处理它,那么如果消息B到达,我不希望客户端2开始处理它,除非客户端1已经完成。
我意识到我只能通过一个客户端监听来实现这一点。 我的另一个选择是查看实例id,只在实例id = 0时启动监听器,但我想知道是否有办法避免这个实例id特定的逻辑。
答案 0 :(得分:1)
您可以使用服务总线队列上的会话来实现此目的。从发件人的角度来看,您可以在每条消息上添加字符串SessionId属性,并指定它们属于哪个会话。在接收方,您调用AcceptMessageSession并基本上锁定整个会话。稍后为该会话显示的任何消息将仅传递给调用Receive的会话锁定的会话。其他客户端也可以在队列上调用AcceptMessageSession,但是如果所有消息都进入单个会话(都具有相同的sessionid),那么只有一个接收者会看到它。使用会话的示例可在此处获得: http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Session-41c43fb4
您描述的场景目的尚不明确,因此请查看Azure存储Blob租约等,因为它们可能会解决您需要的相同锁定语义。