Hazelcast 为客户端和 mapstore 进行不同的(反)序列化

Hazelcast different (de)serialization for clients and mapstore

我是 运行 hazelcast 成员和客户,背景如下:

如上图所示:

  1. 我希望客户控制(反)序列化,并在没有 hazelcast 成员参与序列化业务的情况下加入新客户。
  2. 想要根据命名约定使 Hazelcast Map 持久化,例如所有带有“*Store”匹配模式的地图,需要持久化到cassandra db。
  3. 因为我选择坚持二进制格式,所以我希望将存储在 hazelcast 中的相同 byte[] 提供给 mapstore 接口。

我的问题是 - hazelcast 似乎在调用 mapstore .store() 方法之前应用了反序列化器,并在服务器端查找具有最初存储的 typeId 的序列化器 class。合乎逻辑的解决方案是,如果我的 mapstore 类型是 byte[],hazelcast 不会为 mapstore 应用反序列化器,或者让我定义反序列化器,无论 typeId 如何都可以工作。看起来两者似乎都不可能。

非常感谢任何解决问题的想法。

在默认情况下(内存格式设置为二进制)序列化和反序列化只发生在客户端。但是,您使用的 MapStore 需要 Hazelcast 向 MapStore.store 方法提供实际的条目对象,因此在服务器上进行反序列化。否则你只会在 MapStore 中收到一个 byte[]。

@kiran,

@wildnez 回答的一些补充:

  1. 通常情况下,如果您有 Pojo 并使用 MapStore,会员也需要了解 Pojo。但在你的情况下,因为你可以使用 byte[],你可以从客户端将条目存储为 byte[],这意味着你的 IMap 必须是 IMap。那么成员将不会进行任何反序列化处理。因此,您将手动进行序列化并将 byte[] 存储到 Hazelcast IMap。作为替代方案,您可以为成员和客户定义不同的 serializers/deserializers,对于那些 类,您始终可以在成员上 return byte[]。我个人更喜欢第一种方案。

  2. *Store 地图定义一个通配符 IMap 配置并放置一个通用的 MapStore 实现。通过实现 MapLoaderLifecycleSupport,如果需要,您还可以在 MapStore 中获取地图名称。请参阅 http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#storing-entries-to-multiple-maps

  3. 如果您的地图是 IMap,那么您也会在 MapStore 中获得 byte[],如 1.

  4. 中所述