नमस्ते और अग्रिम धन्यवाद!

प्रश्न संक्षेप में:

एम्बेडेड हेज़ेलकास्ट के साथ एप्लिकेशन के लिए सभी प्रोजेक्ट के मॉडल के लिए कस्टम सिंगल सीरियलाइज़र का उपयोग करते समय, "हेज़लकास्ट/हेज़लकास्ट" के लिए इस वैश्विक सीरियलाइज़र को स्थापित किए बिना "हेज़लकास्ट/हेज़लकास्ट" डॉकर छवि का उपयोग कैसे करें? या कारण है कि कोई रास्ता नहीं है।

अधिक:

मैं डॉकर झुंड में "हेज़लकास्ट/हेज़ेलकास्ट" डॉकर छवि का उपयोग करने जा रहा हूं, पूरी तरह से हेज़लकास्ट एम्बेडेड के साथ सभी अनुप्रयोगों को पुनरारंभ करते समय डेटा खोने में सक्षम होने के लिए। अन्य सभी मामलों के लिए, एप्लिकेशन में निर्मित इंस्टेंस का उपयोग किया जाता है। इसलिए, हेज़लकास्ट के डेटा के साथ सभी प्रत्यक्ष संचार केवल हेज़ेलकास्ट इंस्टेंस के माध्यम से एप्लिकेशन में एम्बेडेड होते हैं।

मैं रेप्लिकेटेड मैप और आईसेट संरचनाओं का उपयोग करता हूं। रेप्लिकेटेड मैप के लिए मैंने "इन-मेमोरी-फॉर्मेट: बाइनरी" सेट किया है। इसके अलावा, मैंने केवल अनुप्रयोगों के लिए कस्टम ग्लोबल सीरिएलाइज़र सेट किया है - मुझे अपने सभी प्रोजेक्ट प्रकारों के लिए वास्तविक *। क्लास को डी-सीरियलाइज़ करने के लिए अपने कस्टम लॉजिक के साथ एक सीरिएलाइज़र की आवश्यकता है।

मुझे "हेज़लकास्ट/हेज़लकास्ट" कंटेनर लॉग में निम्न त्रुटि दिखाई देती है:

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:
  serialization:
    check-class-def-errors: false

इसलिए, मैं उम्मीद कर रहा हूं कि "हेज़लकास्ट/हेज़लकास्ट" डॉकर नोड्स के भीतर डेटा डी-सीरियलाइजेशन का कोई कारण नहीं है। मैं कहाँ गलत हूँ?

मेरे कस्टम सीरिएलाइज़र लॉग पर भी मुझे "HazelcastException.class, ClusterState.class, IllegalArgumentException.class" प्रकार देखकर आश्चर्य हुआ। मैं इसे हेज़लकास्ट्स के 'JavaDefaultSerializers.JavaSerializer.class' का उपयोग करके इस प्रकार के लिए कस्टम सीरिएलाइज़र जोड़कर ठीक करने का प्रयास कर रहा हूं। इस कदम के साथ कहीं, मुझे लगा कि मैं कुछ गलत कर रहा हूं... :) मैंने जो अंतिम प्रकार जोड़े थे, वे थे IllegalArgumentException और Exception अंत में। अभी रिजल्ट का इंतजार है...

शायद मुझे कुछ सेटिंग याद आ रही है। लेकिन यदि संभव हो, तो मैं अपनी खुद की डॉकर छवि बनाए बिना और यदि संभव हो तो इसके लिए वैश्विक deserializer स्थापित करना चाहता हूं। या कम से कम यह पता लगाएं कि यह असंभव क्यों है।

अगर यह मदद करता है, हो सकता है कि मैं आईसेट के बिना कर सकूं। लेकिन निश्चित रूप से इसका उपयोग करने में सक्षम होना बेहतर होगा।

हेज़लकास्ट का उपयोग करने का कारण रेप्लिकेटेड मैप का उपयोग करना है। मैं सेवाओं की तरह 'user_api' की प्रतिक्रिया को तेज करने के लिए कोशिश करता हूं, जब डॉकर झुंड में कई अलग-अलग सेवाएं होती हैं जो वहां डेटा लिखती हैं और पूरे वास्तविक डेटा को एक मशीन (~ 1-2 जीबी) में संग्रहीत किया जा सकता है।

अद्यतन ०४.११.२० २१:४८:

मैंने स्थानीय रूप से मामले का परीक्षण किया जब ऐप (एम्बेडेड हेज़ेलकास्ट के साथ) दो बार शुरू हुआ और एक अलग हेज़ेलकास्ट। और अब ऐसा लगता है कि सब ठीक चल रहा है। तो, अंत में टाइप करें जो मैंने डी-सीरियलाइज़ेशन पर पकड़ा: PartitionMigratingException, CallerNotMemberException, RetryableHazelcastException, WrongTargetException and ClusterState

ऐसा लगता है कि हेज़लकास्ट के JavaDefaultSerializers.JavaSerializer.class का उपयोग करके Exception.class and ClusterState.class प्रकार के लिए कस्टम धारावाहिक निर्दिष्ट करने से समस्या हल हो जाती है। लेकिन यह विशेष रूप से ClusterState.class मामले के लिए अजीब है।

अंतिम सरल है enum और यह संकेत देता है कि मुझे क्रमिक समस्याओं से बचने के लिए अंततः 'com.hazelcast' से सभी वर्गों को जोड़ने की आवश्यकता है ...

और मेरे प्रश्न का उत्तर हो सकता है:

अलग-अलग हेज़लकास्ट इंस्टेंस का उपयोग करते समय केवल हेज़लकास्ट एम्बेडेड के साथ सभी एप्लिकेशन को पुनरारंभ करते समय डेटा खोने में सक्षम होने के लिए। और जब वैश्विक deserializer ऐप साइड में सभी प्रोजेक्ट प्रकारों के लिए उपयोग किया जाता है, तो आपको इसकी आवश्यकता होती है:

  1. hazelcast.serialization.check-class-def-errors: false कम से कम एम्बेडेड हेज़लकास्ट के लिए नहीं
  2. सुनिश्चित करें कि सभी संरचनाएं in-memory-format: BINARY के साथ सेटिंग कर रही हैं
  3. ऐप साइड में आपको Exception.class और पैकेज 'com.hazelcast' से अन्य प्रकारों के लिए JavaDefaultSerializers.JavaSerializer.class का उपयोग करके कस्टम deserializer जोड़ने की जरूरत है।

मैं कुछ समय तक इसका उपयोग करने के बाद जानकारी को अपडेट करूंगा।

0
Timur Efimov 3 नवम्बर 2020, 18:08

2 जवाब

सबसे बढ़िया उत्तर

ऐप पर डिसेरिएलाइज़ेशन होगा चाहे वह एम्बेडेड हो या क्लाइंट/सर्वर। कारण - हेज़लकास्ट सर्वर पर संग्रहीत डेटा केवल स्थानीय ऐप इंस्टेंस के लिए नहीं है बल्कि इस क्लस्टर से कनेक्ट होने वाले किसी भी एप्लिकेशन के लिए है। एंबेडेड मोड क्लस्टर से बात करने का एक और तरीका है, यह प्रभावित नहीं करता है कि आपका डेटा संचालन कैसे किया जाएगा; जब तक कि आपने इन-मेमोरी-प्रारूप को किसी अन्य चीज़ में मैन्युअल रूप से कॉन्फ़िगर नहीं किया है, जो फिर से सभी सर्वरों पर लागू होगा।

साइड नोट: आप एक एम्बेडेड मोड क्लस्टर के साथ कनेक्ट और संचार करने के लिए क्लाइंट एपीआई का उपयोग करके उपयुक्त क्लाइंट लाइब्रेरी के साथ एक ऐप भी कनेक्ट कर सकते हैं।

0
wildnez 5 नवम्बर 2020, 16:41

सीरियलाइज़ेशन/डिसेरिएलाइज़ेशन एक वितरित सिस्टम से डेटा को संग्रहीत करने और पुनर्प्राप्त करने की प्रक्रिया का हिस्सा है। जब डेटा किसी भी डेटा संरचना को डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ लिखा जाता है, तो डेटा को क्रमबद्ध किया जाता है। जब डेटा पूछताछ की जाती है, तो इसे एप्लिकेशन पक्ष पर deserialized किया जाता है। और यह परिनियोजन रणनीति की परवाह किए बिना होता है - क्लाइंट/सर्वर या एप्लिकेशन में एम्बेडेड, डॉकर या कोई डॉकर नहीं।

अपवाद को ठीक करने के लिए, आपको अपने डोमेन ऑब्जेक्ट या सर्वर पर लिखी जा रही वस्तुओं की वर्ग परिभाषा को सर्वर पर और साथ ही अनुप्रयोगों के क्लासपाथ पर रखना होगा।

नोट: यदि आप IMap का उपयोग कर रहे थे, तो आपके पास सर्वर पर डेटा को डिसेरिएलाइज़्ड रूप में संग्रहीत करने का विकल्प है, तेज़ गणना या विधेय/प्रश्नों के निष्पादन के लिए, लेकिन यह वह नहीं है जिसकी आप तलाश कर रहे हैं।

0
wildnez 4 नवम्बर 2020, 02:45