我正在尝试理解默认的奥尔良谷物目录。
https://learn.microsoft.com/en-us/dotnet/orleans/host/grain-directory
本文强烈建议您应该使用默认目录,并且只有在您有特定的用例和切换的原因时才应该切换到不同的目录。
:如果默认目录是最终一致的内存存储,那么可以保证随着时间的推移,粒度将被复制。这对应用程序状态可能是灾难性的。
显然微软对此有一些缓解措施。我想知道它是什么?
Orleans将确保谷物目录随着时间的推移而聚合,以便集群中每个谷物激活都有一个准确的注册。
由于最终是一致的,因此可能存在谷物激活而未注册的时期(例如,因为谷物注册的主机刚刚被流星撞击),并且可能存在谷物在不同主机上注册多个不同激活的时期(例如,新主机刚刚加入集群的竞赛,并不是所有主机都知道)。
这些情况都可以迅速纠正:目录分区分裂和合并,这样就不会有重叠(两个筒仓认为它们拥有某些键范围)或间隙(没有筒仓拥有某些键范围),这样做,通过停用来解决重复,并且一旦发现间隙(即,当一个颗粒注册的筒仓被清除时),就会终止缺少注册的激活。
请注意,即使使用高度一致的目录,也可能有重复的激活。考虑一个筒仓失去网络连接并随后被集群中的其他筒仓驱逐的情况,或者主机执行很长时间的GC暂停,或者VM从一个主机迁移到另一个主机的情况。在这些情况下,筒仓可能会继续运行一段时间,然后才知道它应该终止自己(在得知它已被驱逐后)。
grain应该把关键的应用状态放在一致的存储中。当奥尔良保存颗粒状态时,它使用乐观并发控制来确保它不会破坏未观察到的写。因此,即使有重复的激活,任何写入都可以保证看到以前的所有写入。默认情况下,由于不一致导致的写入失败也会导致grain停用,甚至在集群成员检测到筒仓已被驱逐之前,它可以解析重复项。