【发布时间】:2015-07-21 01:14:19
【问题描述】:
系统的总体架构是一个连接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
}
假设应用程序、模型和 hazelcast 服务器的 v1 都已部署,并且在生产中运行良好。 然后新的需求从木制品中浮现出来,我不得不对 Fruit 类进行更改(更新 serialVersionUID 以表示对类的更改):
private static final long serialVersionUID = -5284413340344918080L;
public boolean isPoisonous(){
return determineToxicityOnHumans();
}
问题是,当我部署依赖于模型 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 的对象依赖项方面有哪些经验?管理对集群的不同模型更改的一些工作策略是什么?迁移是一个有效的策略吗?
【问题讨论】: