APIでリアルタイムコミュニケーションを実現するには

APIは一般的にプル型の技術です。クライアント側からアクセスがあるまでは待ちの状態になります。クライアント側から見ても、サーバ内部でどのデータが更新されているのかはアクセスしてみるまで分かりません。この手の問題で厄介になるのが「どのデータが削除されたのか」が確認しづらいということです。すべてのデータを見た上で、抜け落ちていれば削除されたといった確認方法であったり、処理の履歴を見て判断すると言った方法になってしまいます。

そこでサーバ側からでもデータの更新を伝えられる方法を使って、クライアントとのコミュニケーションに役立ててみましょう。

WebSocket

WebSocketはHTML5仕様の一部として定義されていましたが、現在は本体とは切り離されています。WebSocketはいわゆるPubSubな形で、クライアントがサーバ側のメッセージを購読(Subscribe)します。サーバは誰が購読しているかは気にせず、発信(Publish)するだけです。とは言え、購読相手に対してきちんと届くように、または届かなくても良いと言った品質管理もできるようになっています。

HTML5の中で生まれたので仕組みとしてはWebブラウザを対象にしていますが、各種プログラミング言語向けに購読/発信できるライブラリが存在します。ws://、またはwss://(SSL/TLS版)ではじまる専用のプロトコルを利用します。

IoT分野であれば似たような仕組みにMQTTがあります。こちらはヘッダのデータ量が小さいという特徴があります。プロトコルはmqtt/mqttsといった独自のものになります。

WebRTC

WebRTCはP2Pなメッセージプロトコルになります。動画や音声を流すこともできるので、動画チャットや音声チャットに使われることが多いようです。最初のコネクション情報を交換する際にはSTUNサーバを介しますが、実際のデータ送受信はP2Pにて実行されます。

基本的にクライアント同士のメッセージ送受信について行われますので、APIには向かないかも知れません。とは言え、リアルタイムにデータの送受信ができるプロトコルなので、活用法はあるでしょう。

WebHooks

WebHooksはサーバに対してあらかじめURLを登録しておき、サーバ側で何かイベントがあった時に通知してもらう仕組みです。クライアントが通知して欲しいURLを登録するので、セキュリティについてはあまり考慮されることはないようです。

HTTP/HTTPSを使うので他の仕組みに比べると手軽です。ただしサーバ側の負荷は高くなる傾向があります。通知を受け取る側はインターネット上に公開されている必要があり、開発時は若干手間がかかります。

Webサイトプッシュ

スマートフォンではよく知られているプッシュ通知の仕組みをWebブラウザで実現できるのがWebサイトプッシュです。まだGoogle ChromeやFirefoxなど限られたブラウザのみ実現できます。

サーバ側では対象になるWebブラウザのトークンを保持しておく必要があります。そのトークンを指定してメッセージを送信します。プログラム向けにJSONデータをPayloadとして送ることもできます。


APIをサーバ間でリアルタイムに送受信するために使うのであれば、現時点ではWebSocketまたはWebHooksを使うのが良さそうです。Webブラウザとの接続であれば、WebSocketまたはWebサイトプッシュになるでしょう。なお、リアルタイム通信系はRESTfulのようにデファクトスタンダードと言える形式が決まっていないため、サービスごとに送受信されるデータフォーマットが異なっています(それでもJSONを使うケースが多いですが)。導入する場合には一貫した設計になるように注意が必要でしょう。

© NTT Communications Corporation All Rights Reserved.