Функция одновременной лазури с хранением таблицы - PullRequest
0 голосов
/ 26 сентября 2018

Допустим, у меня есть функция Azure, которая связывается с сервисной шиной Azure и выполняет некоторую обработку.Например, он перебирает все доступные _operationHandlers и выполняет некоторые вычисления

foreach (var operationHandler in _operationHandlers)
{
    await operationHandler 
            .HandleAsync(contractDto, cancellationToken);
}

, каждая операцияHandler основана на текущем состоянии, которое хранится в хранилище таблиц.Например, operationHandler проверяет состояние, если оно не существует, создайте его.

var query = new TableQuery()
                    .Where(TableQuery.GenerateFilterCondition(
                        "PartitionKey",
                        QueryComparisons.Equal,
                        partitionKey));

return await dataSource.QueryAsync<T>(query, token);

Проблема возникает, когда я получаю два сообщения в служебную шину Azure, затем Azure масштабирует свою функцию и выполняет их одновременноТаким образом, каждый operationHandler будет в состоянии состояния гонки и сохранит состояние, поэтому в конце я получу два сохраненных состояния.

Надеюсь, это понятно, любые предложения, как мне с этим справиться?Конечно, я могу попытаться установить maxConcurrentRequests в host.json на 1, но это не очень хороший подход.

ОБНОВЛЕНО: изначально я не упоминал, что проблема не только всохранение состояния дважды, но также в некоторой логике (если это первое создание, оно должно выводить сообщение на служебную шину, иначе должно быть отправлено другое сообщение), которое должно быть полностью пропущено.

...