并发Azure函数与表存储

时间:2018-09-26 09:08:04

标签: c# azure concurrency azure-functions azure-table-storage

假设我具有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,但这似乎不是一个好方法。

已更新: 最初我没有提到它,问题不仅在于持久保存状态两次,还在于某种逻辑(如果是首次创建,则应将消息输出到服务总线,否则应发送另一条消息),应该完全跳过该问题。

0 个答案:

没有答案