Azure Queue唯一消息

Phi*_*lip 5 queue azure azure-queues

我想确保我没有多次向队列插入消息.我可以使用任何ID /名称来强制执行唯一性吗?

Dav*_*gon 12

vtortola几乎涵盖了它,但我想更多地详细说明为什么它至少一次交付.

当您读取队列项时,它不会从队列中删除; 相反,它变得不可见但保留在队列中.隐身期限默认为30秒(最长:2小时).在此期间,从队列中获取项目的代码有足够的时间来处理队列消息中的任何命令并删除队列项.

假设在达到超时时间之前删除了队列项,一切都很顺利.但是:一旦达到超时时间,队列项将再次可见,并且保存队列项的代码可能不再删除它.在这种情况下,其他人可以读取相同的队列消息并重新处理该消息.

由于队列消息可以超时,并且可以重新出现:

  • 您的队列处理必须是幂等的 - 对队列消息的操作必须产生相同的结果(例如渲染照片的缩略图).
  • 您需要考虑超时调整.您可能会发现命令有效但处理时间太长(可能您的45秒缩略图渲染代码工作正常,直到有人上传了一个25MP图像)
  • 您需要考虑有害消息 - 那些永远不会正确处理的消息.也许它们会导致抛出异常或导致消息处理器中止处理的某些无效条件,这会导致消息最终重新出现在队列中.有一个调用DequeueCount的属性- 考虑在读取队列项时查看该属性,如果等于,例如3,则将消息推送到表或blob中并向自己发送通知以花一些时间离线调试该消息.

有关get-queue低级REST API的更多详细信息,请访问此处.这将使您更深入地了解Windows Azure队列消息处理.


vto*_*ola 8

Azure队列无法确保消息顺序和消息唯一性.消息将被"至少一次"处理,但没有任何东西可以确保它不会被处理两次,因此它不能确保"最多一次".

您应该准备两次收到相同的消息.您可以在邮件正文中添加ID作为数据的一部分.