您好,提前感谢!
问题简而言之:
当使用自定义的单个串行器为所有项目的模型应用嵌入式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的所有应用程序时不会丢失数据。当全局反序列化程序用于应用程序端的所有项目类型时,您需要:
hazelcast.serialization.check-class-def-errors: false
至少用于未嵌入的Hazelcast- 确保所有结构设置为
in-memory-format: BINARY
- 在应用程序端,您需要为Exception.class和包"com.hazelcast"中的其他类型添加使用
JavaDefaultSerializers.JavaSerializer.class
的自定义反序列化程序
我会在使用一段时间后更新信息。
无论是嵌入式还是客户端/服务器,应用程序上的反序列化都会发生。原因-存储在Hazelcast服务器上的数据并非仅用于本地应用程序实例,而是用于连接到此集群的任何应用程序。嵌入式模式只是与集群对话的另一种方式,它不会影响数据操作的执行方式;除非手动将内存格式配置为其他格式,否则将再次应用于所有服务器。
附带说明:您还可以使用客户端API连接具有适当客户端库的应用程序,以连接嵌入式模式集群并与之通信。
要修复异常,您需要将域对象或正在服务器、服务器和应用程序类路径上写入的对象的类定义放置在其中。
注意:如果您使用的是IMap,那么您可以选择在服务器上以反序列化的形式存储数据,以便更快地执行计算或谓词/查询,但这不是您想要的。