日本で6800万人(2016年1月現在)、世界中では2億人以上 (2015年12月現在)のユーザーがいるLINE。2011年のリリース以降、スマートフォンの普及時期に国内で一気に人気を博し、気軽にメッセージやスタンプのやり取りができることから、いまや友達・家族・ママ友との連絡には欠かせないツールとなりました。
LINEをはじめ、Facebook、Messenger、WhatsApp、Viber、KakaoTalk、WeChatなど、世界中で利用されているさまざまなメッセージングアプリ。どんな仕組みで相手にメッセージとやり取りをしているか、ブラックボックスの中を少しだけのぞいてみることにしましょう。
【注意】ただし、LINEなどのメッセージングアプリ・サーバーが、実際はどのように「実装」(※1)されているか、全ては公開されていません(開発者向けカンファレンスなどで、技術概要は紹介されています)ので、あくまで「ざっくりいえば」「このように動いている」という、おおまかな推測であることをご承知おきください。
※1 ソフトウェアを実際に作成したり、ソフトウェア同士を組み立てるように連携させたりしながら、 実際のコンピューター上に載せて動く状態にすることを「実装」といいます。相手に直接届けられるわけではない!
たとえば、AさんからBさんに、メッセージを送る場合を考えます。Aさんが「今日、どっか遊びに行かない?」とメッセージを入力し、「送信」ボタンを押したとき、そのメッセージはBさんにどのような仕組みで届いているでしょうか?
実は、AさんのスマホからBさんのスマホへ「直接」届いているわけではありません。AさんのスマホとBさんのスマホは、一対一で直接通信しているわけではないのです。
Aさんの送ったメッセージは、まずLINEのサーバーに送られています。隣同士にいても、ネットワークを介して、いったんLINEのメッセージサーバー(※2)に届けられているんですね。
※2 サーバーとは「サービスを提供する側のプログラムや、それが動くコンピュータ」のことです。実物はサービス提供側の社内、あるいはデータセンター(建物内がサーバーだらけ笑の施設)に置かれていたり、いまどきはクラウドサーバー(仮想的なサーバーをサービスとしてネットワーク越しに利用する)が多いです。なお、サーバー上には、過去約2週間分のトーク履歴が保存されているそうです(2週間を過ぎると、古いトーク履歴から自動的に消されていく)。
まずは、LINEのメッセージサーバーに、AさんからBさん宛のメッセージが届きます。それを受けてサーバーがAさんのスマホに「受け取りましたよ」と返事を返します。
LINEでは、メッセージを送った直後に、メッセージの横に「12:34」といった時刻が表示されるとおもいますが、実はこの時が「Bさん宛のメッセージを、サーバーが受け取りました」というタイミングということになります(まだBさんにはメッセージは届いていません)。
電波状況が悪い時にメッセージを送ろうとした場合、しばらくしてからやっと時刻が表示されるのは、LINEのサーバーになかなかつながらず、結果サーバーから「届きました」「受け取りました」という返事が返ってきていない、など、送り終えるのに時間がかかっているということなんですね。
また、メッセージの横にびっくりマーク(!)や再送マーク(ぐるぐる)が表示されることがあります。これは、一定時間がたってもLINEのサーバーに接続できなかった場合に起こります。
実際にチャットをしている相手はAさんとBさんなのですが、実はAさんのスマホのアプリ、Bさんのスマホのアプリ、そしてメッセージサーバー間でも、細々したやりとりがたくさん行なわれているわけです。このようなデータ通信のやりとりの際の取り決め・手順のことを「プロトコル」といいます。
プッシュ通知を受けられるようにするとは?
さて、そののち、Aさんから受け取ったメッセージの宛先をみて、サーバーがBさんのスマホに「あなた宛のメッセージが届きましたよ」という通知を行います。この時使われているのが「プッシュ通知」という仕組みです。スマホがロック画面の時や、別のアプリを使用中に、画面の上に出てくる通知のことです。
iOS向けにはAPNS(Apple Push Notification Service)、Android向けにはGCM(Google Cloud Messaging) / FCM (Firebase Cloud Messaging)という仕組みが用意されています。それぞれ仕様が異なりますが、これらの仕組みがあるおかげで、常にLINEアプリを起動していなくても、メッセージを受け取ることができるのです。
以下、APNSの場合についてみていきましょう。
iOS端末の場合、アプリをいちばん最初に起動したときに、次のような画面が出ていたことを覚えている方もいるでしょう。「このアプリではプッシュ通知を使うけど、いいですか?」と聞いてきています。
実は、この画面で「OK」をタップした時に、iOS端末はAppleのAPNSサーバーと通信を行い、一台一台の端末とアプリに固有の番号(デバイストークン)を受け取ります。そして、そのデバイストークンを通知サーバーに伝えます。これにより、LINEのサーバーは、BさんのLINEアプリが起動していないときでも、Bさんに通知するための番号を知ることができました。そしてBさんも、LINEアプリを起動していなくても、自分宛のメッセージがあればプッシュ通知を受けられる準備が整いました。
3つのサーバーを手渡されてメッセージは届くのだ
さて、Aさんが、Bさん宛にメッセージを送った場合の話に戻ります。
AさんからBさんへのメッセージを受け取ったサーバーは、通知サーバーに「Bさん宛のメッセージがあることを教えてあげて」とリクエストを送ります。通知サーバーは、APNSを使って、Bさんのスマホに対して通知を行います。
Bさんのスマホ上でちょうどLINEが使われている場合、LINEアプリはメッセージサーバーから送られてきたAさんからのメッセージを、Aさんとのチャット画面に表示します。
BさんのスマホがちょうどLINEを使っていない時(他のアプリを使っている場合、アプリが終了している場合、など)は、画面上部やロック画面などに通知が表示されます。
その通知をタップすると、LINEが起動、Aさんとのチャット画面に移動し、メッセージサーバーから送られたAさんからのメッセージを、Aさんのチャット画面に表示します。
さらにそのあと、Bさんのスマホ上のLINEは、「Aさんのメッセージを開封したよ」という通知を、メッセージサーバーに送り返します。それがAさんのスマホ上のLINEへと伝えられます。
そして、サーバーからの「届きました」というメッセージを受け取ったAさんのアプリは、該当するメッセージの横に「既読」という表示を行います。
実際はもっとたくさんのことをしている
LINEに代表されるチャットアプリで友達にメッセージを送る。たくさんのサーバー、たくさんの仕組みがあり、作り込まれたプログラム群、いわば「優秀なこびとさん達」がきびきびと働いてくれているおかげで、メッセージを送ったり送られたりできているわけですね。
なお、実際にはもちろん、これよりもっと数多くの処理・制御が行なわれています。LINEのユーザーならご存知のとおり、スタンプやコイン、通話、画像や動画の送受信などがありますが、その裏側でもさまざまなことが行われています。ユーザー数が多く、1秒あたりに飛び交うメッセージ数もたいへんに多いわけですから、そのための工夫やチューニングが行われているのです。
疑問をぶつけてみようQ&A
Q.なぜサーバーを2段階に分けているのですか? 分けると効率が落ちると思うのですが。
A.逆にサーバーを分けないと効率が悪くなることがあるんです。1台あたり、接続する相手が増えれば増えるほど、応答性が悪くなります。そこで、同じ機能のサーバを複数台に分散させることで、1台あたりの負荷をさげるという作戦です。また、メッセージを受け持つサーバー、通知を受け持つサーバー、メッセージを保管しておくデータベースサーバー、ユーザ情報を管理するサーバーと分けることで、設計をすっきりさせ、管理コストも下げることができるというメリットもあります。なお、実際には「2つに分けている」どころではなく、もっとたくさんのサーバーに分かれていると思います。今回は、説明の便宜上2つとしたのですね。
Q.自分にもLINEのようなサービスを作ることができるでしょうか?
A.お互いにメッセージをやりとりするチャットアプリは、たとえば、Socket.IO 双方向通信ライブラリと JavaScript(クライアント側)、Node.js(サーバー側)を使えば作ることができます。サーバー開発にはExpressフレームワークなどがとっつきやすいでしょう。参考になるサンプルコードや資料もWeb上にたくさん見つかるはずです。つまり、チャットサービスをお試しで作ってみるのは意外に簡単だといってもよいと思います。ただし、実際にサービスとして提供されているものは、本文の最後でも触れたとおりさまざまな技術が組み合わさってはじめて実現されているのです。基本は意外とカンタン、けど実際は奥が深い。それがとても大変だけど楽しく面白いところなんです。簡単なチャットアプリ、作って動くのを見たら、きっと楽しくなりますよ。ぜひチャレンジしてみてください。
筆者紹介――松林弘治(まつばやしこうじ)
1970年生まれ。大阪大学大学院基礎工学研究科博士後期課程中退。龍谷大学理工学部助手、レッドハットを経て、ヴァインカーブにてコンサルティング、カスタムシステムの開発・構築、オープンソースに関する研究開発、書籍・原稿の執筆などを行う。2014年からフリー。Vine Linuxの開発団体Project Vine副代表。ボランティアで写真アプリ「インスタグラム」の日本語化に貢献。2015年に「子どもを億万長者にしたければプログラミングの基礎を教えなさい」(KADOKAWA/メディアファクトリー)を出版。
この連載の記事
-
第2回
プログラミング+
Siriが話を聞いて答えたり、何かをやってくれるしくみ -
プログラミング+
世界の裏側でプログラムは何をやっているか?<目次> - この連載の一覧へ