title: 兼容的Grains

description:

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

向后兼容(默认)

定义

在下面几个情况下,Grain接口版本$V_n$可以向后兼容$V_m$:

  • 接口的名称(或重写的TypeCode)没有改变。
  • $Vm$中的所有public方法都在$Vn$中。__注意,不能修改从$V_m$中继承的方法的签名:因为Orleans使用了一个内部内置的序列化器,修改/重命名一个字段(即使是private的)会使序列化中断。

Since Vn can have added methods compared to Vm, Vm is not compatible with Vn. 由于$V_n$的方法不少于$V_m$,所以$V_m$并不兼容$V_n$。

示例

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

  • 如果当前的激活是V2,而请求的版本是V1,那么当前的激活将能够正常处理该请求。
  • 如果当前的激活是V1,而请求的版本是V2,那么当前的激活将被停用,并创建一个与V2兼容的新激活(见版本选择器策略)。

完全兼容

定义

在下面几个情况下,Grain接口版本$V_n$可以完全兼容$V_m$:

  • $V_n$向后兼容$V_m$。
  • 在$V_n$版本中没有新增public方法。

如果$V_n$与$V_m$完全兼容,那么$V_m$也与$V_n$完全兼容。

示例

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

  • 如果当前的激活是V2,而请求的版本是V1,那么当前的激活将能正常处理该请求。
  • 如果当前的激活是V1,而请求的版本是V2,那么当前的激活将也能正常处理该请求。