Azure WebJob一次处理队列中的多条消息
我的WebJob正在处理一个队列中的多条消息,我不希望它这样做。我的队列有依赖消息,我希望依次处理这些消息。Azure WebJob一次处理队列中的多条消息,azure,azure-webjobs,azure-servicebus-queues,azure-webjobssdk,Azure,Azure Webjobs,Azure Servicebus Queues,Azure Webjobssdk,我的WebJob正在处理一个队列中的多条消息,我不希望它这样做。我的队列有依赖消息,我希望依次处理这些消息。 我尝试过将“BatchSize”配置为1,但没有成功。它仍在一次处理多条消息。它是哪种队列在很大程度上取决于您所做工作的成功与否。我不知道为什么队列batchsize会出现问题-Azure存储队列会给您一条又一条消息,服务总线也会这样 Azure WebJobs将随着您托管它们的网站数量的增加而扩展,这可能会给您带来并发问题,即,如果您有一个队列处理器作为webjob持续运行,那么如果您
我尝试过将“BatchSize”配置为1,但没有成功。它仍在一次处理多条消息。它是哪种队列在很大程度上取决于您所做工作的成功与否。我不知道为什么队列batchsize会出现问题-Azure存储队列会给您一条又一条消息,服务总线也会这样 Azure WebJobs将随着您托管它们的网站数量的增加而扩展,这可能会给您带来并发问题,即,如果您有一个队列处理器作为webjob持续运行,那么如果您的网站扩展到两个实例,您将有两个WebJobs也在为同一队列而战 因此,如果您需要一个队列处理器来运行,那么将webjob移动到云服务中可能是一个更好的解决方案,在云服务中,您可以100%控制实例的数量,与网站及其实例完全分离 由于您需要一条接一条地连续处理每条消息,因此扩展处理器的数量是没有意义的,因为它们需要等待下一条消息被处理,因此只要这是一项要求,并且您可能希望扩展您的网站,我建议使用CloudService作为更好的方式。BatchSize设置(
JobHostConfiguration.Queues.BatchSize
)不适用于ServiceBus队列处理,只适用于Azure队列。要配置ServiceBus队列处理,请使用ServiceBusConfiguration
。要配置的旋钮是ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls
将其设置为1以禁用单个实例上的并发处理(默认值为16):
这将确保在单个实例上一次只处理一条消息。如果您的WebApp已向外扩展,则每个向外扩展的实例都将在此模式下运行,这意味着您将跨实例进行并发处理。如果您也不想这样做,可以使用
SingletonAttribute
确保只有一个函数实例跨实例运行。有关更多信息,请参阅。如果您的消息具有某种顺序依赖性,则可能会有一条操作管道。我有一个特别的场景,我使用Azure队列而不是ServiceBus,但我相信以下想法也可以适用于此:
我有一个自动化过程:1)创建数据库,2)创建web应用,3)配置web应用,4)部署代码。就我而言,事情必须按这个顺序进行
对于这种情况,我为每个任务创建了一个队列:创建数据库队列
,创建webapp队列
,配置web app
,以及部署应用队列
这样做会更安全,因为你会隔离任务。一旦一个队列中的一个进程完成,就可以将其推送到下一个队列。此外,您可以轻松地在流程中插入新步骤。例如,我可以轻松地插入一个新步骤1.5)还原数据库备份
,无需再三考虑
此外,您还可以促进职责与单个队列的分离。FYI您可以将WebJobs配置为单例。因此,如果你只想实现云服务,就不需要移动到云服务。谢谢,伙计,这正是我所需要的
JobHostConfiguration config = new JobHostConfiguration();
ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration();
serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;
config.UseServiceBus(serviceBusConfig);
JobHost host = new JobHost(config);
host.RunAndBlock();