系统的一般体系结构是一个轻量级应用服务器,它连接到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}"/>
其中存储了一个名为Fruit的类:
public class Fruit implements Serializable {
private static final long serialVersionUID = -7184021704842980361;
//some fields and methods
}
假设app,model和hazelcast服务器的v1都已部署,并且在生产环境中运行良好。 然后木制品出现了新的要求,我不得不对Fruit类进行更改(更新serialVersionUID以表示对类的更改):
private static final long serialVersionUID = -5284413340344918080L;
public boolean isPoisonous(){
return determineToxicityOnHumans();
}
问题在于,当我部署一个新版本的api时,它取决于模型的v2(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的对象依赖关系方面,还有其他一些人的经验是什么?管理集群的不同模型更改有哪些工作策略?迁移是一种有效的策略吗?
答案 0 :(得分:2)
您可能希望了解可以处理版本控制的自定义序列化程序。因此,通过在序列化时向流添加版本,您知道在反序列化时如何处理它。
查找(已识别)DataSerializable,StreamSerializer和Portable。 https://github.com/hazelcast/hazelcast-code-samples/tree/master/serialization
答案 1 :(得分:1)
如果要向类添加新字段,由于显而易见的原因,这不能使用Java序列化完成 - 一个版本的序列化对象无法反序列化到另一个版本而不会丢失潜在数据(即使serialVersionUID被捏造)。 &p>&#xA;&#xA;
不幸的是我不认为Hazelcast的便携式序列化机制,如果您尝试读取流中不存在的字段(当您开始通过集群滚动新类时将会发生这种情况),则可以很好地运行,也不喜欢你读取对象流的剩余字节,所以你将不得不自己滚动自定义序列化机制。
&#xA;&#xA;您需要支持的重要概念(借用 Coherence )是 future data 之一。
&#xA;&#xA;未来数据是指事实上,当将对象反序列化为旧版本的类时,将不会有字段来保存所有值。如果对象没有办法保存这些值,那么如果将此对象推回缓存(或从一个节点移动到另一个节点),它们可能会丢失。
&#xA;&#xA;您的自定义序列化需要支持的是能够从字节数组中读取已知值以及剩余的未知值作为字节数组。这个包含未知值的字节数组可以存储在对象中,并在重新序列化时写回。
&#xA;&#xA;一旦这个机制正常工作,你只需要做滚动升级,每个缓存节点依次升级。
&#xA;