如何避免Windows Azure队列中的竞争条件

时间:2014-03-13 07:10:39

标签: azure azure-storage

我们有一个Queue和多个具有相同辅助角色的实例,用于读取队列中的消息。每条消息的处理速度非常快。我们如何避免两个实例在完全相同的时间点尝试从队列中读取相同消息的情况。

2 个答案:

答案 0 :(得分:6)

如果您遵循“读取 - 删除”模式,则多个客户端同时访问Azure存储队列时不会出现任何问题:

  

邮件不会自动从队列中删除,但在检索完邮件后,在visibilitytimeout参数指定的时间间隔内,其他客户端无法看到该邮件。

来源:http://msdn.microsoft.com/en-us/library/windowsazure/dd179474.aspx

队列的性质要求队列头部的每个操作都必须是原子的。在队列作为服务的情况下,如果多个客户端可能执行导致重叠读取的并发操作,则队列将完全无法使用。

答案 1 :(得分:2)

Windows Azure Queues支持2种机制来读取队列中的消息 - GetPeek。为了避免竞争条件,建议使用Get机制读取消息,就像使用Get读取消息时一样,消息对其他调用者(在您的情况下为工作者角色实例)不可见因此,只有一个实例能够读取和处理消息。