如何在单独的docker Hazelcast节点(嵌入应用程序中的主要节点)禁用数据的反序列化过程



您好,提前感谢!

问题简而言之:

当使用自定义的单个串行器为所有项目的模型应用嵌入式Hazelcast时,如何使用";榛子铸件/榛子铸件";docker映像,而不为";榛子铸件/榛子铸件";?或者为什么没有办法。

更多信息:

我将使用";榛子铸件/榛子铸件";docker Swarm中的docker镜像仅用于在重新启动嵌入榛子cast的所有应用程序时不会丢失数据。对于所有其他情况,将使用应用程序中内置的实例。因此,所有与hazelcast数据的直接通信都只能通过嵌入到应用程序中的hazelcast实例进行。

我使用ReplicatedMap和ISet结构。对于ReplicatedMap;存储器格式:二进制";。此外,我只为应用程序设置了自定义全局序列化程序——我需要一个用于所有项目类型的序列化程序,以及用于确定要在.中反序列化的实际*.class的自定义逻辑

我在";榛子铸件/榛子铸件";容器日志:

2020-11-03 00:41:50,180 [ERROR] [hz.pedantic_maxwell.partition-operation.thread-4] [c.h.s.i.o.i.OperationRunnerImpl]: [192.168.1.103]:5700 [dev] [4.0.3] There is no suitable de-serializer for type 1. This exception is likely caused by differences in the serialization configuration between members or between clients and members.
com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable de-serializer for type 1. This exception is likely caused by differences in the serialization configuration between members or between clients and members.
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.newHazelcastSerializationException(AbstractSerializationService.java:254) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:280) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:567) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.nio.IOUtil.readObject(IOUtil.java:141) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.replicatedmap.impl.operation.VersionResponsePair.readData(VersionResponsePair.java:58) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.replicatedmap.impl.operation.ReplicateUpdateOperation.readInternal(ReplicateUpdateOperation.java:109) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.operationservice.Operation.readData(Operation.java:750) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:106) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:51) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:203) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.NodeEngineImpl.toObject(NodeEngineImpl.java:339) ~[hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:407) [hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:166) [hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:136) [hazelcast-all-4.0.3.jar:4.0.3]
at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:123) [hazelcast-all-4.0.3.jar:4.0.3]

但我想不出原因。所有节点都是成员,并且只有应用程序嵌入的Hazelcast节点从ReplicatedMap和ISet写入和获取数据。我还尝试设置以下设置:

hazelcast:
serialization:
check-class-def-errors: false

因此,我期望在";榛子铸件/榛子铸件";docker节点。我哪里错了?

同样在我的自定义序列化程序日志中,我惊讶地看到";HazelcastException.class、ClusterState.class,IllegalArgumentException.cclass";类型。我试图通过使用hazecasts的"JavaDefaultSerializer.JavaSerializer.class"为该类型添加自定义序列化程序来修复此问题。在这一步的某个地方,我以为我做错了什么…:)我最后添加的类型是IllegalArgumentException和Exception。正在等待结果。。。

也许我错过了一些设定。但如果可能的话,我不想创建自己的docker映像,也不想为它设置全局反序列化程序。或者至少弄清楚为什么这是不可能的。

如果有帮助的话,也许我可以不用ISet。但当然,能够使用它会更好

使用ReplicatedMap是使用Hazelcast的原因。当docker群中有几个单独的服务在那里写入数据,并且整个实际数据可以存储在一台机器内(约1-2GB)时,我尝试它来加快类似"user_api"的服务的响应。

更新时间:04.11.20 21:48:

我在本地测试了应用程序(嵌入Hazelcast)启动两次和一次单独的Hazelcast。现在看来一切都很好。所以,最后我在反序列化中找到了类型:PartitionMigratingException, CallerNotMemberException, RetryableHazelcastException, WrongTargetException and ClusterState

似乎使用hazelcasts的JavaDefaultSerializers.JavaSerializer.class为类型Exception.class and ClusterState.class指定自定义序列化程序就解决了这个问题。但这很奇怪,尤其是对于ClusterState.class的情况。

最后一个是简单的enum,它表示我最终需要添加"com.hazelcast"中的所有类,以避免序列化问题。。。

也许可以回答我的问题:

当使用单独的Hazelcast实例时,仅为了在重新启动嵌入了Hazelccast的所有应用程序时不会丢失数据。当全局反序列化程序用于应用程序端的所有项目类型时,您需要:

  1. hazelcast.serialization.check-class-def-errors: false至少用于未嵌入的Hazelcast
  2. 确保所有结构设置为in-memory-format: BINARY
  3. 在应用程序端,您需要为Exception.class和包"com.hazelcast"中的其他类型添加使用JavaDefaultSerializers.JavaSerializer.class的自定义反序列化程序

我会在使用一段时间后更新信息。

无论是嵌入式还是客户端/服务器,应用程序上的反序列化都会发生。原因-存储在Hazelcast服务器上的数据并非仅用于本地应用程序实例,而是用于连接到此集群的任何应用程序。嵌入式模式只是与集群对话的另一种方式,它不会影响数据操作的执行方式;除非手动将内存格式配置为其他格式,否则将再次应用于所有服务器。

附带说明:您还可以使用客户端API连接具有适当客户端库的应用程序,以连接嵌入式模式集群并与之通信。

序列化/反序列化是从分布式系统存储和检索数据过程的一部分。当数据被写入到具有默认配置的任何数据结构中时,数据将被序列化。当数据被查询时,它在应用程序端被反序列化。无论部署策略是客户端/服务器还是嵌入应用程序、Docker还是无Docker,都会发生这种情况。

要修复异常,您需要将域对象或正在服务器、服务器和应用程序类路径上写入的对象的类定义放置在其中。

注意:如果您使用的是IMap,那么您可以选择在服务器上以反序列化的形式存储数据,以便更快地执行计算或谓词/查询,但这不是您想要的。

最新更新