gpt4 book ai didi

orleans - 如何处理脑裂?

转载 作者:行者123 更新时间:2023-12-02 02:43:14 25 4
gpt4 key购买 nike

我已阅读奥尔良常见问题解答,了解何时可能发生裂脑,但我不明白会发生什么不良情况以及如何正确处理。

常见问题解答说了一些模糊的内容,例如:

You just need to consider the rare possibility of having two instances of an actor while writing your application.

但是我实际上应该如何考虑这一点,如果不考虑会发生什么?

奥尔良纸业( http://research.microsoft.com/pubs/210931/Orleans-MSR-TR-2014-41.pdf )这样说:

application can rely on external persistent storage to provide stronger data consistency

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

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

他们应该如何保持他们的状态?可能会发生冲突。

当另一个实例被销毁并且只剩下一个实例时,被销毁实例的状态会发生什么?就像他们处理的消息从未被处理过一样?然后客户端状态和服务器状态可以不同步IIUC。

我认为这是一个大问题,但我不明白为什么很少有人关注它。

最佳答案

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

更新:从Orleans v1.5.0开始,当当前正在执行的调用完成时,允许将 InconcientStateException 抛出回调用者的grain将自动停用。 grain 可以捕获并处理异常以避免自动停用。

关于orleans - 如何处理脑裂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35248830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com