Azure WebJobs可以根据需要轮询队列吗?

时间:2015-02-20 23:14:22

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

我有一个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。

1 个答案:

答案 0 :(得分: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