さまざまなリアルタイムメッセンジャーアプリのアーキテクチャについて知りたいと思っています。彼らは一般的なプロトコル/アーキテクチャを使用していますか?
Facebookが190億ドルで購入したWhatsAppアーキテクチャ whatsappの設計に関係するアーキテクチャについて説明しています。
ここにリンクからの一般的な説明があります
WhatsAppサーバーは、Erlangでほぼ完全に実装されています。
バックエンドのメッセージルーティングを行うサーバーシステムは、Erlangで実行されます。
大きな成果は、アクティブなユーザーの数が非常に小さなサーバーフットプリントで管理されることです。チームのコンセンサスは、主にアーランのせいだということです。
Facebook Chatは2009年にErlangで作成されましたが、有能なプログラマーを見つけるのが難しいため、Facebook Chatから離れました。
WhatsAppサーバーはejabberdから起動しました
Ejabberdは、Erlangで書かれた有名なオープンソースのJabberサーバーです。
もともとはオープンで、開発者による優れたレビュー、開始の容易さ、および大規模な通信システムへのErlangの長期的な適合性の約束があったために選ばれました。
次の数年間は、XMPPから内部開発プロトコルへの切り替え、コードベースの再構築、いくつかのコアコンポーネントの再設計、Erlang VMへの多くの重要な変更など、ejabberdのかなりの部分の書き換えと変更に費やされましたサーバーのパフォーマンスを最適化します。
1日500億通のメッセージを処理するために、動作する信頼性の高いシステムを作成することに重点が置かれています。収益化は後で検討する必要がありますが、はるか先です。
システムの健全性の主要な指標は、メッセージキューの長さです。ノード上のすべてのプロセスのメッセージキューの長さは常に監視されており、事前設定されたしきい値を超えてバックログが蓄積されるとアラートが送信されます。 1つまたは複数のプロセスが遅れると、アラートが発生し、次の攻撃のボトルネックへのポインターが与えられます。
マルチメディアメッセージは、HTTPサーバーに送信する画像、音声、またはビデオをアップロードし、Base64でエンコードされたサムネイル(該当する場合)と共にコンテンツへのリンクを送信することにより送信されます。
通常、一部のコードは毎日プッシュされます。多くの場合、1日に複数回ですが、一般的にピークのトラフィック時間は回避されます。 Erlangは、プロダクションに修正や機能を積極的に取り入れるのに役立ちます。ホットロードとは、再起動やトラフィックのシフトなしで更新をプッシュできることを意味します。ミスは通常、ホットロードによって非常にすばやく元に戻すことができます。システムは、より緩やかに結合される傾向があるため、変更を段階的にロールアウトすることが非常に簡単になります。
Whatsappアプリで使用されるプロトコルは何ですか? WhatsAppサーバープールへのSSLソケット。クライアントがメッセージを取得するために再接続するまで、すべてのメッセージはサーバー上のキューに入れられます。メッセージが正常に取得されると、whatsappサーバーに返され、このステータスが元の送信者に返されます(メッセージの横に「チェックマーク」アイコンが表示されます)。クライアントがメッセージを受け入れるとすぐに、サーバーのメモリからメッセージが消去されます
Whatsappの内部で登録プロセスはどのように機能しますか? WhatsAppは、電話のIMEI番号に基づいてユーザー名/パスワードを作成するために使用されていました。これは最近変更されました。 WhatsAppは、アプリからの一般的な要求を使用して、一意の5桁のPINを送信するようになりました。 WhatsAppは、指定された電話番号にSMSを送信します(これは、WhatsAppクライアントが同じ電話で実行する必要がなくなったことを意味します)。ピン番号に基づいて、アプリはWhatsAppから一意のキーを要求します。このキーは、今後のすべての呼び出しで「パスワード」として使用されます。 (この「永続的な」キーはデバイスに保存されます)。これは、新しいデバイスを登録すると、古いデバイスのキーが無効になることも意味します。
WhatsAppは、エラーに耐えるように設計されたスケーラブルなアプリケーションを作成するための言語としてErlangを選択しました。 Erlangは、並行性のためにActorモデルと呼ばれる抽象化を使用します- http://en.wikipedia.org/wiki/Actor_(programming_language) より伝統的な共有メモリアプローチの代わりに、アクターは互いに送信することにより通信しますメッセージ。スレッドとは異なり、アクターは軽量になるように設計されています。アクターは同じマシン上にあっても異なるマシン上にあってもよく、抽象化を渡すメッセージは両方で機能します。 WhatsAppの簡単な実装は次のとおりです。各ユーザー/デバイスはアクターとして表されます。このアクターは、ユーザーの受信トレイ、ディスクへのシリアル化方法、ユーザーが送信するメッセージ、ユーザーが受信するメッセージを処理します。アリスとボブがWhatsAppの友達であると仮定しましょう。アリスの俳優とボブの俳優がいます。
前後に流れる一連のメッセージをトレースしてみましょう。
アリスはボブにメッセージを送ることにしました。アリスの電話はWhatsAppサーバーへの接続を確立し、この接続は間違いなくアリスの電話からのものであることが確立されます。アリスはTCPを介して次のメッセージを送信します。「ボブの場合:巨大なモンスターがゴールデンゲートブリッジを攻撃しています」。 WhatsAppフロントエンドサーバーの1つがこのメッセージをデシリアライズし、このメッセージをAliceというアクターに配信します。
アリスはこれをシリアライズして、予測できないモンスターの暴れによるデータ損失を防ぐために、複製されたファイルシステムに保存されている「Alice's Sent Messages」と呼ばれるファイルに保存することにしました。俳優のアリスは、「アリスからのメッセージ1:巨大なモンスターがゴールデンゲートブリッジを攻撃しています」というメッセージを渡すことで、このメッセージを俳優のボブに転送することにしました。俳優のアリスは、俳優のボブがメッセージの受信を確認するまで、指数バックオフで再試行できます。
最終的にアクターのボブは(2)からメッセージを受信し、このメッセージを「ボブの受信ボックス」というファイルに保存することにしました。ボブがこのメッセージを永続的に保存すると、アクターはアリスに「Is received Msg1」という自身のメッセージを送信することで、メッセージの受信を確認します。俳優のアリスは、再試行を停止できるようになりました。次に、俳優のボブは、ボブの電話にサーバーへのアクティブな接続があるかどうかを確認します。そうするため、アクターのボブは、このメッセージをTCP経由でデバイスにストリーミングします。
ボブはこのメッセージを見て、「アリスのために:巨大なロボットを作って彼らと戦おう」と答えます。これは、ステップ1で概説したように、俳優のボブが受け取ります。次に、俳優のボブは、ステップ2と3を繰り返して、アリスが人類を救うアイデアを最終的に受け取ることを確認します。
WhatsAppは、上記で説明した非常に優れたプロトコルの代わりにXMPPプロトコルを実際に使用しますが、ポイントを得ることができます。
私の知る限り、Ejabberd( http://www.ejabberd.im/ )は親です。これはXMPPサーバーであり、オープンソースの非常に優れた機能を提供します。Whatsappはこの修正版を使用します。メッセージングもこれの修正バージョンを使用します。サムスンのChatOn、Nimbuzzメッセンジャーなどのチャットアプリケーションはすべてejabberdベースのものを使用し、Erlangソリューションもこのejabberdの修正バージョンを使用しています。
Ejabberdは、他の機能と比較したときに、機能のほとんどが実装されているサーバーです。 Erlangで構築されているため、水平方向に非常にスケーラブルです。