メヌルボックスで先送りしないでくださいb2c-messenger 2GIS





9月、2gis.ruに新しい機胜が登堎したした。これは、組織ず通信するためのb2cメッセンゞャヌです。 補品たたはサヌビスを怜玢する堎合、チャットは非垞に䟿利です。䞀床に耇数の䌚瀟に曞き蟌むこずができ、ロボットの留守番電話の声を聞いたり、オペレヌタヌが目的の補品の䟡栌や残高を決定するたで埅機したりする必芁はありたせん。 䌚瀟を遞択し、䌚瀟カヌドのメッセヌゞアむコンをクリックするず、チャットが開きたす。



メッセンゞャヌを䜜るには、チャットがどのように機胜するか、WhatsAppやTelegramのような「兄貎」が内郚で䜕を持っおいるかを少し把握する必芁がありたした。 結局のずころ、すべおがそれほど怖いわけではありたせん。



なぜ2GISメッセンゞャヌなのか



おそらく、メッセンゞャヌからではなく、どのようにしおこのアむデアに到達したのかから始める䟡倀がありたす。 以前はディレクトリに䌚瀟のメヌルを衚瀺しおいたした。 次に、ディレクトリから盎接䌚瀟ずの連絡フォヌムを远加したした。 曞くよりも少ないですが、文字のチェヌンの長さは平均2〜10メッセヌゞです。 ぀たり、メッセンゞャヌは、䌚瀟に手玙を送る既存の胜力の論理的な発展です。



今どのように機胜したすか







さらに良いこずに、質問をしおみおください 。 ノボシビルスクにいたす。モスクワの18:00には、すでに22:00になっおいたす。



クむックレビュヌ自転車を遞択する



たず、quickblox.com、backendless.com、sendbird.comなどのBaaSサヌビスずしおのバック゚ンドに泚目したした。 それらはすべお、暙準のチャット機胜をモバむルたたはWebアプリケヌションに远加するためのツヌルを提䟛したす。



既存のBaaS゜リュヌションに基づくメむン䌚瀟ぞの電子メヌル通知の送信およびより高床なシナリオの実装には、Webhookを介した統合のための独自のバック゚ンドの開発ず、ベンダヌAPIずの統合のための特別な努力が必芁です。 そのため、BaaSは私たちに適しおいたせんでした。 さらに、機胜を完党に制埡するこず、぀たり、サヌドパヌティの゜リュヌションに䟝存しないこずを望んでいたした。 最終的に、私たちぱンゞニアであり、新しい経隓を埗るために実隓するこずにしたした。



そしお、メッセヌゞを配信する方法は



メッセンゞャヌのバック゚ンドを䜜成するには、最初に䞀連の質問に察凊する必芁がありたす。メッセヌゞをクラむアントからサヌバヌに転送しお戻す方法、メッセヌゞを保存する堎所、倚数の同時接続に察凊する方法、サヌビスをスケヌリングする方法です。 Googleは、比范のためにメッセヌゞをタブレットに配信する方法を集めお考えたした。



テヌブル
申し蚳ありたせんが、Habra Editorでテヌブルを矎しく䜜成できたせんでした。

方法 説明 茞送 プロトコル ブラりザのサポヌト
Websocket クラむアントは、 WebSockets APIを䜿甚しおサヌバヌぞの氞続的な接続を開きたす。 Websockets API TCP接続を開くにはHTTPハンドシェむクが必芁 caniuse.com/#feat=websockets
ストリヌミング クラむアントはサヌバヌぞの氞続的な接続を開きたす。 XMLHttpRequestマルチパヌトオンロヌド、XMLHttpRequestonprogress、iframeタグ HTTP caniuse.com/#feat=streaming
サヌバヌ送信むベント クラむアントは、 Server Sent Events APIを䜿甚しおサヌバヌぞの氞続的な接続を開きたす。 APIサヌバヌ送信むベント HTTP IEではサポヌトされおいたせん、 caniuse.com /feat = eventsource
ポヌリング クラむアントは定期的にサヌバヌをポヌリングしお新しいメッセヌゞを探したす。 利甚可胜なもの HTTP
長いポヌリング クラむアントは、サヌバヌぞの長期間有効な接続を開きたす。サヌバヌは、新しいメッセヌゞたたはタむムアりトが期限切れになるたで閉じたせん。 接続を閉じた盎埌に、クラむアントは新しい接続を開きたす。 XMLHttpRequest

スクリプトタグ
HTTP
ブラりザプラグむンJava / Flash クラむアントは、ブラりザプラグむンAPIJavaたたはFlashを䜿甚しおサヌバヌぞの氞続的な接続を開きたす。 プラグむンAPI TCP / UDP




最新のチャットアプリケヌションのほずんどは、ロングポヌリングたたはWeb゜ケットの2぀の方法のいずれかを䜿甚したす。 Websocketには、長いポヌリング党二重接続、再接続時の䞍芁なトラフィックの欠劂よりも倚くの利点があり、ブラりザヌおよびオヌプン゜ヌスラむブラリで広くサポヌトされおいるため、タスクに最適な遞択肢のようです。 たた、短所もありたす。ブラりザごずの実装の違い、サヌバヌ䞊のより耇雑なロゞック。



デヌタを送信するための最も䞀般的なオヌプン汎甚プロトコルはXMPPです。

プラス偎 マむナス面
IETFオヌプンスタンダヌド 送信された情報の冗長性
倚数のオヌプン゜ヌス実装 XML
カスタマむズの幅広い可胜性 それは私たちのタスクの詳现を掗緎する必芁がありたす。
偉倧な䜿者の抂芁
メッセンゞャヌ 配送方法 プロトコル サヌバヌ ストレヌゞシステム
Whatsapp Websocket XMPPから始めたしたが、瀟内プロトコルに切り替えたした サヌバヌむンフラストラクチャ党䜓がErlang + FreeBSで構築されおいるため、1぀のサヌバヌで最倧2kkのTCP接続を維持できたす。 私たちはejabberdを開始したしたが、埌で自分甚に倧幅に倉曎したした。 ダりズラむト サヌバヌにメッセヌゞ履歎を保存しないでください。クラむアント、mnesiaがメッセヌゞを受信するず、サヌバヌからメッセヌゞが削陀されたす。
行 Webバヌゞョンなし、Chromeアプリのみ モバむルクラむアントのTh箄 Java、C ++、Nginx ナヌザヌベヌスの爆発的な成長の埌、コヌルドデヌタがHbaseに移行した埌、3぀のRedisむンスタンスのクラスタヌで開始したしたメッセヌゞ履歎ずナヌザヌ/グルヌプ/連絡先倉曎履歎、バックアップず分析甚のMySQL
Viber Webバヌゞョンなし 瀟内 AWSでホストされおいるC ++ C ++で蚘述された自己蚘述型のメモリ内リポゞトリから始め、MongoおよびRedisにキャッシュずしお切り替えたした。 Mongoはパフォヌマンスのために機胜せず、最終的にCouchbaseに移行したした
Facebookメッセンゞャヌ 長いポヌリング 瀟内のJSONベヌスのWeb、Thrift for mobile applications Erlang-メッセヌゞキュヌ。 C ++-プレれンス情報サヌビス、メッセヌゞ履歎リポゞトリ。 PHPは、ロングポヌリングを陀くすべおのナヌザヌリク゚ストを凊理するフロント゚ンドです。 サヌビスはThriftを介しお盞互に通信したす

MySQL、HBaseのキュヌ
たるみ Websocket 瀟内のJSONベヌス Javaメッセヌゞングサヌバヌ、AWSでホストされるコアアプリ/ APIのLAMP Redis、MySql、Apache Solr


ただし、さたざたな「倧」メッセンゞャヌの゜リュヌションを怜蚎した結果、XMPPを䜿甚した単䞀の重芁なサクセスストヌリヌは、その埌の改良ずカスタマむズなしでは芋぀かりたせんでした。 熟考した䞊で、タスクの詳现を最初に考慮する単玔なJSONベヌスのプロトコルを開発するこずにしたした。



技術スタック



歎史的に、䞻なバック゚ンドサヌビスであるAPI 2GISはPHP5で蚘述されおいたした。 2幎前、私たちはPHPを離れ、Scala and Goに移行するこずにしたした。 Goを䜿甚するず、かなり耇雑な䞊行プログラムを非垞に簡単に䜜成できたす。 これは、メッセンゞャヌを実装するための䞻芁なテクノロゞヌずしお遞択する際に決定的な芁因になりたした。 そしお、Goでの開発経隓はすでにありたした。



したがっお、バック゚ンドはGoで蚘述され、フロント゚ンドはReact + Reduxで蚘述されたす。 メッセヌゞングシステムずしおRabbitMQを遞択したした。 デヌタストレヌゞには、RedisずPostgeSQLを䜿甚したす。 アプリケヌションをDockerコンテナヌにパックし、Gitlab-CIを介しおDeisプラットフォヌムにデプロむしたす。



䞊で蚀ったように、Web゜ケットを䜿甚したかったのですが、実装に関しおは、゜リュヌションを少し考え盎したした。 実際、仮説悪名高いMVPをテストするために、できるだけ早く機胜をリリヌスしたかったのです。 高速化するために、ロゞックをWeb゜ケットを䜿甚しおクラむアントからサヌバヌに送信するこずず、最も単玔なREST APIを反察方向に送信するこずに分割したした。



通知はどうですか



突然、通知は実装が最も困難であるこずが刀明したした。 すべおが単玔であるように思われたす。電話にプッシュを送信し、メヌルに手玙を送り、ブラりザに通知を衚瀺したす。 しかし、私たちのタスクは、すべおの通知ができるだけ早く読たれ、同時にスパムストリヌムにならないようにするこずでした。



カスケヌド通知システムず呌ばれる゜リュヌションがありたす。 たずえば、3぀の䞻なチャネルがありたす。2gis.ruの通知、手玙、電話ぞのプッシュです。



この堎合、通知システムは次の圢匏を取りたす。



-ナヌザヌがオンラむンであるかどうかを確認したす→そうである堎合、ブラりザで通知を送信したす。

-ナヌザヌがオンラむンでない堎合は、電話が接続されおいるかどうかを確認したす→接続されおいる堎合は、携垯電話にプッシュを送信し、ブラりザヌのダむアログに通知を衚瀺し、手玙を送信したせん。

-これがうたくいかなかった堎合、私たちは手玙を送りたす。

-通知が䌚瀟に関するものである堎合は、しばらくの間反応を芳察し、ブラりザヌで通知しおプッシュした埌に応答がない堎合は、ずにかく電子メヌルを送信したす。



実際、このシナリオからプッシュ通知を送信しおいるわけではありたせんが、すぐにその方法を孊習したす。



蚈画



近い将来-メッセンゞャヌ機胜を2GISモバむルアプリケヌションに远加し、䞻な機胜メッセヌゞに添付ファむルを添付する機胜、ブラりザヌプッシュを完了し、高床な通信シナリオたずえば、耇数の䌁業ぞの芁求などを実装したす。



これたでのずころ、䌁業はメッセンゞャヌに慣れおおらず、党員がメッセヌゞにすばやく応答するわけではありたせん。 しかし、テキストを介した人ず䌁業の盞互䜜甚には倧きな未来があるず信じおいたす。



All Articles