我读过奥尔良常见问题解答时可能发生裂脑,但我不明白会发生什么不好以及如何妥善处理。
常见问题解答说的有些模糊:
您只需要考虑在编写应用程序时有两个演员实例的罕见可能性。
但实际上我应该如何考虑这一点以及如果我不这样做会发生什么?
Orleans Paper(http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf)说:
应用程序可以依赖外部持久性 存储以提供更强的数据一致性
但我不明白这意味着什么。
假设裂脑发生了。现在我有一个谷物的两个实例。当我发送一些消息时,这两个消息可能被接收(或者甚至可能有更多?)不同的实例。假设在接收这些消息之前的每个实例都具有相同的状态。现在,在处理这些消息后,它们具有不同的状态。
他们应该如何坚持自己的国家?可能存在冲突。
当另一个实例被销毁时,只有一个实例会被破坏的实例状态发生?它们处理过的消息从未被处理过吗?然后客户端状态和服务器状态可以是去同步化的IIUC。
我认为(裂脑)是一个大问题,我不明白为什么对它的关注很少。
答案 0 :(得分:8)
Orleans利用存储提供商的一致性保证。当您从谷物中调用this.WriteStateAsync()
时,存储提供程序会确保谷物已经看到所有先前的写入。如果没有,则抛出异常。您可以捕获该异常并调用DeactivateOnIdle()
并重新抛出异常或调用ReadStateAsync()
并重试。因此,如果你在裂脑情况下有2粒,那么在没有首先阅读最新状态的情况下,一次调用WriteStateAsync()
首先阻止另一个人写入状态。
更新:从Orleans v1.5.0开始,当正在执行的调用完成时,允许InconsistentStateException
被抛回调用方的粒度将自动停用。谷物可以catch
并处理异常以避免自动停用。