【问题标题】:Managing changes to model objects in hazelcast?管理 hazelcast 中模型对象的更改?
【发布时间】: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 的对象依赖项方面有哪些经验?管理对集群的不同模型更改的一些工作策略是什么?迁移是一个有效的策略吗?

【问题讨论】:

    标签: java hazelcast


    【解决方案1】:

    您可能想查看可以处理版本控制的自定义序列化程序。所以在序列化的时候给流加一个版本,就知道反序列化的时候怎么处理了。

    寻找(已识别)DataSerializable、StreamSerializer 和 Portable。 https://github.com/hazelcast/hazelcast-code-samples/tree/master/serialization

    【讨论】:

      【解决方案2】:

      如果您要向一个类添加新字段,由于显而易见的原因,这不能使用 Java 序列化来完成 - 一个版本的序列化对象不能反序列化到另一个版本而不会丢失潜在的数据(即使 serialVersionUID 是捏造的)。

      不幸的是,如果您尝试读取流中不存在的字段(当您开始通过集群推出新课程时会发生这种情况),我认为 Hazelcast 的 Portable serialization mechanism 不会很好地发挥作用,也不会就像您读取对象流的剩余字节一样,因此您将不得不滚动拥有Custom serialization mechanism

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 2013-09-10
        • 2022-07-20
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        相关资源
        最近更新 更多