3

我希望有人能澄清一些关于 Azure 存储队列及其与 WebJobs 交互的事情:

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

  2. 通过上述重复后台作业的模式,我还试图找出一种“按需”删除/过期作业的方法。由于在 WebJobs 的上下文之外这似乎是不可能的,我正在考虑将要在表存储中删除的消息的 messageId 和 popReceipt 存储为持久缓存,然后在 QueueTrigger 函数中传递消息时执行用于执行 DeleteMessage 的表查找,以便不再重复该消息。

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

4

2 回答 2

6

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

我将简要解释 Webjobs SDK 如何与 Azure 队列交互。一旦消息到达队列(或变为“可见”,稍后会详细介绍),Webjob 中的功能就会被触发(假设您在连续模式下运行)。如果该函数返回没有错误,则删除该消息。如果出现问题,消息将返回队列再次处理。您可以相应地处理失败的消息。是有关如何执行此操作的示例。

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

关于可见性,当您将消息添加到队列时,有一个可见性超时属性。默认为零。因此,如果您想在将来处理一条消息,您可以通过将此属性设置为所需的值来完成(最多在未来 7 天)。

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

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

  1. 我只想为您要完成的每项任务向队列中添加一条消息。该消息显然将具有相关信息进行处理。如果您需要计划多个任务,您可以运行计划的 Web 作业(根据您选择的计划)将消息添加到队列中。然后,您的连续 Webjob 将接收该消息并进行处理。
  2. 为进入队列的每条消息添加一个 GUID。将该 GUID 存储在应用程序的某个其他域(数据库)中。因此,当您将消息出列以进行处理时,您要做的第一件事是检查您的数据库是否需要处理该消息。如果您需要取消消息的执行,而不是将其从队列中删除,只需更新数据库中的 GUID。

这里有更多信息

希望这可以帮助,

于 2015-04-23T19:09:59.673 回答
0

至于问题的第一部分,您可以使用 Update Message 操作来延长消息的可见性超时。

更新消息操作可用于不断扩展队列消息的不可见性。如果您希望工作人员角色“租用”队列消息,此功能会很有用。例如,如果一个工作角色调用 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

于 2016-01-09T06:05:41.953 回答