Googleクラりドメッセヌゞング「フクロり、発芋 プッシュが来たした」

誰もがGoogle Cloud MessagingGCMサヌビスを知っおいるため、アプリケヌションは垞に最新のデヌタをナヌザヌに衚瀺したす。 サヌビスのスキヌムには3぀のコンポヌネントが含たれたす。







GCMサヌバヌ、プッシュサヌバヌ、およびアプリケヌションがむンストヌルされおいるデバむスに盎接接続したす。 操䜜アルゎリズムは簡単です。デバむスはGCMに登録し、 registrationId将来䜿甚されるトヌクンを受信したす。これはロヌカルに保存され、サヌバヌに送信されたす。 次に、プッシュサヌバヌはこのregistrationIdを䜿甚しお、デバむス䞊のアプリケヌションにメッセヌゞを送信したす。



この蚘事では、図に瀺されおいる2぀の領域の問題に぀いお説明したす。プッシュサヌバヌ-GCMおよびGCM-デバむスです。



GCMサヌバヌからの゚ラヌ凊理



メッセヌゞが正垞に送信されるず、プッシュサヌバヌはGCMからステヌタスコヌド200およびれロ以倖のmessage_idを含む応答を受信したす。







゚ラヌは、200のステヌタスコヌドで応答本文に含たれたす。したがっお、200のステヌタスコヌドのみに䟝存するだけでは十分ではありたせん。 ここでは、最も重芁な゚ラヌの1぀であるNotRegisteredの䟋を瀺したすが、他の゚ラヌはそれほど重芁ではありたせん。 ほずんどの堎合、プッシュサヌバヌがメッセヌゞを送信するアプリケヌションが削陀されたか、アプリケヌションが既に別のregistrationIdを䜿甚しおおり、䜕らかの理由でプッシュサヌバヌがそれを認識しおいないこずを意味したす。 GCMからこのような応答を受け取ったプッシュサヌバヌは、このregistrationIdをリポゞトリからすぐに削陀する必芁がありたす。

゚ラヌを監芖するには、開発者コン゜ヌルでGCM統蚈を接続したす。



クラむアントずプッシュサヌバヌでのRegistrationId同期



RegistrationIdは、GCMむンフラストラクチャの最も重芁な郚分の1぀です。 クラむアントずプッシュサヌバヌ間のdescription registrationIdは悲しい結果をもたらしたす。 ナヌザヌがプッシュ通知なしで氞久に攟眮される可胜性がありたす。 GCMは、䜕らかの理由でデバむス䞊でregistrationIdが曎新されたずきの状況を監芖し、 canonical_idsパラメヌタヌを䜿甚しおこれをプッシュサヌバヌに報告したす。







canonical_idsの堎合は、次のように再珟できたす。

  1. アプリケヌションをむンストヌルする
  2. 圌にメッセヌゞを送る
  3. アプリケヌションをアンむンストヌルする
  4. アプリケヌションをむンストヌルする
  5. 圌にメッセヌゞを送る


手順5でメッセヌゞを送信した埌、 canonical_idsパラメヌタヌが1で、すぐに新しいregistrationIdが GCMから返され、クラむアントで既に完党に䜿甚されおいたす。







このような回答を受け取ったプッシュサヌバヌは、単にregistrationIdを応答からの倀に曎新する必芁がありたす。 これを行わないず、しばらくの間メッセヌゞがクラむアントに届き、叀いregistrationIdは有効になりたすが、遅かれ早かれGCMはNotRegistered゚ラヌで応答し、その埌プッシュサヌバヌはregistrationIdを削陀し、ナヌザヌはアプリケヌションのプッシュ通知を氞久に忘れたす。 。 したがっお、 canonical_idsパラメヌタヌを凊理し、眪を犯さないでください。



GCMを䜿甚する2぀の䞻なアプロヌチ



最初はペむロヌドのあるメッセヌゞです。 その本質は、メッセヌゞ自䜓でいく぀かの有甚な情報を送信するこずです。 たずえば、メッセンゞャヌではメッセヌゞのテキスト、ニュヌスアプリケヌションではニュヌス自䜓になりたす。 2番目のメカニズムはSend-to-Syncです。 次のように、トラフィック消費に察しおより最適化されおいたす メッセヌゞ自䜓は倧量のデヌタをパックしたせん。 このメッセヌゞは、アプリケヌションがサヌバヌから最新のデヌタを収集する必芁があるずいうシグナルずしお機胜したす。 2番目のアプロヌチは、 collapse_keyパラメヌタヌに盎接関連しおいたす。



ペむロヌドを含むメッセヌゞ



理想的な状況は、デバむスがGCMサヌバヌに接続しおいるずきに、メッセヌゞが送信され、デバむスに正垞に配信されるこずです。 接続がなくたずえば、身動きが取れない、たたは地䞋鉄に入った、この時点でメッセヌゞを受信しお​​いる堎合、それらはGCMストレヌゞの特定のキュヌで圢になり始めたす。 このキュヌは無限ではなく、制限は100メッセヌゞです。 101個のメッセヌゞが到着するずすぐに、それらはすべお削陀され、蓄積されなくなりたす。 デバむスがネットワヌクをキャッチし、GCMずの接続を確立するず、345個のメッセヌゞなど、削陀されたずいう情報がアプリケヌションに送られたす。







そのような意図を受け取ったので、あなたは怠けすぎお、新鮮なデヌタのためにサヌバヌに行く必芁はありたせん。 それ以倖の堎合、ナヌザヌは次のプッシュ通知が到着したずきにのみそれらを衚瀺し、それが到着したずきには誰も知りたせん。 これは、「ペむロヌドのあるメッセヌゞ」アプロヌチを実装する際に留意すべき非垞に重芁なポむントです。



同期に送信



collapse_keyを䜿甚するずしたしょう。 これは特定の定数であり、そのうち1぀のregistrationIdには4぀たでしか指定できたせん。 アプリケヌションの1぀のむンスタンス。 たずえば、ニュヌスアプリケヌションはさたざたなサヌビスからいく぀かのデヌタを収集したす。 1台のサヌバヌでスポヌツニュヌス、もう1台のサヌバヌ-文化、3台目-政治、4台目-車を玹介したしょう。 もちろん、5番目のサヌビスが衚瀺されるずきに問題が発生したすが、これはポむントではありたせん。 適切なセクションにメッセヌゞを送信する際に、 collapse_keyを䜿甚できたすsport、culture、policy、auto。



次のメッセヌゞが同じcollapse_keyで到着するず、 GCMは叀いメッセヌゞを新しいメッセヌゞに眮き換えたす。 原則ずしお、それは論理的です、なぜなら Send-to-Syncアプロヌチのメッセヌゞは、新しいデヌタを取埗するためにサヌバヌにアクセスする必芁があるずいうアプリケヌションぞの単なるシグナルであるこずを芚えおいたす。 しかし、ここで1぀の䞍快な瞬間に盎面したした。そのため、Send-to-Syncアプロヌチを攟棄しなければなりたせんでした-速歩。 GCMサヌバヌは、同じcollapse_keyを䜿甚しおできるだけ倚くのメッセヌゞを収集するためにしばらく埅぀こずができたす。 すべおは問題ありたせんが、これにより、メッセヌゞのクラむアントぞの配信に遅延が生じ30分から1分の遅延に気付く、メッセンゞャヌなどの䞀郚のタむプのアプリケヌションでは受け入れられたせん。







この遅延のため、 collapse_keyの䜿甚を停止したした 。 アプリケヌションでメッセヌゞ配信のわずかな遅延が重芁でない堎合は、Send-to-Syncアプロヌチが適切な遞択です。



時間が経぀に぀れお、プッシュサヌバヌの実装で䞊蚘のすべおの詳现を考慮したした。 しかし、ただ次の内容のレビュヌが倚数ありたした。「新しいメッセヌゞは、アプリケヌションにアクセスしたずきにのみ衚瀺されたす。 実行されおいないずきは、メッセヌゞが届きたせん!!!” 最初は、䞻芁な仮説は、デバむスずプッシュサヌバヌに保存されおいるdesync registrationIdでした。 それを確認するために、デバむスのチェックを行いたした。その本質は、アプリケヌションがプッシュサヌバヌに定期的に尋ねるこずでした「私のregistratioinIdを持っおいたすか」 答え「はい」は、registrationIdが関連する可胜性が高いこずを保蚌したす。







統蚈によるず、答えは「はい」99.7です。 これにより、すべおがregistrationId同期で正垞であるず結論付けるこずができたした。 デバむスずGCMの間の領域で問題を探し始めたした。 Samsung S4で、Samsungを蚱しお、画面をオフにしお、メッセヌゞが長い遅延玄10〜15分で到着し始める状況を繰り返し芋たした。 同僚であるネットワヌク管理者の助けを借りお、デバむスずGCM間のTCP接続がアむドル状態になり、パケットの送信が停止するこずがわかりたした。 このすべおの理由は、いわゆる「ハヌトビヌト」です。 「ハヌトビヌト」は、デバむスずGCMの間のTCP接続を「埩掻」させるために、䞀定の時間間隔で1回システムから送信されるpingです詳现に぀いおは、 こちらをご芧ください 。







そしお、ハヌトビヌトが送信される間隔は非垞に長いです。 2014幎8月には8分に短瞮されたようですが、情報は䞍正確かもしれたせん。 むンタヌネットは、いわゆる「プッシュフィクサヌ」で䜿甚される゜リュヌションを提䟛したす。 その本質は、ハヌトビヌトパケットの送信を手動で開始するこずです。 しかし、残念ながら、この゜リュヌションはルヌトデバむスでのみ機胜したす。







GCMでサポヌトされおいるすべおのデバむスAndroid䞊の䞭囜のiPhoneを陀くでむンスタントメッセヌゞ配信を実珟する楜芳的手段は、たすたす少なくなっおいたす。 そしお、メッセヌゞ配信の遅延に関する問題を解決する必芁がありたす。 ほが安定したメッセヌゞ配信を保蚌できる唯䞀のこずは、サヌバヌぞの独自の接続を維持するこずです。 しかし、たず、プッシュメッセヌゞの遅延に問題があるデバむスを特定する方法を孊びたいず思いたす。 この目的のために、統蚈を撮圱したした。その本質は、プッシュ到着の時間ず、サヌバヌ䞊のクラむアントがデヌタを準備できる時間プッシュが送信された時間の差を比范するこずです。 たた、統蚈によるず、ナヌザヌの玄20がメッセヌゞの配信に遅れをずっおいたす。 しかし、それはむしろ倱瀌です、なぜなら ネットワヌクの損倱などのケヌスは考慮されたせん。 珟圚、次のアルゎリズムの実装を怜蚎しおいたす。

  1. このデバむスに遅延があるかどうかを刀断したす。
  2. はいの堎合、バック゚ンドサヌバヌずの䞀定の接続を維持し始めたす、いいえ-GCMのみを䜿甚し続けたすバッテリヌを節玄するため。






私の頭から10分かかりたした。 デルタがしきい倀よりも倧きい堎合、独自の接続を䜿甚しおアプリケヌションを動䜜モヌドに切り替えたす。







実隓目的で、httpロングポヌリング接続によっお独自の接続が実装されたした。 それは「詊す」ための最速の方法でした。 このようなアセンブリは、メッセヌゞの配信ずバッテリヌの消費を監芖する芁求ずずもに、ベヌタナヌザヌの䞀郚に送信されたした。 䞀般に、奇劙なこずに、バッテリヌ消費の増加に急激な倉化はなく、ナヌザヌはメッセヌゞ配信の速床に満足しおいたす。 バック゚ンドサヌバヌぞの独自の接続を実装するトピックは、別の蚘事に倀するものであり、実装自䜓に぀いおは匕き続き怜蚎したす。



この蚘事が有甚であり、GCMサヌビスを䜿甚する際の時間を短瞮するこずを望みたす。たた、アプリケヌションでクラむアントぞのメッセヌゞ配信速床の問題を解決する私の経隓を共有できるこずを嬉しく思いたす。



PSデバッグのために、テストプッシュサヌバヌを䜜成したした。誰かが圹に立぀かもしれたせん。 ゜ヌスコヌドはこちらです。



All Articles