2012-10-22 22 views
14

मैंने जीसीएम समर्थन के साथ एक एंड्रॉइड ऐप सेट किया है, और ऐप को एक संदेश भेजने के लिए थोड़ा परीक्षण ऐप है। जब मैं एमुलेटर में ऐप चलाता हूं, तो मैं देख सकता हूं (लॉगिंग संदेश के माध्यम से) कि यह जीसीएम के साथ पंजीकृत है और टोकन प्राप्त करता है।जीसीएम संदेश वितरण समय WILDLY अनियमित

फिर जब मैं अपने टेस्ट ऐप में टोकन डालता हूं और इसे एक संदेश भेजता हूं, तो परिणाम दिखाता है कि 1 संदेश भेजा गया था, 0 विफल हुआ था, और 0 में आईडी परिवर्तन थे।

कभी-कभी संदेश लगभग तुरंत दिखाई देता है, कभी-कभी इसमें 20 मिनट लगते हैं। शुक्रवार को, मेरे 2 टेस्ट संदेश में 15 और 20 मिनट लग गए। पहली बार मैंने आज सुबह भेजा था, अगला वाला अभी तक नहीं दिखाया गया है - यह केवल 10 मिनट रहा है ...

क्या डिलीवरी के समय लगातार तेज़ करने के लिए मैं कुछ भी कर सकता हूं? एक यादृच्छिक 20 मिनट की देरी काफी अस्वीकार्य स्थिति होगी।

+1

मैं भी इस व्यवहार देखा है और मुझे लगता है कि 10 मिनट की समय समाप्ति के कुछ प्रकार जब जुड़ा हुआ है वाई-फाई के माध्यम से। मैंने इसके बारे में Google समूह पर पोस्ट किया है, लेकिन अब तक कोई प्रतिक्रिया नहीं है: https://groups.google.com/d/msg/android-gcm/Y33c9ib54jY/vmJRFv0SmKYJ –

उत्तर

-1

क्या डिलीवरी के समय लगातार तेज़ करने के लिए मैं कुछ भी कर सकता हूं?

उत्पादन में, वितरण के समय अत्यधिक परिवर्तनीय होंगे क्योंकि मोबाइल डिवाइस मोबाइल हैं, और इसलिए जीसीएम के भीतर किसी भी डिलीवरी के मुद्दों से ऊपर और परे परिवर्तनीय कनेक्टिविटी है।

+0

चूंकि यह एमुलेटर के साथ है, जो ऑनलाइन है, यह मुद्दा नहीं है। ऐसा लगता है कि जीसीएम संदेश देने के लिए वास्तव में कम ग्रेड वाला अप्रत्याशित तरीका है। – CasaDelGato

+0

मैं अपने पैन्टेक फोन के साथ भी इसका परीक्षण कर रहा हूं, जिसमें एक अच्छा वाईफाई कनेक्शन है। संदेश प्राप्त करने में आमतौर पर 2-5 मिनट लगते हैं। मैंने देखा है कि दिन के दौरान मैं जो पहला संदेश भेजता हूं, लगभग तुरंत आता है, उसके बाद, उन्हें देरी हो जाती है। – CasaDelGato

+1

सहमत है, लेकिन मैं निरंतर कनेक्टिविटी के साथ कड़ाई से नियंत्रित स्थितियों के तहत इस मुद्दे को पुन: उत्पन्न कर सकता हूं। मेरा मानना ​​है कि डिवाइस और सर्वर के बीच कनेक्शन अज्ञात कारणों से लगभग 10 मिनट के बाद चुपचाप गिरा दिया गया है, और डिवाइस 15 मिनट "दिल की धड़कन" अलार्म बंद होने पर ही पुनः कनेक्ट हो जाता है। –

4

आप तेजी से वितरण की गारंटी नहीं दे सकते क्योंकि जीसीएम डिवाइस कनेक्टिविटी से खराब हो सकता है क्योंकि कॉमन्सवेयर ने बताया है। हालांकि, डिलीवरी ट्रेन में दो संभावित देरी हैं: 1) जीसीएम फोन से कनेक्ट (जैसा कि पहले उल्लेख किया गया है) और 2) वास्तव में जीसीएम सर्वर से संदेश में देरी हो रही है। यदि आप अपने भेजने के आवेदन में 'time_to_live' पैरामीटर 0 सेकंड पर सेट करते हैं, तो आप कम से कम परीक्षण कर सकते हैं कि देरी हो रही है।

0 सेकंड का मान का अर्थ है कि संदेश तुरंत भेजा जाएगा और यदि वितरण असफल है, तो संदेश जीसीएम सर्वर पर त्याग दिया जाएगा। यह वास्तविक जीवन के उपयोग के लिए व्यावहारिक मूल्य नहीं है, लेकिन यह आपको यह पता लगाने में सक्षम करेगा कि डिलीवरी ट्रेन का कौन सा हिस्सा देरी कर रहा है।

+0

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

+0

हाँ 0 पर टीटीएल के साथ, अगर फोन तुरंत संदेश नहीं मिलता है, तो जीसीएम सर्वर के पास फोन से कोई कनेक्शन नहीं है। यह तब हार जाएगा और संदेश को फिर से भेजने की कोशिश नहीं करेगा। – NickT

+2

टीटीएल = 0 और टीटीएल = 1 दिन के साथ परीक्षण में कोई फर्क नहीं पड़ता है। कभी-कभी संदेश तुरंत दिखाई देता है, कभी-कभी इसमें लंबा समय लगता है। (ठीक है, टीटीएल = 0 के साथ, संदेश सिर्फ कभी दिखाई नहीं दे सकता है।) यादृच्छिक 15-20 मिनट की देरी होने पर, जब डिवाइस ऑनलाइन और सक्रिय होता है, तो जीसीएम अपेक्षाकृत अविश्वसनीय लगता है, और एक बेहद खराब उपयोगकर्ता अनुभव। (क्या आपको लगता है कि कोई पाठ संदेश भेज रहा है, उसे ध्यान में आने में 20 मिनट लगने पर कोई ध्यान नहीं दिखेगा?) – CasaDelGato

30

हमें एक ही समस्या थी, लेकिन यह नेटवर्क-टू-नेटवर्क से भिन्न है। हमें लगता है कि यह घर हब राउटर (एक वर्जिन सुपर हब) निष्क्रियता के पांच मिनट के बाद कनेक्शन छोड़ रहा था। आप कनेक्शन को जीवित रखने के लिए हर दो मिनट में एक खाली जीसीएम संदेश भेजकर पुष्टि कर सकते हैं। https://groups.google.com/d/msg/android-gcm/Y33c9ib54jY/YxnCkaPRHRQJ

+2

रूपर्ट रॉन्सले, आपने जीसीएम विलंबता समस्या का कुछ शानदार शोध किया है, जिसे आपने उपरोक्त Google समूह लिंक में प्रकाशित किया है। यदि आप जीसीएम के हर 2 मिनट में भेजते हैं तो यह – HitOdessit

0

यह बात मेरे लिए महत्वपूर्ण है:

यहाँ हम क्या किया की एक अधिक विस्तृत विवरण है।

मैंने इस कोड को एक दूसरे टाइमर हैंडलर के अंदर प्रत्येक 2 मिनट में एक जीसीएम संदेश भेजने के लिए सेट अप किया है। उम्मीद है कि यह चीजों को जिंदा रखना होगा

  if ((mOneSecondTick %120) == 0){ 
      // q 1 minute check when we got last call.... 
      long lDiff = System.currentTimeMillis() - GCMlastCall; 
      if (PushAndroidActivity.GCMAvailable){ 
       Log.d("pushAndroidActivity",String.format("(mOneSecondTick %d",lDiff)); 
       if (lDiff > 122 * 1000){ // more than a minute 
        Intent intent = new Intent(StayInTouch.this,PushAndroidActivity.class); 
        2startActivity(intent); 
       }else{ // every 2 minutes send out a gcm message... 
        asyncWebCall(String.format(AgeingLib.GCMTICKLE,androidid),0); 
        return; // only if it sends a tickle and all is well... 
       } 
      }else{ 
       Log.d("pushAndroidActivity",String.format("(mOneSecondTick mod60 no GCM on this device")); 
      } 
     } 

GCMlastCall है पिछली बार एक संदेश प्राप्त हुआ था, इसलिए यदि gcm बंद कर दिया हम बता सकते हैं।

कुछ दिनों के लिए काम किया गया अब लगता है ठीक

+0

को ऊपर उठाया जाना चाहिए, क्या यह फ्रंटएंड इंस्टेंस घंटों को पूरा नहीं करेगा? – Dexter

2

GCM कथित तौर पर रखें जिंदा दिल की धड़कन तो विश्वसनीय नहीं होने के साथ एक बहुत गंभीर समस्या है। इसलिए, चूंकि यह केवल हर 15 मिनट (3 जी से अधिक) या 28 मिनट (वाईफ़ाई से अधिक) में भेजा जाता है, अगर किसी कारण से सर्वर कनेक्शन गिरा दिया जाता है, तो इसे कई लंबे मिनट तक बहाल नहीं किया जा सकता है।

इस प्रकार के शेनानिगन्स ने ऐसे समाधान को विकसित करने के लिए प्रेरित किया जो तीसरे पक्ष के नेटवर्क पर निर्भर नहीं है ताकि बड़े पैमाने पर स्केलेबल और विश्वसनीय पुश नोटिफिकेशन ऑफलाइन (पृष्ठभूमि) एंड्रॉइड ऐप्स को वितरित किया जा सके।

https://help.pubnub.com/entries/21720011-Can-my-Android-App-Receive-Messages-While-Inactive

2

यह वास्तव में अवास्तविक दिल की धड़कन अंतराल Google क्लाउड संदेश सेवा में के कारण होता है।

यह संभवतः जीसीएम में सबसे निराशाजनक बग है। जीसीएम एंड्रॉइड डिवाइस से Google के सर्वर पर एक निष्क्रिय सॉकेट कनेक्शन बनाए रखकर काम करता है। यह बहुत अच्छा है क्योंकि यह मुश्किल से बैटरी पावर (मतदान के विपरीत) का उपभोग करता है, और यह संदेश आने पर डिवाइस को तत्काल जागने की अनुमति देता है। यह सुनिश्चित करने के लिए कि कनेक्शन सक्रिय रहता है, एंड्रॉइड मोबाइल कनेक्शन पर हर 28 मिनट और वाईफाई पर हर 15 मिनट में दिल की धड़कन भेज देगा। यदि दिल की धड़कन विफल हो गई है, तो कनेक्शन समाप्त कर दिया गया है, और जीसीएम इसे फिर से स्थापित करेगा और किसी लंबित पुश अधिसूचनाओं को पुनः प्राप्त करने का प्रयास करेगा। दिल की धड़कन अंतराल जितनी अधिक होती है, कम बैटरी खपत होती है और डिवाइस को कम से कम नींद से जागने की आवश्यकता होती है।

हालांकि, यह एक बहुत ही बढ़िया कीमत पर आता है: दिल की धड़कन अंतराल जितनी अधिक होती है, उतनी देर तक टूटे सॉकेट कनेक्शन की पहचान होती है। Google ने जीसीएम को तैनात करने से पहले वास्तविक अंतराल स्थितियों में इन अंतराल का परीक्षण नहीं किया है। इन अंतराल के साथ समस्या नेटवर्क राउटर और मोबाइल वाहक के कारण होती है, जो कुछ मिनट निष्क्रियता के बाद निष्क्रिय सॉकेट कनेक्शन डिस्कनेक्ट करते हैं। आम तौर पर, यह सस्ते घर राउटर के साथ अधिक आम है, जिनके निर्माताओं ने निष्क्रिय निष्क्रिय सॉकेट कनेक्शन की अधिकतम आयु पर निर्णय लिया है, और संसाधनों को बचाने के लिए इसे समाप्त कर दिया है। ये राउटर केवल समवर्ती कनेक्शन की सीमित संख्या को संभाल सकते हैं, और इसलिए अधिभार को रोकने के लिए यह उपाय लिया जाता है। इसके परिणामस्वरूप जीसीएम सॉकेट समाप्त हो गए, और जब समय जीसीएम संदेश देने के लिए आता है, तो यह डिवाइस तक नहीं पहुंचता है। डिवाइस को केवल यह एहसास होगा कि कनेक्शन को तोड़ दिया गया है, जब यह दिल की धड़कन भेजने का समय है, 0 - 28 मिनट बाद, पुश अधिसूचना को कुछ परिस्थितियों में बेकार करना (जब संदेश समय-महत्वपूर्ण है, उदाहरण के लिए)। मेरे अनुभव में, अधिकांश सस्ता राउटर निष्क्रियता के लगभग 5-10 मिनट के बाद निष्क्रिय कनेक्शन को समाप्त करते हैं।

http://eladnava.com/google-cloud-messaging-extremely-unreliable/

Google क्लाउड संदेश सेवा करने के लिए एक विकल्प

Pushy (https://pushy.me/) एक स्वसंपूर्ण पुश अधिसूचना प्रवेश द्वार, पूरी तरह से स्वतंत्र है:

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

पुशी का एक बड़ा लाभ यह है कि पुश अधिसूचना (सर्वर से) भेजने के लिए कोड, और पुश अधिसूचनाओं के लिए डिवाइस को पंजीकृत करने के लिए कोड वास्तव में जीसीएम और पुशी के बीच अंतर-परिवर्तनीय है। इससे जीसीएम को लागू करने और इसे अस्थिरता के लिए कुचलने के बाद पुशी पर स्विच करना बहुत आसान हो जाता है।

(पूर्ण प्रकटीकरण: मैं अपने ही परियोजनाओं के लिए Pushy स्थापना की और कई क्षुधा एक ऐसी सेवा से लाभ होगा एहसास हुआ)

संबंधित मुद्दे