假设我具有azure功能,该功能绑定到azure服务总线并进行一些处理。例如,迭代所有可用的_operationHandlers
并进行一些计算
foreach (var operationHandler in _operationHandlers)
{
await operationHandler
.HandleAsync(contractDto, cancellationToken);
}
每个operationHandler基于当前状态,存储在表存储中。例如,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,但这似乎不是一个好方法。
已更新: 最初我没有提到它,问题不仅在于持久保存状态两次,还在于某种逻辑(如果是首次创建,则应将消息输出到服务总线,否则应发送另一条消息),应该完全跳过该问题。