3

我有一个 WebJob,当用户将文件上传到 blob 存储时触发它 - 它由上传完成后创建的队列存储消息触发。

根据文件的用途,它会将消息发布到其他队列以触发处理作业。

其中一些作业时间紧迫,运行速度相对较快。在一种情况下,处理大约需要三秒钟,用户正在等待结果。

但是,由于最小队列轮询间隔为 2 秒,因此用户必须等待两个 WebJobs 被调用的时间通常是其等待时间的两倍。

我尝试将两个 WebJobs 合并为一个,希望当第一个处理程序发布队列消息时,会立即触发相应的处理处理程序,但实际上它始终等待两秒钟才能接收到消息。

我的问题是,如果我知道有消息等待,是否有办法告诉我的 WebJob 立即从同一个 WebJob 中检查队列触发器?或者甚至更好地配置它以在我从 WebJob 内部发布到队列时立即检查队列触发器?

或者切换到服务总线队列会提高对新消息的响应能力?

更新

在有关使用 blob 触发器的文档中,它说:

使用 Blob 属性创建的 Blob 有一个例外。当 WebJobs SDK 创建新 blob 时,它会立即将新 blob 传递给任何匹配的 BlobTrigger 函数。因此,如果您有一系列 blob 输入和输出,SDK 可以有效地处理它们。但是,如果您希望为通过其他方式创建或更新的 blob 运行 blob 处理函数的低延迟,我们建议使用 QueueTrigger 而不是 BlobTrigger。

http://azure.microsoft.com/en-gb/documentation/articles/websites-dotnet-webjobs-sdk-storage-blobs-how-to/

然而,没有提到任何类似的队列。这意味着如果您在这种情况下需要非常低的延迟,那么 blob 比队列更好,这似乎是错误的。

更新 2

我最终通过将编排代码从第一个 WebJob 中拉出并进入应用程序的服务层并删除 WebJob 来解决这个问题。无论如何,它运行速度很快,所以也许将其分离到自己的 WebJob 中是一种矫枉过正。这意味着只需要在文件上传后触发处理 WebJob。

4

1 回答 1

2

目前 2 秒是 SDK 轮询新消息所需的最短时间。SDK 执行指数回退轮询,因此您可以将 MaxPollingInterval 始终配置为 2 秒。config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(15);

有关更多详细信息,请参阅http://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to/#config

于 2015-02-20T23:52:58.410 回答