兼容 grain

当现有 grain 激活即将处理请求时,运行时将检查请求中的版本和 grain 的实际版本是否兼容。 Orleans 不会在运行时推断要使用哪个策略。 用于确定两个版本是否兼容的默认行为由 Orleans.Versions.Compatibility.CompatibilityStrategy 确定。

向后兼容(默认)

定义

如果满足以下条件,则 grain 接口版本 Vn 可以向后兼容 Vm:

  • 接口的名称未更改(或重写的 typecode)。
  • Vm 版本中提供的所有公共方法都存在于 Vn 版本中。 请务必不要修改从 Vm 继承的方法的签名:因为 Orleans 使用内部内置序列化程序,修改/重命名字段(甚至是专用字段)可导致序列化中断。

由于与 Vm 相比,Vn 可能添加了方法,因此 Vm 不能兼容 Vn。

示例

如果群集中有一个给定接口的两个版本(V1 和 V2),并且该 V2 向后兼容 V1:

  • 如果当前激活为 V2 且请求的版本为 V1,则当前激活将能够正常处理请求
  • 如果当前激活为 V1 且请求的版本为 V2,则会停用当前激活,并且将创建与 V2 兼容的新激活(请参阅版本选择器策略)。

完全兼容

定义

如果满足以下条件,则 grain 接口版本 Vn 可完全兼容 Vm:

  • Vn 向后兼容 Vm
  • Vn 版本中未添加任何公共方法

如果 Vn 完全兼容 Vm,则 Vm 也完全兼容 Vn。

示例

如果群集中有一个给定接口的两个版本(V1 和 V2),并且该 V2 完全兼容 V1:

  • 如果当前激活为 V2 且请求的版本为 V1,则当前激活将能够正常处理请求
  • 如果当前激活为 V1 且请求的版本为 V2,则当前激活也将能够正常处理请求