如何处理裂脑?

时间:2016-02-07 01:53:03

标签: orleans

我读过奥尔良常见问题解答时可能发生裂脑,但我不明白会发生什么不好以及如何妥善处理。

常见问题解答说的有些模糊:

  

您只需要考虑在编写应用程序时有两个演员实例的罕见可能性。

但实际上我应该如何考虑这一点以及如果我不这样做会发生什么?

Orleans Paper(http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf)说:

  

应用程序可以依赖外部持久性   存储以提供更强的数据一致性

但我不明白这意味着什么。

假设裂脑发生了。现在我有一个谷物的两个实例。当我发送一些消息时,这两个消息可能被接收(或者甚至可能有更多?)不同的实例。假设在接收这些消息之前的每个实例都具有相同的状态。现在,在处理这些消息后,它们具有不同的状态。

他们应该如何坚持自己的国家?可能存在冲突。

当另一个实例被销毁时,只有一个实例会被破坏的实例状态发生?它们处理过的消息从未被处理过吗?然后客户端状态和服务器状态可以是去同步化的IIUC。

我认为(裂脑)是一个大问题,我不明白为什么对它的关注很少。

1 个答案:

答案 0 :(得分:8)

Orleans利用存储提供商的一致性保证。当您从谷物中调用this.WriteStateAsync()时,存储提供程序会确保谷物已经看到所有先前的写入。如果没有,则抛出异常。您可以捕获该异常并调用DeactivateOnIdle()并重新抛出异常或调用ReadStateAsync()并重试。因此,如果你在裂脑情况下有2粒,那么在没有首先阅读最新状态的情况下,一次调用WriteStateAsync()首先阻止另一个人写入状态。

更新:从Orleans v1.5.0开始,当正在执行的调用完成时,允许InconsistentStateException被抛回调用方的粒度将自动停用。谷物可以catch并处理异常以避免自动停用。