旅仲間の皆さん、WhatsApp システム デザインの素晴らしく混沌とした世界へようこそ!この記事では、WhatsApp の高レベル (HLD) アーキテクチャと低レベル (LLD) アーキテクチャをわかりやすく説明するだけでなく、ユーモアも交えて (システム設計が退屈である必要はないからです!)、いくつかの図を描きます (なぜなら、みんなフローチャートが大好きです)。
それでは、シートベルトを締めて、コーヒーを一杯飲み、サーバー、データベース、メッセージング プロトコルが連携して何十億ものメッセージを携帯電話に届ける旅に乗り出しましょう。
目次:
- 高レベルアーキテクチャ (HLD)
- 低レベルアーキテクチャ (LLD)
- フローチャート: デザインヒーロー
- コアコンポーネントの内訳
- これらのコンポーネントを使用する理由
- 豆知識と WhatsApp 固有の最適化
1. ハイレベル アーキテクチャ (HLD): 全体像
WhatsApp をよく整理された交響曲として想像してください。ただし、ヴァイオリンの代わりにサーバーがあり、チェロの代わりにデータベースがあります。大まかに言うと、私たちは以下をサポートするシステムを設計しています:
- 数十億人のユーザー
- リアルタイムメッセージング
- マルチメディア共有
- エンドツーエンド暗号化
- 高可用性と低遅延 (「入力中...」を待つのが好きな人はいません)
HLD の概要:
HLD では、建築家のように考えます。まだ各窓の形については気にしていません。家が倒壊しないようにしたいだけです。
高度 30,000 フィートの眺めでは、WhatsApp のアーキテクチャは次のとおりです。
-
クライアント アプリケーション (iOS、Android、Web)
- API ゲートウェイ
-
ロードバランサー (数百万のメッセージの混乱のバランスをとる)
-
アプリケーションサーバー (魔法が起こる場所)
-
データベース層 (データはどこかに存在する必要があるため)
-
ファイルストレージ (猫のGIF用)
-
メッセージ キュー (リアルタイム メッセージング用の Kafka のようなシステム)
-
通知サーバー (好きな人が返信したら知らせる必要があります)
HLD の中核要素:
-
クライアント アプリケーション:
WhatsApp は、同じバックエンド サーバーに接続するモバイル (iOS/Android)、Web、デスクトップ アプリで動作します。クライアントは、UI/UX、メッセージの送受信、暗号化/復号化 (これについては後ほど説明します)、および Wi-Fi がコーヒーブレイクを取ることを決定したときの再接続を担当します。
-
API ゲートウェイ:
これは、クライアントからのリクエストを処理し、それらを適切なバックエンド サービスに転送する仲介者です。 API ゲートウェイは、ユーザーが適切に認証されているかどうかを確認し、メッセージ リクエストを記録し、適切なサーバーに送信します。
-
ロードバランサー:
何百万ものユーザーがオンラインにいるため、どのサーバーも混雑しないようにするには、オーケストラの指揮者 (または 2 人) が必要です。ロード バランサーはリクエストを多くのアプリケーション サーバーに分散するため、過負荷が防止され、処理が超高速になります。
-
アプリケーションサーバー:
これらの悪者たちは WhatsApp の頭脳です。これらはメッセージを処理し、ユーザー セッションを管理し、暗号化を実行します。ここで重要なのはスケーラビリティです。さらに多くのユーザーが参加すると、サーバーも追加されます。
-
データベース層:
あなたのメッセージやメディアはどこに行くのでしょうか?ここでデータベースが登場します。
-
NoSQL データベース (Cassandra): ユーザー プロファイル、メッセージ履歴などの大規模なデータの保存用
-
SQL データベース: まれに、リレーショナル データが必要な場合 (財務記録など)。
-
ファイルストレージ:
すべての写真、ビデオ、音声メモは、スケーラブルな分散ファイル ストレージ システムに保存されます。 S3 を考えてみましょう (ただし、WhatsApp はおそらくカスタマイズされたものを構築したでしょう。なぜなら、それはとてもクールだからです)。
-
メッセージキュー (Kafka/Redis):
リアルタイム メッセージングの場合、WhatsApp はメッセージ キューを使用して、さまざまなサーバー間でのメッセージ配信を処理します。ユーザーがオフラインの場合、メッセージはユーザーが戻るまでキューに保存されます。
-
通知サーバー:
携帯電話の画面がオフの場合、WhatsApp は APN (Apple Push Notification Service) や Android 用 Firebase Cloud Messaging などのサービスを通じて通知を送信します。
HLD フローチャート:
これは、WhatsApp でのクライアント、バックエンド サービス、データベース間の対話を視覚化するための基本的なフローチャートです。
+---------------+ +--------------+
Client (Mobile) -->| API Gateway |---> LB ---> | Application |
(Client (Web)) --> | (Rate limiting)| | Servers |
+---------------+ +--------------+
| |
| |
V V
+-------------+ +--------------+
| Message | | Notification |
| Queues | | Servers |
+-------------+ +--------------+
|
V
+---------------+
| Databases | (Cassandra, File Storage)
+---------------+
ログイン後にコピー
ログイン後にコピー
2. 低レベル アーキテクチャ (LLD): 要点の詳細
LLD では、個々のコンポーネントの実装と技術的な詳細に焦点を当てます。ここでは、アルゴリズム、データベース シャーディング、暗号化方法、ネットワーク プロトコルについて詳しく説明します。
LLD の主要な概念:
-
メッセージ配信システム:
- WhatsApp は、リアルタイムのメッセージ配信に XMPP プロトコルを使用します。これは、1 対 1 とグループ メッセージングの両方を処理する軽量で効率的なプロトコルです。
- 受信者がオフラインの場合、メッセージは一時的に保存され、オンラインになると配信されます。
-
エンドツーエンド暗号化:
WhatsApp のエンドツーエンド暗号化は、シグナル プロトコル に基づいています。このアイデアはシンプルですが天才的です:
- すべてのメッセージには独自の一意の暗号化キーがあります。
- 送信者と受信者だけが必要なキーを保持しているため、WhatsApp も第三者もあなたのメッセージを読むことはできません。
もし WhatsApp がスパイ小説だったら、間違った人がそれを読もうとすると、メッセージは自動的に破壊されてしまいます!
-
データストレージとレプリケーション:
-
Cassandra (NoSQL データベース) は、チャット メッセージの保存に使用されます。なぜ?分散型で可用性が高く、複数のデータセンターにわたるレプリケーションを処理できます。 Cassandra は、サーバーがクラッシュしても (サーバーが仮眠が必要だと判断したときに発生します)、データが失われないようにします。
- メディア ファイル (写真やビデオなど) はテキスト メッセージとは別に、多くの場合クラウドベースのファイル ストレージ システムに保存されます。
-
オフライン ユーザーの処理:
- メッセージを送信し、受信者がオフラインの場合、メッセージは Kafka/Redis などのシステムを使用してキューに入れられます。これは、誰かが家にいないときに家のドアにメモを残すようなものですが、そのメモは列の中に安全に保管されます。
-
データベースシャーディング:
- WhatsApp には何百万ものユーザーがおり、全員のデータを 1 つの巨大なデータベースに保存することはできません。それは、世界中の人々を 1 台のエレベーターに乗せようとするようなものです。
- 代わりに、WhatsApp はデータベースをシャーディングします。シャーディングは、エレベーターを 100 の小さなエレベーターに分割し、それぞれが独自のユーザー グループを担当するようなものです。
LLD フローチャート:
これは、リアルタイム メッセージングとメッセージ キューに焦点を当てた簡略化された LLD フローチャートです。
+---------------+ +--------------+
Client (Mobile) -->| API Gateway |---> LB ---> | Application |
(Client (Web)) --> | (Rate limiting)| | Servers |
+---------------+ +--------------+
| |
| |
V V
+-------------+ +--------------+
| Message | | Notification |
| Queues | | Servers |
+-------------+ +--------------+
|
V
+---------------+
| Databases | (Cassandra, File Storage)
+---------------+
ログイン後にコピー
ログイン後にコピー
3. フローチャート: 私たちのデザインヒーロー
物事を非常に明確にするために、いくつかの図を追加しましょう。フローチャートを建築家の設計図として想像してください。これらはシステムを視覚的に理解するのに役立ちます。
メッセージ送信フロー:
+------------------+ Send Message +-------------------+
| Client App |---------------->| API Gateway |
+------------------+ +-------------------+
| |
| Authenticate User |
V V
+----------------+ +------------------+
| Message Queue | <--Store Msg---| Application |
| (Kafka/Redis) | | Servers (XMPP) |
+----------------+ +------------------+
| |
| Offline/Store Msg |
|------------------------------->
V
+-------------+
| Database | (Sharded Cassandra, File Storage)
+-------------+
ログイン後にコピー
メッセージ取得フロー:
Client (Mobile App)
|
V
API Gateway ---> Authenticate ---> Forward to Application Server
|
V
Load Balancer ---> Routes to Least Busy Server
|
V
Message Queue ---> Holds the message if the user is offline
|
V
Database ---> Saves the message for future retrieval
ログイン後にコピー
4. コアコンポーネントの内訳
重要なコンポーネントのいくつかをさらに詳しく見てみましょう:
-
XMPP: リアルタイム メッセージの送受信に使用されるメッセージング プロトコル。
-
Kafka/Redis: 受信者がオフラインのときにメッセージをキューに入れる責任を負います。
-
Cassandra: メッセージ、ユーザー データ、チャット履歴を保存する NoSQL データベース。
-
シグナル プロトコル: メッセージのプライバシーのためのエンドツーエンドの暗号化を強化します。
-
シャーディング: 何百万ものユーザーを処理できるように、データベースをより小さく管理しやすい部分に分割します。
5. これらのコンポーネントを使用する理由
なぜカサンドラなのか?
- WhatsApp には高可用性、低遅延、および複数の場所に分散されたデータベースを処理する機能が必要なため、Cassandra が最適です。さらに、決してダウンしないように設計されており、WhatsApp はその信頼性を気に入っています。
XMPP を選ぶ理由
- XMPP は軽量で効率的で、リアルタイム メッセージング用に設計されています。 5 分後に始まる映画について友達に教えるなど、遅刻するわけにはいかないシステムに最適です。
なぜ Kafka/Redis なのか?
- メッセージ キューにより、受信者が休暇中で Wi-Fi のないゾーンにいる場合でも、メッセージが失われないことが保証されます。 Kafka と Redis は信頼性が高く、高速で、スケーラブルです。
暗号化に Signal プロトコルを使用する理由
- WhatsApp はあなたのメッセージを読みたくありません (約束します)。エンドツーエンド暗号化では、あなたと受信者だけがキーを持っているため、物理的に暗号化を読み取ることができません。
6. 豆知識と WhatsApp 固有の最適化
-
マルチデバイスのサポート: WhatsApp では、ユーザーが複数のデバイスで同じアカウントを使用できます。これには、慎重なセッション管理とメッセージ同期が必要です。
-
効率的なメディア ストレージ: WhatsApp は、異なるチャット間で共有される同一のメディア ファイルの重複を排除することでメディア ストレージを最適化します (なぜなら、私たち全員に同じミームをすべてのグループに送信する 1 人の友人がいるからです)。
結論: すべてをまとめる
これで、WhatsApp のシステム設計のツアーは終わりました。私たちは、ハイレベル アーキテクチャ (HLD) を探求し、ローレベル デザイン (LLD) を掘り下げ、さらには旅を楽しくするためにユーモアを加えてきました。 XMPP プロトコルから Kafka キュー、Cassandra データベース、Signal 暗号化に至るまで、WhatsApp はグループ チャットを活気づけ続けるスケーラブルなリアルタイム メッセージングの傑作です!
以上がWhatsApp システム設計: 高レベルと低レベルのアーキテクチャを巡るユーモラスな旅の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。