Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure WebJob一次处理队列中的多条消息_Azure_Azure Webjobs_Azure Servicebus Queues_Azure Webjobssdk - Fatal编程技术网

Azure 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持续运行,那么如果您

我的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();