如何在Azure Web作业中使用QueueTrigger避免出现竞争情况?

时间:2019-06-03 06:38:23

标签: c# azure azure-webjobs

我有一个 WCF服务,该服务将传入的SOAP消息从第三方推送到 Azure存储队列

第三方系统是一个自动系统,它以 BULK (大容量)触发SOAP请求消息。 一旦在WCF中接收到消息,WCF服务就会读取该消息并将其推送到Azure存储队列,然后由使用 [QueueTrigger] 属性配置的Azure Web作业读取该消息。

public async Task UpdateRatesAsync([QueueTrigger("queue-name")] string message, TextWriter log)
  

此功能的作用是更新系统中的产品费率。只要队列中有消息,Web作业就会被触发,并开始处理请求。当推送同一产品的多个费率消息时,将执行 QueueTrigger 函数,该函数尝试同时更新同一产品的费率,从而导致竞争条件

     
    
        
  1. 我该如何解决这种比赛情况?是通过从队列中逐一读取消息吗?
  2.     
  3. 我是否需要尝试其他操作以通过删除 QueueTrigger 从队列中读取消息?
  4.     
  

1 个答案:

答案 0 :(得分:1)

如果我没有记错的话,QueueTrigger批次大小默认一次设置为1条消息,当然您可以手动编辑它的配置,但是除非您编辑了批次大小,否则您不应该首先遇到这个问题。已经。

static void Main()
{

    JobHostConfiguration config = new JobHostConfiguration();
    config.Queues.BatchSize = 1;
    var host = new JobHost(config);
    host.RunAndBlock();
    [...]

}

是的,如果队列中的消息需要以特定顺序执行,则鉴于这些消息的执行是异步的,您应该一次执行一次。