Допустим, у меня есть функция 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, но это не очень хороший подход.
ОБНОВЛЕНО: изначально я не упоминал, что проблема не только всохранение состояния дважды, но также в некоторой логике (если это первое создание, оно должно выводить сообщение на служебную шину, иначе должно быть отправлено другое сообщение), которое должно быть полностью пропущено.