Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在单独的docker Hazelcast节点(应用程序中嵌入的主节点)禁用数据反序列化过程_Java_Serialization_Docker Swarm_Hazelcast - Fatal编程技术网

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

Java 如何在单独的docker Hazelcast节点(应用程序中嵌入的主节点)禁用数据反序列化过程,java,serialization,docker-swarm,hazelcast,Java,Serialization,Docker Swarm,Hazelcast,您好,提前谢谢 简言之,问题是: 当为所有项目模型使用自定义单一序列化程序用于嵌入Hazelcast的应用程序时,如何使用“Hazelcast/Hazelcast”docker映像,而不为“Hazelcast/Hazelcast”设置此全局序列化程序?或者为什么没有办法 更多: 我将在docker Swarm中使用“hazelcast/hazelcast”docker映像,以便在重新启动嵌入hazelcast的所有应用程序时不会丢失数据。对于所有其他情况,将使用内置到应用程序中的实例。因此,与h

您好,提前谢谢

简言之,问题是: 当为所有项目模型使用自定义单一序列化程序用于嵌入Hazelcast的应用程序时,如何使用“Hazelcast/Hazelcast”docker映像,而不为“Hazelcast/Hazelcast”设置此全局序列化程序?或者为什么没有办法

更多: 我将在docker Swarm中使用“hazelcast/hazelcast”docker映像,以便在重新启动嵌入hazelcast的所有应用程序时不会丢失数据。对于所有其他情况,将使用内置到应用程序中的实例。因此,与hazelcast数据的所有直接通信仅通过嵌入到应用程序中的hazelcast实例进行

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

我在“hazelcast/hazelcast”容器日志中看到以下错误:

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
因此,我认为没有理由在“hazelcast/hazelcast”docker节点中进行数据反序列化。我错在哪里

同样在我的自定义序列化程序日志中,我惊讶地看到“HazelcastException.class、ClusterState.class、IllegalArgumentException.class”类型。我试图使用hazelcasts的“JavaDefaultSerializers.JavaSerializer.class”为这种类型添加自定义序列化程序来修复它。 在这一步的某个地方,我觉得我做错了什么…:) 我最后添加的类型是IllegalArgumentException和Exception finally。现在等待结果

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

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

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

更新04.11.20 21:48: 当应用程序(带有嵌入式Hazelcast)启动两次和一次单独的Hazelcast时,我在本地测试了这个案例。现在看来一切都很顺利。因此,我在反序列化时捕获的最后一个类型是:
PartitionMigratingException、CallerNotMemberException、RetryableHazelcastException、ErrorTargetException和ClusterState

似乎使用Hazelcast的
JavaDefaultSerializers.JavaSerializer.class
为类型
Exception.class和ClusterState.class
指定自定义序列化程序可以解决问题。但这很奇怪,尤其是对于
ClusterState.class
case

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

也许我的问题的答案是: 单独使用单独的Hazelcast实例,以便在重新启动嵌入Hazelcast的所有应用程序时不会丢失数据。当全局反序列化器用于应用程序端的所有项目类型时,您需要:

  • hazelcast.serialization.check-class-def-errors:false
    至少对于未嵌入的hazelcast
  • 确保所有结构设置为内存格式为:二进制
  • 在应用程序端,您需要使用包'com.hazelcast'中的Exception.class和其他类型的
    JavaDefaultSerializers.JavaSerializer.class
    添加自定义反序列化程序

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

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

    要修复此异常,您需要将域对象或正在写入服务器、服务器以及应用程序的类路径上的对象的类定义放在一起


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

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


    旁注:您还可以使用客户端API将应用程序连接到合适的客户端库,以连接嵌入式模式群集并与之通信。

    谢谢。但我不明白。我想我忘了指出:我将ReplicatedMap配置为按“内存格式:二进制”存储字节。正如您所注意到的,数据在应用程序端反序列化。因此,我仍然不明白为什么不嵌入Hazelcast(单独的默认docker映像“Hazelcast/Hazelcast”)应该进行反序列化。它仅在Hazelcast群集之间的同步/重新分区期间接收/发送数据。在带有嵌入式Hazelcast(也是成员,而不是客户端)的应用程序上,执行简单的put/get操作。如果我只使用应用程序,则不会出现错误。埃罗