Hazelcast различная (де) сериализация для клиентов и mapstore - PullRequest
0 голосов
/ 06 июля 2018

Я использую Hazelcast для членов и клиентов со следующим контекстом:

Hazelcast clients, members with persistence Как показано на диаграмме выше:

  1. Я хочу, чтобы клиенты контролировали (де) сериализацию и добавляли новых клиентов без участия участников Hazelcast в бизнесе сериализации.
  2. Хотите сделать Hazelcast Map постоянным на основе соглашений об именах, например, Все карты с шаблоном соответствия "* Store" должны быть сохранены в Cassandra db.
  3. Поскольку я решил сохранить в двоичном формате, я хотел бы, чтобы тот же байт [], сохраненный в hazelcast, был передан в интерфейс mapstore.

Моя проблема в том, что hazelcast, кажется, применяет десериализатор перед вызовом метода mapstore .store () и ищет класс сериализатора с первоначально сохраненным typeId на стороне сервера. Логическим решением является то, что hazelcast не применяет десериализатор для mapstore, если мой тип mapstore является байтом [], или позволил мне определить десериализатор, который будет работать независимо от typeId. Похоже, оба не представляется возможным.

Любая идея для решения проблемы очень ценится.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

@ Киран,

Некоторые дополнения к ответу @wildnez:

  1. Обычно, если у вас есть Pojo и вы используете MapStore, участники также должны знать Pojo. Но в вашем случае, поскольку вы в порядке с byte [], вы можете сохранить запись как byte [] со стороны клиента, то есть IMap должен быть IMap. Тогда участники не будут иметь дело с какой-либо десериализацией. Таким образом, вы выполните сериализацию вручную и сохраните байт [] в Hazelcast IMap. В качестве альтернативы вы можете определить разные сериализаторы / десериализаторы для членов и клиентов, а для этих классов вы всегда можете вернуть byte [] для члена. Я лично предпочитаю первое решение.

  2. Определите подстановочный шаблон IMap для *Store map и поместите универсальную реализацию MapStore. Внедрив MapLoaderLifecycleSupport, вы также можете получить имя карты в вашем MapStore, если это необходимо. Пожалуйста, смотрите http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#storing-entries-to-multiple-maps

  3. Если ваша Карта IMap, вы также получите byte[] в вашем MapStore, как описано в 1.

0 голосов
/ 06 июля 2018

В случае по умолчанию (в формате памяти установлено значение BINARY) Сериализация и десериализация происходит только на стороне клиента. Однако вы используете MapStore, который требует, чтобы Hazelcast предоставлял фактический объект ввода методу MapStore.store , следовательно, десериализацию на сервере. В противном случае вы будете получать только байт [] в MapStore.

...