通过WebJobs重新排队或删除Azure存储队列中的邮件

时间:2015-04-23 10:32:01

标签: azure azure-table-storage azure-webjobs azure-storage-queues

我希望有人可以澄清一些关于Azure存储队列及其与WebJobs交互的内容:

  1. 要执行重复的后台任务(即添加到队列一次,然后按设定的间隔重复),有没有办法更新QueueTrigger函数中传递的相同消息,以便其租约(可见性)可以扩展为一种重新排队并避免过期的方法?

  2. 对于重复出现的后台工作的上述模式,我也试图找出一种“按需”删除/过期作业的方法。因为在WebJobs的上下文之外似乎不可能这样做,所以我想可能将messageId和popReceipt存储在Table存储中作为持久缓存删除,然后在QueueTrigger函数中传递消息时执行DeleteMessage的表查找,以便不再重复该消息。

  3. 任何建议或提示表示赞赏。干杯:)

2 个答案:

答案 0 :(得分:5)

Azure存储队列用于存储Azure Webjj,WorkerRole等可能使用的消息.Azure Webjobs SDK提供了一种与Azure存储(包括队列,表存储,Blob和服务总线)交互的简便方法)。话虽这么说,您还可以拥有一个不使用Webjobs SDK且不与Azure存储交互的Azure Webjob。实际上,我确实运行了一个与SQL Azure数据库交互的Webjob。

我将简要介绍Webjobs SDK如何与Azure队列进行交互。一旦消息到达队列(或者使其成为'可见',稍后会更多),将触发Webjob中的功能(假设您以连续模式运行)。如果该函数返回时没有错误,则删除该消息。如果出现问题,消息将返回队列再次处理。您可以相应地处理失败的消息。 Here是如何执行此操作的示例。

  

SDK最多会调用一次函数来处理队列消息。如果第五次尝试失败,则将消息移动到毒性队列。最大重试次数是可配置的。

关于可见性,当您向队列添加消息时,会出现可见性超时属性。默认为零。因此,如果您希望将来处理邮件,可以通过将此属性设置为所需的值来执行此操作(将来最多7天)。

  

可选。如果指定,则必须使用x-ms-version of 2011-08-18或更高版本进行请求。如果未指定,则默认值为0.指定相对于服务器时间的新可见性超时值(以秒为单位)。新值必须大于或等于0,且不能大于7天。消息的可见性超时不能设置为晚于到期时间的值。 visibilitytimeout应设置为小于生存时间值的值。

现在为您的应用提供建议。

  1. 我只想为您要完成的每项任务向队列添加一条消息。该消息显然具有相关的处理信息。如果需要安排多个任务,则可以运行预定的Webjob(按照您选择的计划)将消息添加到队列中。然后,您的连续Webjob将获取该消息并进行处理。
  2. 为每个发送到队列的邮件添加GUID。将GUID存储在应用程序的某个其他域(数据库)中。因此,当您将消息出列以进行处理时,首先要检查数据库是否需要处理消息。如果您需要取消消息的执行,而不是从队列中删除它,只需更新数据库中的GUID即可。
  3. 还有更多信息here.

    希望这有帮助,

答案 1 :(得分:0)

至于问题的第一部分,您可以使用“更新消息”操作来扩展消息的可见性超时。

  

更新消息操作可用于不断扩展   队列消息的不可见性。如果,此功能非常有用   您希望工作者角色“租用”队列消息。例如,如果是   worker角色调用Get Messages并认识到它需要更多时间   处理消息,它可以不断扩展消息   不可见性,直到它被处理。如果工人角色失败了   在处理过程中,最终消息将再次可见   另一个工人角色可以处理它。

您可以在此处查看REST API文档:https://msdn.microsoft.com/en-us/library/azure/hh452234.aspx

对于问题的第二部分,实际上有多种方法,您将id / popReceipt存储为查找的方法是一种可能的选项,实际上您可以将Web作业专门用于接收不同队列上的消息(例如plz-delete-msg)并发送包含“messageId”的消息,此Web作业可以使用“获取消息”操作,然后删除它。 (您可以通过传递队列名称使作业通用!)

https://msdn.microsoft.com/en-us/library/azure/dd179474.aspx

https://msdn.microsoft.com/en-us/library/azure/dd179347.aspx