迁移到Apache Ignite 2.11.0后持久化区域动态生成类型无法恢复问题
问题根因
Apache Ignite 2.11版本对.NET端的程序集扫描逻辑做了优化,默认会跳过所有通过Reflection.Emit生成的动态程序集的类型扫描,避免扫描动态程序集带来的性能损耗和不必要的异常。2.10版本没有该过滤逻辑,会自动扫描所有加载到当前AppDomain的程序集,因此可以正常识别动态生成的类型。
你配置的peerAssemblyLoadingMode=CurrentAppDomain不生效是因为该参数仅用于从集群其他节点加载缺失的程序集,而本次问题是节点重启后本地生成的动态类型未被Ignite的序列化层识别,不属于跨节点程序集加载的场景。
解决方案
- 方案1:显式注册动态类型
动态类型生成完成后,直接将其注册到Ignite的二进制序列化配置中即可:
也可以在Ignite启动后调用var cfg = new IgniteConfiguration { BinaryConfiguration = new BinaryConfiguration { Types = new[] { yourDynamicType } } };ignite.GetBinary().RegisterType(yourDynamicType)完成注册。 - 方案2:自定义程序集扫描过滤器
重写AssemblyScanFilter配置,放开对自定义动态程序集的扫描限制:var cfg = new IgniteConfiguration { AssemblyScanFilter = assembly => // 可根据程序集名称、公钥等属性进一步过滤,避免扫描到无关动态程序集 assembly.FullName.StartsWith("你的动态程序集名前缀") || !assembly.IsDynamic }; - 方案3:自定义序列化逻辑
为动态类型实现IBinarySerializer接口,自行控制序列化和反序列化逻辑,完全脱离Ignite自动类型扫描的依赖,兼容性最高。
内容的提问来源于stack exchange,提问作者Oleg Bevz
相关产品推荐
相关产品推荐

