ハイブリッドアプリ開発におけるチャットの作り方を考える
■ ハイブリッドアプリ開発とは
HTML5・Javascript・CSSなどのWEB技術を活用して、モバイルアプリを開発する手法です。CordovaなどのAPIを利用すると、ネイティブ機能も呼び出すことができますが、基本的にはHTML5とJavascriptで実装します。
では、HTML5とJavascriptだけでチャット機能を実現する方法を考えてみましょう。まずは、チャットによく使われている通信プロトコルを調べました。
■ チャットプロトコルの選択肢
- XMPP
XMLベースのプロトコル、google talkが採用していました。ただし、googleがチャットサービスをhangoutsに統一して、独自プロトコルに変更しました。具体的な経緯がこちらの記事をご覧ください。
Exclusive: Inside Hangouts, Google's big fix for its messaging mess | The Verge
- WebSocket
cometなどの不足と問題点を解決するために、開発された技術です。cometでもプッシュ配信を実現できますが、クライアントからのリクエストが長時間サーバ側に保留され、コネクションを一つ占用するため、リクエストの数が多くなると、リソースが大量消費される問題が起こります。それに対して、WebSocketの場合は、リクエストが複数あっても、一つのコネクションを共有できるので、大きなメリットがあります。
- MQTT
IoTで注目されているホットな技術です。同じデータを送っても、HTTPとなどよりサイズが小さくて、
プロトコル自体もシンプルなので、消費電力を抑えられるという効果があり、M2M通信にふさわしいです。そして、Facebook Messengerのプロトコルとしても採用されているので、Facebookから家電製品などをコントロールできる近未来生活が見えてきたでしょうか
■ 各プロトコルを採用した場合、バックエンドとフロントエンドはどうやって実装?
XMPP
- バックソリューション:ejabberd
- フロントjsライブラリ:strophe.js
- メリット:ejabberdならクラスタープラグインもある。strophe.jsは使い方のご紹介とサンプルコードがそこそこある。
- デメリット:ejabberdの紹介記事が少ないから、頑張って公式サイトを読むしかない。strophe.jsは最近注目されているとは言え、実績がまだすくない。
WebSocket
- バックNode.jsライブラリ:Socket.IO
- フロントjsライブラリ:Socket.IO
- メリット:バックエンドでNode.jsを採用するのは主流で、パフォーマンスが高いし、JSだけで開発を完結。
- デメリット:Node.jsがシングルプロセスなので、一つのリクエストにエラーが発生したら、他のリクエストが全部ブロックされる。
MQTT
- バックエンドソリューション:mosquittoかRabbitMQ
- フロントライブラリ:paho
メリット:特にRabbitMQに関して、いろんな使い方で実績が豊富、クラスター構築の記事・資料も多い。
デメリット:MQTT自体はまだ若い技術なので、導入・運用コストもちょっと高いでしょう。ただし、近い将来にIoTの爆発成長に向けて、know howを貯めたほうが損はない
■ そもそもの話
では、あなたのプロジェクトでは、どれを採用していますか?
ちょっと待って!そもそもの話ですが、上記三つともリアルタイム通信を実現するための技術だけど、チャットって、本当にリアルタイムじゃないと、駄目でしょうか?LOOPで1秒に1回サーバに問い合わせをして、メッセージを受信してもいいんじゃないですか?
確かに、M2Mの世界では、例えば高速移動中の車の間で通信を行う場合、1秒の遅延が発生したら、事故が起こるけど、チャットアプリなら、1秒ぐらいの遅延があっても、問題ないでしょうか
ということで、JSとHTML5だけでチャットを実現する方法は、実際にたくさんあって、どれを採用するべきか、実現したいサービス、そして、プロジェクトのリソース次第ですね。