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