兼容的grain
当现有的grain激活体即将处理请求时,运行时将检查请求中的版本和grain的实际版本是否兼容。 Orleans不会在运行时推断要使用哪个策略,确定两个版本是否兼容的默认行为,是由GrainVersioningOptions.CompatibilityStrategy
确定的。
向后兼容(默认)
定义
在以下情况下,grain接口版本Vn可以向后兼容Vm:
- 接口名称未更改(或重写的类型代码)
- Vm版本中存在的所有pubic方法都在Vn版本中。重要的是,从Vm继承的方法的签名不会被修改:因为Orleans使用内部的内置序列化器,修改/重命名字段(甚至是privaet)会使序列化中断。
与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,则当前激活体也将能够正常处理请求