我希望有人可以澄清一些关于Azure存储队列及其与WebJobs交互的内容:
要执行重复的后台任务(即添加到队列一次,然后按设定的间隔重复),有没有办法更新QueueTrigger函数中传递的相同消息,以便其租约(可见性)可以扩展为一种重新排队并避免过期的方法?
对于重复出现的后台工作的上述模式,我也试图找出一种“按需”删除/过期作业的方法。因为在WebJobs的上下文之外似乎不可能这样做,所以我想可能将messageId和popReceipt存储在Table存储中作为持久缓存删除,然后在QueueTrigger函数中传递消息时执行DeleteMessage的表查找,以便不再重复该消息。
任何建议或提示表示赞赏。干杯:)
答案 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应设置为小于生存时间值的值。
现在为您的应用提供建议。
还有更多信息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