WebJob一次从队列处理多个消息

时间:2016-01-19 06:02:58

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

WebJob正在处理来自队列的多条消息,我不想要它。我的队列有依赖消息,我想依次按顺序处理。 我已经尝试将“BatchSize”配置为1,但没有运气。它仍在处理多个消息。

3 个答案:

答案 0 :(得分:18)

BatchSize设置(JobHostConfiguration.Queues.BatchSize)不适用于ServiceBus队列处理,仅适用于Azure队列。要配置ServiceBus队列处理,请使用ServiceBusConfiguration。您要配置的旋钮是ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls将此设置为1 以禁用单个实例上的并发处理(默认值为16):

JobHostConfiguration config = new JobHostConfiguration();
ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration();
serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;
config.UseServiceBus(serviceBusConfig);

JobHost host = new JobHost(config);
host.RunAndBlock();

这将确保在单个实例上一次只处理一条消息。如果扩展了WebApp,则每个扩展后的实例将以此模式运行,这意味着您将跨实例进行并发处理。如果您不想这样做,则可以使用SingletonAttribute确保只有一个功能实例正在跨实例运行。有关详细信息,请参阅Singleton wiki page

答案 1 :(得分:1)

如果您的消息具有某些顺序依赖性,则可能会有一系列操作。我有一个特殊情况,我使用Azure队列而不是ServiceBus,但我相信以下想法可以应用相同:

我有一个自动化过程,其中包括:1)创建数据库,2)创建Web应用程序,3)配置Web应用程序,以及4)部署代码。对于我的情况,必须按顺序完成。

就此而言,我为每项任务创建了一个队列:create-database-queuecreate-webapp-queueconfigure-web-appdeploy-app-queue

通过这种方式工作会更加安全,因为您可以隔离任务。一旦一个队列中的一个进程完成,就可以将其推送到下一个队列。此外,您可以轻松地在流程中插入新步骤。例如,我可以轻松地插入新的步骤1.5) Restore database backup而不需要再考虑。

此外,您还要促进责任与各个队列的分离。

答案 2 :(得分:-3)

它的排队很大程度上取决于你所做的事情的成功与否。我不确定您为什么会遇到队列批量大小的问题 - Azure Storage Queue会为您提供一条又一条消息,服务总线也是如此。

Azure WebJobs将扩展您正在托管它们的网站数量,这可能会给您带来并发问题,即如果您有一个队列处理器作为连续运行的webjob,那么如果您的网站扩展到两个实例,你将有两个 WebJobs同时争夺同一个队列。

因此,如果您需要单个队列处理器来运行,那么将webjob移动到云服务可能是更好的解决方案,在该服务中您可以100%控制实例数量,从WebSites及其实例中清除分离。

由于你需要一个接一个地串行处理每个消息,所以扩展处理器的数量是没有意义的,因为他们需要等待下一个正在处理的消息,所以只要这个是一项要求,您可能希望扩展您的网站,我建议将CloudService作为一种更好的方式。