【ITニュース解説】How Does WhatsApp Work? Architecture Deep Dive
2025年09月26日に「Dev.to」が公開したITニュース「How Does WhatsApp Work? Architecture Deep Dive」について初心者にもわかりやすく解説しています。
ITニュース概要
世界中で30億人が使うWhatsAppは、1日1400億メッセージを処理し99.99%の稼働率を誇る。その裏側では、データ量を削減するFunXMPPと、大規模な同時接続や耐障害性に優れたErlang/OTPがシンプルに連携し、セキュアなチャット・通話を実現している。
ITニュース解説
WhatsAppは、世界中で30億人もの人々が日常的に利用しているメッセージングアプリだ。米国では浸透途上だが、特にブラジル、インド、ヨーロッパなどでは、友人との連絡、カスタマーサービスとのやり取り、さらには決済までをこなす不可欠な存在となっている。この膨大な利用者を支え、毎日1400億ものメッセージや通話を処理し、エンドツーエンド暗号化による高いセキュリティを保ちながら、大陸をまたいで一瞬のうちに情報を届けるには、どのような技術が使われているのだろうか。その裏側にあるアーキテクチャについて見ていこう。
WhatsAppの主要な機能は、大きく分けて二つある。一つは「チャット」で、テキストメッセージ、写真、動画、文書、音声メッセージの送受信が可能だ。最大1,024人の大規模なグループチャットも容易に設定でき、コミュニケーションの中心となっている。もう一つは「音声・ビデオ通話」で、世界中の誰とでも無料で通話ができる。こちらも最大32人の音声通話、8人のビデオ通話に対応しており、グループでの利用も活発だ。これらのチャットや通話はすべて「エンドツーエンド暗号化」されており、送受信者以外には内容が決して漏れない仕組みになっている。WhatsAppのサーバー運営者や政府機関、悪意のあるハッカーでさえも、メッセージや通話の内容を見ることはできない。このセキュリティが、多くのユーザーに信頼される大きな理由となっている。このような膨大な処理量と高いセキュリティを、大陸間でも遅延なく提供するため、WhatsAppのインフラは「スケール」と「信頼性」を最優先して設計されている。
WhatsAppの核となるアーキテクチャは、主に「FunXMPP」というメッセージングプロトコルと、「Erlang/OTP」というプログラミングプラットフォームの二つの要素で構成されている。
まずFunXMPPについて説明する。これは、標準的なXMPPというメッセージングプロトコルを、モバイルネットワーク向けに大幅に圧縮したものだ。標準XMPPでは、メッセージはXMLという形式でやり取りされ、短いメッセージを送るだけでも、その前後にたくさんのタグや属性といった付帯情報が付加され、実際のメッセージ内容よりもはるかに大きなデータ量になってしまう。高速な5G回線やWi-Fiを使っていれば気にならないが、WhatsAppが普及している地域には2Gのような非常に低速な回線を使っているユーザーも多い。そのような環境では、メッセージを送るたびに余計なデータ量が発生することは許されない。そこでWhatsAppは、このデータ量を極限まで減らすためにFunXMPPを開発した。FunXMPPは、よく使われる単語やフレーズ、XMLの構造を表す記号などを、それぞれ1バイトの短いコード(トークン)に置き換える「トークン化」という手法を用いる。これにより、数百バイトあったXML形式のメッセージが、わずか数十バイトのバイナリデータに圧縮される。この徹底した圧縮技術により、WhatsAppはデータ通信料を抑え、低速なネットワーク環境でも世界中のユーザーに高速なメッセージ配信を提供できている。
次にErlang/OTPだ。これは元々、1980年代にエリクソン社が電話交換システムのために開発したプログラミング言語と実行環境である。電話システムは、決して停止してはならない、高い信頼性が求められる。WhatsAppもメッセージングサービスとして常に稼働し続ける必要があるため、Erlang/OTPの持つ特性が非常に適していた。Erlang/OTPがWhatsAppを可能にしている三つの重要な能力がある。一つ目は「軽量プロセス」だ。WhatsAppでは、接続している各ユーザーごとに、Erlangの非常に軽いプロセスが割り当てられる。これらは一般的なOSのプロセスやスレッドとは異なり、それぞれわずか300バイト程度のメモリしか消費しない。そのため、一台のサーバーで数百万ものユーザー接続を同時に処理することが可能だ。二つ目は「クラッシュ分離」だ。Erlangは「障害が発生しても気にせず続行する(let it crash)」という思想を持っている。もしあるユーザーの接続に関連するプロセスに不具合が生じてクラッシュしても、その影響は他のユーザーのプロセスには及ばない。システムはクラッシュしたプロセスを即座に再起動させるため、ユーザーは一時的な切断を感じるかどうかのレベルで、サービス全体が停止することはない。三つ目は「分散処理」だ。Erlangのサーバーは、最初から複数のサーバーで連携して動く「クラスター」を構築しやすいように設計されている。異なるサーバー上のErlangプロセス同士でも、まるで同じサーバー内にいるかのように簡単に通信できるため、別途複雑なメッセージキューシステムなどを用意する必要がない。このErlang/OTPの基盤には「Mnesia」という分散データベースも組み込まれている。Mnesiaは、ユーザーがどのサーバーに接続しているかを示す「ルーティングテーブル」や、まだ相手に届いていない「オフラインメッセージキュー」、ユーザーのプロフィールやグループ情報といったデータを、すべてサーバーのメモリ上に保持している。これらのデータは複数のサーバーに複製されているため、一部のサーバーが故障してもデータが失われることはなく、非常に高速なアクセスと高い障害耐性が実現されている。
では、実際にメッセージが送られてから相手に届くまでの流れを見てみよう。あなたが友人に「Hello」というメッセージを送ると、まずあなたのスマートフォンで、そのメッセージがFunXMPP形式にエンコードされる。短縮されたバイナリのバイト列になるわけだ。次に、あなたのスマートフォンはWhatsAppサーバーとの間で、普段から開いている安定したTCP接続を利用して、そのFunXMPPバイト列を送信する。メッセージがサーバーに到着すると、あなたの接続を管理しているErlangプロセスがそれを受信する。プロセスは受信したバイト列をデコードし、それが別のユーザー宛のメッセージであることを認識する。そして、Mnesiaデータベースに問い合わせて、あなたの友人が現在どのサーバーに接続しているのか、どのErlangプロセスで管理されているのかを探す。Mnesiaはメモリ上にデータを保持しているため、この問い合わせはほんの一瞬で完了する。
友人のオンライン状況によって、メッセージの処理は異なる。もし友人が同じクラスター内のサーバーに接続していれば、あなたのErlangプロセスは、友人のErlangプロセスにメッセージを直接転送する。友人のプロセスはそれを受け取り、友人のスマートフォンのTCP接続を通じてメッセージを送信する。この一連の流れはわずか数ミリ秒で完了する。もし友人が別のデータセンターのクラスターに接続していても、あなたのサーバーはメッセージを適切なリモートクラスターに転送し、そこから友人に届けられるため、少し時間がかかってもサブ秒(1秒未満)で届く。しかし、友人がオフラインだった場合は、Mnesiaはアクティブな接続がないことを示す。この場合、あなたのサーバーはメッセージをMnesia内の「オフラインキュー」に保存し、バックアップサーバーにも複製しておく。あなたのスマートフォンには、メッセージがサーバーに受信されたことを示すチェックマークが一つ表示される。その後、友人がWhatsAppを開くと、友人の新しい接続プロセスがオフラインキューからメッセージを検索し、受信する。そしてあなたのスマートフォンには、メッセージが友人に届いたことを示す二つ目のチェックマークが表示される。
グループメッセージの送信も非常に効率的だ。あなたが100人参加のグループにメッセージを送るとき、あなたのスマートフォンは、グループIDとともにメッセージをサーバーに一度だけ送信する。サーバーのErlangプロセスは、Mnesiaからそのグループのメンバーリストを取得し、一時的なErlangプロセスを複数立ち上げる。それぞれのプロセスが数人の受信者を担当し、そのメンバーのオンライン状況を確認しながら、メッセージを配信するかオフラインキューに保存する。これにより、100人へのメッセージ配信がサーバー側で同時に行われる。あなたのスマートフォンが負担するのは一度のアップロードだけであり、バッテリーやデータ通信量を節約できる。
このように、WhatsAppのアーキテクチャは、FunXMPPによるデータ圧縮と、Erlang/OTPが提供する軽量プロセス、クラッシュ分離、分散処理という特性が完璧に組み合わさることで、大規模なシステムとしての高い効率性を実現している。それぞれの接続が軽量なErlangプロセスで管理されるため、一台のサーバーで数百万もの接続を処理でき、従来の方法に比べてはるかに少ないサーバー数で運用可能だ。また、Erlang/OTP上で全てが完結しているため、複雑な要素を別途組み合わせる必要がなく、システム全体をシンプルに保ち、運用やデバッグが容易になる。障害が発生しても、その影響は特定のプロセスやサーバーに限定され、システム全体が停止することはない。そして、すべてのメッセージはメモリ上のMnesiaを介して同じ経路をたどるため、ユーザー数が増えても一貫して予測可能な速度で、常にサブ秒でのメッセージ配信が保証されている。
WhatsAppのアーキテクチャは、最新の流行技術を追いかけるのではなく、むしろ「退屈」とさえ言われるような、実績があり安定した技術選択がいかに重要であるかを教えてくれる。バイナリプロトコル、Erlangプロセス、Mnesiaによるルーティングというシンプルな構成で、30億人ものユーザーを支えるchatインフラを構築したことは、適切なアーキテクチャの選択によって、少人数のチームでも大規模なサービスを実現できるという素晴らしい実例だ。この成功は、必ずしも最新の技術スタックをコピーすることではなく、目の前の課題に対して、最も信頼できる「古くからある、実証済みの解決策」を選ぶことの価値を理解するべきだという教訓を示している。