ความล่าช้าของข้อความดาวน์สตรีมของ Google Cloud Messaging (GCM)

ฉันได้ดาวน์โหลดและตั้งค่า Android gcm-client และ gcm-demo-server (เซิร์ฟเวอร์ http) จาก http://code.google.com/p/gcm/ ฉันจัดการเพื่อรับข้อความดาวน์สตรีมในแอป gcm-client ของ Android ของฉันได้ ฉันได้ทำการทดสอบมากมายโดยมีลักษณะดังต่อไปนี้:

  1. เซิร์ฟเวอร์ใช้คีย์ API ของเบราว์เซอร์หรือคีย์ API ของเซิร์ฟเวอร์
  2. การเชื่อมต่อข้อมูลเป็นแบบ 3G หรือ WiFi
  3. ข้อความที่ส่งมี/ไม่รวมข้อมูลเพิ่มเติม
  4. ข้อความที่ส่งมี/ไม่มีคีย์การยุบ
  5. ข้อความที่ส่งมีการตั้งค่าความล่าช้าในขณะที่ Idle เป็นเท็จ
  6. ข้อความที่ส่งมีการตั้งค่า timeToLive เป็น 0 หรือ 5 นาที
  7. เซิร์ฟเวอร์ตั้งอยู่ในสองตำแหน่งที่แตกต่างกันภายในยุโรป
  8. แอป Android ทำงานในอุปกรณ์สองเครื่องที่อยู่ในสถานที่ต่างกันภายในยุโรป

ในทุกกรณี แอปจะได้รับข้อความที่ส่งหลังจากผ่านไป 25-30 วินาทีนับจากวินาทีที่ถูกส่ง อย่างไรก็ตาม ฉันได้ทดสอบแอปพลิเคชัน Android อื่นๆ ที่ใช้ข้อความดาวน์สตรีม GCM และในกรณีส่วนใหญ่ ข้อความจะมาถึงเกือบจะในทันที (‹5 วินาที)

มีอะไรที่ฉันสามารถเปลี่ยนแปลงในไคลเอนต์หรือเซิร์ฟเวอร์เพื่อให้ได้รับข้อความในแอปเร็วขึ้นหรือไม่?

ฉันยังลองใช้เซิร์ฟเวอร์ gcm XMPP (แอปพลิเคชัน Java ที่ใช้ Smack) ที่ให้ไว้ใน http://developer.android.com/google/gcm/ccs.html แต่ฉันไม่สามารถส่งข้อความใดๆ ได้ การตอบสนองที่ฉันได้รับจาก GCM Cloud Connection Server (CCS) แจ้งว่า "โครงการ XXXXXXXXX ไม่อยู่ในรายการที่อนุญาต" สาเหตุที่เป็นไปได้มากที่สุดคือการลงทะเบียน CCM ของฉันยังไม่ได้รับการอนุมัติตามที่อธิบายไว้ใน Google CCS (GCM) - โครงการไม่อยู่ในรายการที่อนุญาตพิเศษ ตามที่ฉันได้อ่านในเว็บไซต์ต่างๆ การอนุมัติมักจะใช้เวลานานกว่า 2-3 เดือน ดังนั้นฉันจึงอาจไม่สามารถทดสอบเซิร์ฟเวอร์ XMPP ได้ในเร็วๆ นี้

เป็นไปได้ไหมที่คุณจะรับข้อความเกือบทันใจได้โดยใช้เซิร์ฟเวอร์ XMPP เท่านั้น มีใครเคยมีประสบการณ์เกี่ยวกับความล่าช้าที่พบในการใช้เซิร์ฟเวอร์ XMPP หรือไม่?

ขอบคุณล่วงหน้า


person retset    schedule 21.01.2014    source แหล่งที่มา
comment
คุณจะรู้ได้อย่างไรว่าแอปพลิเคชัน Android อื่นๆ มีความล่าช้า ‹5 วินาที ฉันพบว่า 25-30 วินาทีนั้นสมเหตุสมผลมาก สำหรับบริการที่สามารถส่ง/เผยแพร่ข้อความไปยังอุปกรณ์นับล้านเครื่องได้   -  person Flow    schedule 21.01.2014
comment
โดยการทดสอบพวกเขา ตัวอย่างเช่น ในแอปส่งข้อความ คุณสามารถส่งข้อความในฐานะผู้ใช้และรับข้อความในฐานะผู้ใช้รายอื่น และวัดระยะเวลาในการจัดส่งได้   -  person retset    schedule 22.01.2014
comment
และคุณรู้ได้อย่างไรว่า GCM เกี่ยวข้องกับการส่งข้อความ?   -  person Flow    schedule 22.01.2014
comment
โดยการตรวจสอบแพ็กเก็ตที่แอปได้รับจากโฮสต์ระยะไกล (เซิร์ฟเวอร์ GCM) บนพอร์ต 5228   -  person retset    schedule 22.01.2014


คำตอบ (1)


ฉันคิดว่าปัญหาอยู่ในการสาธิตไคลเอนต์ gcm ของ android ที่เก็บข้อความไว้ ไม่ใช่ในเซิร์ฟเวอร์ gcm ในไฟล์ GcmIntentService.java ของการสาธิต gcm-client จะเห็นได้ว่าฟังก์ชัน protected void onHandleIntent(Intent intent) มีโค้ดต่อไปนี้:

[...]
// If it's a regular GCM message, do some work.
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
// This loop represents the service doing some work.
    for (int i = 0; i < 5; i++) {
    Log.i(TAG, "Working... " + (i + 1)
            + "/5 @ " + SystemClock.elapsedRealtime());
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
    }
}
[...]

รหัสนี้พักแอปพลิเคชัน Android 5 วินาทีทุก ๆ การวนซ้ำ (รวม 25 วินาที) ก่อนที่จะส่งข้อความแจ้งเตือน คุณสามารถลบโค้ดนี้ได้เนื่องจากเป็นตัวอย่าง และคุณสามารถแทรกลงในคำสั่ง else if บางส่วนใช้งานได้ก่อนที่จะแสดงการแจ้งเตือน

ฉันได้ติดตั้งเซิร์ฟเวอร์ xmpp และฉันได้รับการแจ้งเตือนภายใน ‹5 วินาที โดยไม่ต้องใช้รหัสที่ใช้งานได้นี้แน่นอน

หวังว่านี่จะช่วยได้และขออภัยสำหรับภาษาอังกฤษที่ไม่ดีของฉัน

person zhalk    schedule 30.07.2014
comment
ช่วยฉันด้วย ทำไมพวกเขาถึงใส่โค้ดชิ้นนี้ ??!? ไม่จำเป็นเลย.. ขอบคุณ! - person idish; 05.12.2014