2012-01-09 13 views
5

मैंने सी 2 डीएम लागू किया है और यह ठीक काम करता है कि डिवाइस संदेश और सबकुछ प्राप्त करता है। हालांकि एक समस्या है जिसके लिए मुझे कोई समाधान नहीं मिल रहा है।एंड्रॉइड, 1000 डिवाइसों को तेजी से संदेश

जब कोई निश्चित घटना होती है तो मैं एक ही संदेश को कुछ हज़ार उपकरणों तक जल्दी से धक्का देना चाहता हूं, अधिमानतः एक मिनट के भीतर। मुझे पता है कि इस बात की कोई निश्चितता नहीं है कि संदेश कभी भी वितरित किया जाएगा और Google विभिन्न परिस्थितियों के कारण संदेश में देरी कर सकता है।

आईओएस के लिए मेरा कार्यान्वयन पाठ्यक्रम भेजने के अलावा ही है। इसमें 15000 संदेशों के लिए लगभग 5 सेकंड लगते हैं। एंड्रॉइड के लिए 5000 संदेशों के लिए इसमें एक घंटे लगते हैं जो लंबे समय तक चल रहा है।

क्या कोई इसे गति देने का तरीका जानता है? या क्या Google स्पैम को रोकने के लिए इस तरह के बड़े पैमाने पर धक्का रोकता है?

कोड का C2DM भाग नीचे है। यह PHP में है लेकिन मुझे अन्य प्रोग्रामिंग भाषाओं को पढ़ने में कोई समस्या नहीं है। मैं एक बार() को कनेक्ट करने के लिए एक स्क्रिप्ट का उपयोग करता हूं और फिर सभी टोकन लूप करता हूं और प्रत्येक संदेश भेजने के लिए sendMessage() का उपयोग करता हूं। सभी संदेशों को भेजने के बाद, यह डिस्कनेक्ट()।

<?php 
class C2DMclient 
{ 
    private $authKey = NULL; 
    private $ch = NULL; 

    function connect() { 
     $post_params = array(
      'Email'  => 'C2DM_USER', 
      'Passwd'  => 'C2DM_PWD', 
      'accountType' => 'HOSTED_OR_GOOGLE', 
      'source'  => 'appname', 
      'service'  => 'ac2dm', 
     ); 
     $first = true; 
     $data_msg = ''; 

     foreach($post_params as $key => $value) { 
      if($first) 
       $first = false; 
      else 
       $data_msg .= '&'; 

      $data_msg .= urlencode($key).'='.urlencode($value); 
     } 

     $x = curl_init('C2DM_CLIENTLOGIN'); 
     curl_setopt($x, CURLOPT_HEADER, true); 
     curl_setopt($x, CURLOPT_POST, true); 
     curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
     curl_setopt($x, CURLOPT_RETURNTRANSFER, true); 
     $response = curl_exec($x); 
     curl_close($x); 

     $pos = strpos($response, 'Auth='); 
     $this->authKey = trim(substr($response, 5 + $pos)); 
     $this->ch = curl_init(); 
     curl_setopt($this->ch, CURLOPT_URL, 'C2DM_SERVER'); 
    } 

    function disconnect() { 
     curl_close($this->ch); 
     $this->authKey = NULL; 
    } 

    function sendMessage($deviceToken, $message) { 
     $data = array(
      'registration_id' => $deviceToken, 
      'collapse_key' => 'ck_type', 
      'data.type'  => 'TYPE', 
      'data.message' => $message, 
      'data.title'  => 'Title' 
     ); 
     $headers = array('Authorization: GoogleLogin auth='.$this->authKey); 

     if($headers) 
      curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers); 

     curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($this->ch, CURLOPT_POST, true); 
     curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data); 

     $messagedata = curl_exec($this->ch); 
      return TRUE; 
    } 
} 
?> 

संपादित करें: नए समाधान curl_multi_exec पर आधारित है।

डेटाबेस क्वेरी परिणामों के माध्यम से लूपिंग करते समय कर्ल हैंडल एकत्र किए जाते हैं। कुछ सौ कर्ल हैंडल एकत्र किए जाने के बाद, उन सभी संदेशों को भेजने के लिए संदेश ($ chs) भेजे जाते हैं। फिलहाल मैं भेजने से पहले 700 संदेश एकत्र करता हूं और लगता है कि 5000 संदेश भेजने के लिए ~ 10s अच्छी डिलीवरी दर और पर्याप्त तेज़ है। एक उच्च संख्या वितरण दर को प्रभावित करने लगती है।

<?php 
class C2DMclient 
{ 
    private $authKey = NULL; 
    private $ch = NULL; 

    function connect() { 
     $post_params = array(
      'Email'  => 'C2DM_USER', 
      'Passwd'  => 'C2DM_PWD', 
      'accountType' => 'HOSTED_OR_GOOGLE', 
      'source'  => 'appname', 
      'service'  => 'ac2dm', 
     ); 
     $first = true; 
     $data_msg = ''; 

     foreach($post_params as $key => $value) { 
      if($first) 
       $first = false; 
      else 
       $data_msg .= '&'; 

      $data_msg .= urlencode($key).'='.urlencode($value); 
     } 

     $x = curl_init('C2DM_CLIENTLOGIN'); 
     curl_setopt($x, CURLOPT_HEADER, true); 
     curl_setopt($x, CURLOPT_POST, true); 
     curl_setopt($x, CURLOPT_POSTFIELDS, $data_msg); 
     curl_setopt($x, CURLOPT_RETURNTRANSFER, true); 
     $response = curl_exec($x); 
     curl_close($x); 

     $pos = strpos($response, 'Auth='); 
     $this->authKey = trim(substr($response, 5 + $pos)); 
    } 

    function getMessageCurlHandle($deviceToken, $message) { 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, 'C2DM_SERVER'); 
     $data = array(
      'registration_id' => $deviceToken, 
      'collapse_key' => 'ck_type', 
      'data.type'  => 'TYPE', 
      'data.message' => $message, 
      'data.title'  => 'Title' 
     ); 
     $headers = array('Authorization: GoogleLogin auth='.$this->authKey); 

     if($headers) 
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
     return $ch; 
    } 

    function sendMessages($chs) { 
     $mh = curl_multi_init(); 
     foreach($chs as $ch) { 
      curl_multi_add_handle($mh, $ch); 
     } 
     $active = null; 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while($mrc == CURLM_CALL_MULTI_PERFORM); 

     while($active && $mrc == CURLM_OK) { 
      if(curl_multi_select($mh) != -1) { 
       do { 
        $mrc = curl_multi_exec($mh, $active); 
       } while($mrc == CURLM_CALL_MULTI_PERFORM); 
      } 
     } 
     curl_multi_close($mh); 
    } 
} 
?> 

उत्तर

4

[अपडेट] C2DM अब deprecated है।

{ "data": { 
    "score": "5x1", 
    "time": "15:10" 
    }, 
    "registration_ids": ["4", "8", "15", "16", "23", "42"] 
} 

[/ अपडेट]

C2DM doesn't support बैच अभी तक भेजने: यह उत्तराधिकारी Google Cloud Messaging (GCM)multiple receivers उर्फ ​​बैच भेजने का समर्थन करता है।

हालांकि आप एक ही समय में C2DM सर्वर पर कई POST अनुरोध भेज सकते हैं, दुर्भाग्य से PHP के पास बहु-थ्रेडिंग के लिए कोई समर्थन नहीं है।

curl_multi_exec पर एक नज़र डालें जो एक ही समय में कई कर्ल अनुरोध करने की संभावना देता है।

+0

मैं जानता हूँ कि C2DM बैच भेजने का समर्थन नहीं करता है कि और वजह मैं प्रत्येक संदेश के लिए एक पोस्ट बनाते हैं। किसी कारण से इस प्रक्रिया में वास्तव में लंबा समय लगता है। मैं curl_multi_exec पर एक नज़र डालेगा। शायद यह खुद को कर्ल है जो अधिक समय लेता है। अगर मैं कुछ दिलचस्प लगता हूं तो मैं थोड़ा और समय वापस कर दूंगा। – Daniel

+0

curl_multi_exec समाधान प्रतीत होता था। कुछ दिनों के लिए परीक्षण करने के बाद 5000 संदेश भेजने का समय एक घंटे से सेकंड के मामले में चला गया। हालांकि अगर संदेश कभी संदेश प्राप्त होता है तो यह काफी यादृच्छिक है। कुछ रास्ते पर खोने लगते हैं। मुझे लगता है कि 2000 संदेश एक बार में हैं और मैं इष्टतम प्रदर्शन बनाम गति के लिए इसे ट्विक करने की कोशिश करूंगा। जब मुझे समय मिलता है तो मैं मूल पोस्ट अपडेट करूंगा। – Daniel

0

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

https://www.firebase.com/

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