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

Bha*_*ddy 14 azure azure-servicebus-queues azure-webjobs azure-webjobssdk

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

mat*_*ewc 19

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();
Run Code Online (Sandbox Code Playgroud)

这将确保在单个实例上一次只处理一条消息.如果扩展了WebApp,则每个扩展后的实例将以此模式运行,这意味着您将跨实例进行并发处理.如果您不希望这样,您可以使用SingletonAttribute以确保只有一个实例实例跨实例运行.有关更多信息,请参阅Singleton wiki页面.


Ped*_*ias -3

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

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

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

由于您需要一个接一个地串行处理每条消息,因此扩展处理器的数量是没有意义的,因为它们无论如何都需要等待下一条消息被处理,所以只要这是一个要求,并且您可能想要扩展您的网站,我建议 CloudService 作为更好的方法。