[Erlang] ejabberd ऑनलाइन स्थिति जब उपयोगकर्ता कनेक्शन खो देता है


Answers

यह टीसीपी कनेक्शन की अच्छी तरह से ज्ञात सीमा है आपको कुछ स्वीकृति कार्यक्षमता लागू करने की आवश्यकता है

Xep-0184 में विकल्पों में से एक एक संदेश में रसीद अनुरोध हो सकता है और जब यह प्रेषित हो जाता है प्रेषक वापस जाता है।

एक अन्य विकल्प xep-0198 है यह स्ट्रीम प्रबंधन है जो कमानों को स्वीकार करता है

आप इसे पूरी तरह से आवेदन परत में लागू कर सकते हैं और प्राप्तकर्ता से प्रेषक को संदेश भेज सकते हैं। तदनुसार स्वीकृति दें जब स्वीकृति नहीं दी जाती है। ध्यान रखें कि प्रेषक -> सर्वर कनेक्शन भी उस तरह से कटे जा सकता है

मुझे ईजबेरड में उन एक्सपीएस और फीचर के कार्यान्वयन के बारे में जानकारी नहीं है। मैंने उन्हें परियोजना की आवश्यकताओं के आधार पर स्वयं को लागू किया था

Question

मेरे पास मोबाइल एप्लिकेशन के बीच एक्सएमपीपी सर्वर होने के लिए ईजबर्ड सेटअप है, अर्थात कस्टम आईफोन और एंड्रॉइड ऐप

लेकिन मैं प्रतीत होता है कि जिस तरह से ईजबेर्ड्ड ऑनलाइन स्थिति का प्रबंधन करता है, उसकी एक सीमा होती है।

परिदृश्य:

  • उपयोगकर्ता ए अपने मोबाइल के माध्यम से उपयोगकर्ता बी संदेश भेज रहा है।
  • उपयोगकर्ता बी सभी कनेक्टिविटी खो देता है, इसलिए ग्राहक सर्वर से डिस्कनेक्ट नहीं कर सकता।
  • ejabberd अभी भी उपयोगकर्ता बी को ऑनलाइन के रूप में सूचीबद्ध करता है
  • चूंकि ईजबेर्ड्ड मानता है कि उपयोगकर्ता बी अभी भी ऑनलाइन है, इसलिए यूजर ए से कोई भी संदेश मृत कनेक्शन पर पारित हो जाता है।
  • तो उपयोगकर्ता बी को संदेश नहीं मिलेगा, और न ही उसे ऑफ़लाइन संदेश के रूप में सहेज लिया जाता है, क्योंकि ईजबर्ड मानते हैं कि उपयोगकर्ता ऑनलाइन है
  • संदेश खो गया
  • जब तक कि एबबर्ड पता है कि कनेक्शन बासी है, यह एक ऑनलाइन उपयोगकर्ता के रूप में मानता है

और डेटा कनेक्शन के बदलावों में फेंकें (3 जी से 4 जी के लिए वाईफ़ाई ...) और आपको यह काफी कुछ हो रहा है।

mod_ping:

मैंने 10 सेकंड के अंतराल पर mod_ping लागू करने की कोशिश की।
https://www.process-one.net/docs/ejabberd/guide_en.html#modping
लेकिन प्रलेखन के अनुसार, उपयोगकर्ता को डिस्कनेक्ट करने से पहले पिंग प्रतिक्रिया के लिए 32 सेकंड इंतजार करेगा।
इसका अर्थ है कि एक 42 दूसरी विंडो होगी जहां उपयोगकर्ता अपना संदेश खो सकते हैं।

आदर्श समाधान:

यहां तक ​​कि अगर पिंग प्रतीक्षा समय कम हो सकता है, यह अभी भी एक सही समाधान नहीं है
क्या कोई रास्ता है कि ईजेबरबेर्ड संदेश छोड़ने से पहले ग्राहक से 200 प्रतिक्रिया का इंतजार कर सकता है? यदि कोई प्रतिक्रिया नहीं है तो इसे ऑफ़लाइन सहेजें
क्या इस समस्या को हल करने के लिए एक हुक लिखना संभव है?
या वहां एक सरल सेटिंग है जिसे मैंने कहीं याद किया?

एफवाईआई: मैं बॉश का इस्तेमाल नहीं कर रहा हूं




ईजेबरबेर्ड पर एक्सईपी -19 को लागू करना काफी शामिल है।

एर्लंग सॉल्यूशंस (मैं उनके लिए काम करता हूं) में ईजेबीबीडीड के लिए एक XEP-184 मॉड्यूल है, जो बढ़ाया कार्यक्षमता के साथ है, जो इस समस्या को हल करता है। यह सर्वर साइड पर बफरिंग और सत्यापन करता है जब तक क्लाइंट रसीद अनुरोध को ले जाने वाले संदेश भेजता है और जब यह प्रेषित प्रेषक को वापस भेज दिया जाता है।

यह देखने के लिए कि क्या संदेश प्राप्त हुआ है, मॉड्यूल प्राप्तियों को मान्य करता है। यदि समय के भीतर नहीं है, तो इसे ऑफ़लाइन संदेश के रूप में सहेज लिया जाता है।




Ejabberd नवीनतम संस्करण में डिफ़ॉल्ट रूप से स्ट्रीम प्रबंधन का समर्थन करता है। Ejabberd_c2s में सेट स्ट्रीम प्रबंधक कॉन्फ़िगर करने के बाद, आपको अपने क्लाइंट में कुछ कॉन्फ़िग सेट करना चाहिए। क्लाइंट में इस कॉन्फ़िग के लिए कृपया इस पोस्ट को देखें। https://community.igniterealtime.org/thread/55715