Как избежать условий гонки, используя QueueTrigger в веб-задании Azure? - PullRequest
1 голос
/ 03 июня 2019

У меня есть служба WCF , которая отправляет входящее SOAP-сообщение от третьей стороны в очередь хранения Azure .

Сторонняя система - это автоматизированная система, которая генерирует сообщения запроса SOAP в BULK . Как только сообщение получено в WCF, служба WCF читает сообщение и помещает его в очередь хранения Azure, которая затем считывается веб-заданием Azure, настроенным с использованием атрибута [QueueTrigger] .

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

Роль этой функции - обновление Тарифов Продукта в системе. Веб-задание запускается, как только в очереди появляется сообщение и начинается обработка запроса. Когда отправляются сообщения с несколькими скоростями для одного и того же продукта, запускается функция QueueTrigger , которая пытается обновить цены для одного и того же продукта в одно и то же время, что приводит к условию гонки .

  1. Как мне разрешить это состояние гонки? Читает ли сообщение из очереди по очереди?
  2. Нужно ли попробовать другую операцию для чтения сообщения из очереди, удалив QueueTrigger ?

1 Ответ

1 голос
/ 03 июня 2019

Если я правильно помню, размер пакета QueueTrigger по умолчанию равен 1 сообщению, конечно, вы можете редактировать его конфигурации вручную, но вы не должны сталкиваться с этой проблемой в первую очередь, если вы не изменили размер пакета уже.

static void Main()
{

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

}

И да, если сообщения в очередях должны выполняться в определенном порядке, вы должны выполнять их по одному, учитывая, что выполнение этих сообщений асинхронное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...