【发布时间】:2016-08-10 11:16:48
【问题描述】:
假设有状态服务中有这样的代码:
public async Task<bool> UpdateTheThing()
{
using (var tx = StateManager.CreateTransaction())
{
await UpdateLocalState(tx);
// point a
bool isOK = await otherServiceProxy.UpdateServiceState();
// point b
if(isOK)
{
await tx.CommitAsync();
}
return isOK;
}
}
如果在我们安全之前的任何地方发生了不好的事情 - 交易将处理 确保数据一致。如果在 a 点和 b 点之间发生了什么事,我们可以 或者可能没有更新其他服务的状态。
如果发生的坏事是抛出异常,我们可以 恢复其他服务的状态,但如果我们的节点在那个时候被关闭,我们会 永远不要恢复状态。
我知道解决此类问题的一种方法是执行以下操作:
- 让 UpdateTheThing 除了将命令添加到队列之外什么都不做
- 实现一些逻辑来处理队列
- 发明某种方法将结果 (isOk) 返回给调用者
- 使 UpdateServiceState 幂等
- 如果出现问题,让队列继续重试命令
- 如果问题不断发生,请发明某种方法从队列中删除命令,并以某种方式通知某人存在问题。
这是相当多的基础设施。我正在寻找更简单方法的建议。
我注意到似乎没有一个 Service Fabric 示例可以处理此问题。
【问题讨论】:
标签: architecture microservices azure-service-fabric