Hazelcast 和自定义序列化程序的需要;在创建服务器时有效,但在连接到现有服务器时无效
Hazelcast and the need for custom serializers; works when creating the server but not when connecting to existing
我们正在使用 Hazelcast 在分布式地图中存储内容。我们在使用远程服务器时遇到问题,我需要一些关于我们可以采取哪些措施来解决该问题的反馈。
我们创建服务器 - WORKS
我们在应用程序的 JVM 中创建一个新服务器 (Hazelcast.newHazelcastInstance
)。我们传入的 hazelcast Config
对象有一堆自定义序列化器,为我们要放入映射中的所有类型定义。我们的对象是 Protobuf、普通 java 对象以及两者的组合。服务器启动,我们可以将对象放入地图中,稍后再取回对象。我们最近决定在自己的专用服务器上启动 运行 Hazelcast,因此我们尝试了以下方案。
服务器已经存在于外部,我们作为客户端连接 - 不起作用
我们连接到一个已经是 运行 的远程实例,而不是创建我们的 Hazelcast 实例。我们传入一个配置,其中包含我们之前使用的所有相同的序列化程序。我们成功连接到 Hazelcast,我们可以将东西放入地图中(据我所知是有效的)但我们没有得到任何东西。不会触发任何事件让我们的听众知道对象已添加到地图中。
我希望能够连接到已经 运行 在我们的 JVM 之外的 Hazelcast 实例。它不适用于我们的用例,我不确定它应该如何工作。
- JVM 运行 Hazelcast 在其 class 加载程序中是否需要我们可能放入映射中的所有 class 类型?看起来这可能就是问题所在,但这不会限制使用 Hazelcast 吗?
- 您通常如何处理这些 class 加载程序问题?
- 假设以上为真,有没有办法告诉 Hazelcast 我们将在将对象放入地图之前对其进行序列化?基本上我们会给 Hazelcast 一个 ID 和字节数组,这就是我们在 return 中所期望的。如果是这样,就可以避免整个 class 加载程序问题,我想我们已经 运行 了。我们不需要能够根据对象的字段来搜索对象。我们只需要知道对象来来去去以及它们的 ID 是什么。
@Jonathan,在使用客户端-服务器架构时,除非您使用查询或其他需要在集群上序列化数据的操作,否则成员不需要了解任何关于序列化的知识。他们只是存储已经序列化的数据并提供服务。如果您提到的这些侦听器在客户端应用程序上,它应该可以正常工作。
Hazelcast 有一项称为用户代码部署的功能,https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-user-code-deployment-beta,但它主要针对用户 类。序列化相关的配置应该出现在成员上,或者你应该稍后添加并滚动重启。
如果你能分享一些exceptions/setup等,我也可以给出具体的答案。
我们正在使用 Hazelcast 在分布式地图中存储内容。我们在使用远程服务器时遇到问题,我需要一些关于我们可以采取哪些措施来解决该问题的反馈。
我们创建服务器 - WORKS
我们在应用程序的 JVM 中创建一个新服务器 (Hazelcast.newHazelcastInstance
)。我们传入的 hazelcast Config
对象有一堆自定义序列化器,为我们要放入映射中的所有类型定义。我们的对象是 Protobuf、普通 java 对象以及两者的组合。服务器启动,我们可以将对象放入地图中,稍后再取回对象。我们最近决定在自己的专用服务器上启动 运行 Hazelcast,因此我们尝试了以下方案。
服务器已经存在于外部,我们作为客户端连接 - 不起作用
我们连接到一个已经是 运行 的远程实例,而不是创建我们的 Hazelcast 实例。我们传入一个配置,其中包含我们之前使用的所有相同的序列化程序。我们成功连接到 Hazelcast,我们可以将东西放入地图中(据我所知是有效的)但我们没有得到任何东西。不会触发任何事件让我们的听众知道对象已添加到地图中。
我希望能够连接到已经 运行 在我们的 JVM 之外的 Hazelcast 实例。它不适用于我们的用例,我不确定它应该如何工作。
- JVM 运行 Hazelcast 在其 class 加载程序中是否需要我们可能放入映射中的所有 class 类型?看起来这可能就是问题所在,但这不会限制使用 Hazelcast 吗?
- 您通常如何处理这些 class 加载程序问题?
- 假设以上为真,有没有办法告诉 Hazelcast 我们将在将对象放入地图之前对其进行序列化?基本上我们会给 Hazelcast 一个 ID 和字节数组,这就是我们在 return 中所期望的。如果是这样,就可以避免整个 class 加载程序问题,我想我们已经 运行 了。我们不需要能够根据对象的字段来搜索对象。我们只需要知道对象来来去去以及它们的 ID 是什么。
@Jonathan,在使用客户端-服务器架构时,除非您使用查询或其他需要在集群上序列化数据的操作,否则成员不需要了解任何关于序列化的知识。他们只是存储已经序列化的数据并提供服务。如果您提到的这些侦听器在客户端应用程序上,它应该可以正常工作。
Hazelcast 有一项称为用户代码部署的功能,https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-user-code-deployment-beta,但它主要针对用户 类。序列化相关的配置应该出现在成员上,或者你应该稍后添加并滚动重启。
如果你能分享一些exceptions/setup等,我也可以给出具体的答案。