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,那么当前的激活将也能正常处理该请求。