Java 管理hazelcast中模型对象的更改?

Java 管理hazelcast中模型对象的更改?,java,hazelcast,Java,Hazelcast,该系统的总体架构是一个连接到hazelcast的轻量级应用程序服务器,以及两者之间的通用模型依赖关系。应用程序可能会停止运行,但业务需要hazelcast群集在升级之间保持运行(以避免丢失上下文会话数据) 如果我在hazelcast中定义了地图: <hz:map name="Fruit" backup-count="${hazelcast.default.backup-count}" time-to-live-

该系统的总体架构是一个连接到hazelcast的轻量级应用程序服务器,以及两者之间的通用模型依赖关系。应用程序可能会停止运行,但业务需要hazelcast群集在升级之间保持运行(以避免丢失上下文会话数据)

如果我在hazelcast中定义了地图:

        <hz:map name="Fruit"
                backup-count="${hazelcast.default.backup-count}"
                time-to-live-seconds="${hazelcast.default.time-to-live-seconds}"
                max-idle-seconds="${hazelcast.default.max-idle-seconds}"
                eviction-policy="${hazelcast.default.eviction-policy}"
                max-size="${hazelcast.default.max-size}"
                eviction-percentage="${hazelcast.default.eviction-percentage}"
                in-memory-format="${hazelcast.in-memory-format}"/>
假设应用程序、模型和hazelcast服务器的v1都已部署,并且在生产中运行良好。 然后,新的需求出现了,我不得不对Fruit类进行更改(更新serialVersionUID以表示对类的更改):

问题是,当我部署依赖于模型v2的新版本api(其中存在Fruit类)时,我得到一个异常:

com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.InvalidClassException: 

io.anew.hz.model.Fruit; local class incompatible: stream classdesc serialVersionUID = -5284413340344918080, local class serialVersionUID = -7184021704842980361
这对我来说很有意义,因为serialVersionUID已从版本1更改为版本2。我所设想并且目前正在努力解决的问题是在不导致集群停机的情况下管理这一更改


我的问题是:关于管理hazelcast对象依赖项的模型更改,其他人有什么经验?管理集群中不同模型更改的一些工作策略是什么?迁移是一种有效的策略吗

您可能想看看可以处理版本控制的自定义序列化程序。因此,通过在序列化时向流中添加版本,您知道在反序列化时如何处理它

寻找(确定的)可数据序列化、StreamSerializer和可移植的。

如果要向类添加新字段,由于明显的原因,这无法使用Java序列化来完成-一个版本的序列化对象无法反序列化到另一个版本,而不会造成潜在的数据丢失(即使serialVersionUID被篡改)

不幸的是,我认为如果您试图读取流中不存在的字段(当您开始在集群中滚动新类时会发生这种情况),Hazelcast也不能很好地发挥作用,它也不像您读取对象流的剩余字节,因此您必须滚动自己的字段

您需要支持(借用)的重要概念是未来数据

将来的数据指的是这样一个事实:当将对象反序列化为类的旧版本时,不会有字段来保存所有值。如果对象无法保存这些值,那么如果将该对象推回缓存(或从一个节点移动到另一个节点),这些值可能会丢失

自定义序列化需要支持的是从字节数组中读取已知值加上作为字节数组的剩余未知值的能力。这个包含未知值的字节数组可以存储在对象中,并在重新序列化时写回

一旦这个机制起作用,您只需要进行滚动升级,每个缓存节点依次升级

private static final long serialVersionUID = -5284413340344918080L;

public boolean isPoisonous(){
    return determineToxicityOnHumans();
}
com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.InvalidClassException: 

io.anew.hz.model.Fruit; local class incompatible: stream classdesc serialVersionUID = -5284413340344918080, local class serialVersionUID = -7184021704842980361