Azure队列 - 我可以验证邮件只读一次吗?

时间:2012-11-28 09:12:31

标签: azure azure-storage azure-storage-queues

我正在使用Azure队列,并且从队列中读取了几个不同的进程 我的系统构建方式假定每条消息只读一次 此Microsoft article声明Azure队列具有至少一次传送保证,这可能意味着两个进程可以从队列中读取相同的消息。
StackOverflow thread声明如果我使用 GetMessage ,则该消息对于隐身超时的所有其他进程都不可见。

假设我使用 GetMessage()并且在 DeleteMessage 之前从未超过消息不可见时间,我可以假设我只会收到每条消息一次吗?

3 个答案:

答案 0 :(得分:9)

我认为队列消息中有一个名为DequeueCount的属性,它是此消息已出队的次数。它由队列服务维护。我认为您可以使用此属性来确定您的消息之前是否已被阅读过。

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storageclient.cloudqueuemessage.dequeuecount.aspx(存储客户端1.7)

http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.queue.cloudqueuemessage.dequeuecount.aspx(存储客户端2.0)

答案 1 :(得分:7)

没有。可能发生以下情况:

  • 的GetMessage()
  • 在数据库中添加一些记录......
  • 生成一些文件......
  • DeleteMessage() - >意外故障(崩溃的进程,重新启动的实例,网络连接问题,......)

在这种情况下,您的逻辑在不调用DeleteMessage的情况下执行。这意味着,一旦隐身超时到期,消息将出现在队列中并再次处理。您需要确保您的流程为idempotent

  幂等是数学和数学中某些运算的属性   计算机科学,他们可以多次应用而无需   将结果更改为初始应用程序之外。

另一种解决方案是使用具有 ReceiveAndDelete 模式的服务总线队列(请参阅如何从队列接收消息下的this页面)。如果您收到该消息,它将被标记为已消耗,并且永远不会再次出现。通过这种方式,您可以确定它是最多一次(请参阅与存储队列here的比较)。但话说回来,如果在处理消息时发生了某些事情(即:服务器崩溃,......),您可能会丢失有价值的信息。

<强>更新

这将模拟存储队列中的最多一次。消息可以通过GetMessage多次到达,但只会由业务逻辑处理一次(存在一些业务逻辑永远不会执行的风险)。

  • 的GetMessage()
  • DeleteMessage可以()
  • AddRecordsToDatabase()
  • GenerateFiles()

答案 2 :(得分:-1)

  

假设我在使用DeleteMessage之前使用GetMessage()和从不超过消息不可见时间,我可以假设我只会收到每条消息一次吗?