INNOBASE技術ブログ

技術的なことエンジニア的なこと制作的なこと全般

ハイブリッドアプリ開発におけるチャットの作り方を考える

■ ハイブリッドアプリ開発とは

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だけでチャットを実現する方法は、実際にたくさんあって、どれを採用するべきか、実現したいサービス、そして、プロジェクトのリソース次第ですね。