FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

node.jsでの既存アプリケーションへのリアルタイム実装を検討しました@開発合宿

こんにちは。
自宅に居る時、
夜は「お父さん寝ちゃダメー」、朝は「お父さん起きてー」と、娘から常に起きている事を強要されているfujitaです。

今回は、先日部内で開催されました男だらけの開発合宿にて、
”node.js”をテーマとした取り組みを行いましたので、その成果について公開します。

合宿での目標

今回、私が掲げた詳細はテーマは、「node.jsで、既存アプリケーションへのリアルタイム通知の実装について検討する」でした。

ここで言う既存アプリケーションは、私が今参加しているプロジェクトイベント管理ツール「Paina!」になります。
Paina!は、スマホ向けPHP製Webアプリケーションで、現在リアルタイム通知は未実装ですがご要望はいただいており、今回はその実装にあたっての検証を兼ねた取り組みとなりました。

行った事

東京Node学園に参加(合宿前日)
偶然にも、合宿前日にお隣のニフティさんにて開催される事を知り、最近の動向など勉強させていただきに伺いました。
IIJ大津さんのHTTP/2.0モジュールのお話や、和田卓人さんのJSのテストライブラリ(Power Assert)のお話など、思いの外濃密なお時間を過ごさせていただきました。
f:id:k_chindamaikul:20150722144242j:plain

Nodeクックブックを読んだり
合宿所へ向かう車中では、書籍を読むなどしていました。
本書では、expressについて紹介されていたので、実際にアプリケーションを作るならばexpressでやってみようとなんとなく決めました。
f:id:k_chindamaikul:20150722144302g:plain

nodeをnpmでアップデート
合宿所についてからは、最初にクライアントPCに一年前くらいにインストールしていたnodeや、各モジュールのアップデートから始めました。
とは言っても、hello worldレベルでの実装に終わっていたので、「npmのオプションって何があったっけ?」といったところからのスタートとなりました。

npm install -g node
npm install -g express


入っていたnodeはv0.8*だったので、一気に0.10.*へのバージョンアップと相成りました。
nodeのフレームワーク調べ
express」や、「Mojito」というフレームワークがあることは前々から知っていましたが、実際に触ってはいなかったので、

他に見つけた「sails」含め、「Hello world」程度の簡単なサンプルの作成を行いました。
AWSで開発環境を構築
socket.ioを使用した簡単なサンプルアプリケーションは作成出来たので、次に、実際にPaina!での実装についての検討を行う為、AWSで開発環境のセットアップを行いました。

環境の作成自体は、開発環境のAMIがありますんで、それを元にEC2を立ち上げ、少し設定をいじる程度で完了と、クラウドの恩恵にあずかりました。

そして、ここが一番時間がかかってしまったところですが、expressを使い、「Paina!にコメントを書き込んだらリアルタイムで他イベントメンバーに通知するプロトタイプの実装」に入りました。

詳細については割愛しますが、

  1. 既に動いているWebサーバーに加え、同一インスタンス内に別サーバー名でnodeサーバーを立て
  2. socket.ioを利用したリアルタイムな送受信を行う必要がある画面については、nodeサーバー側に向かせ、それ以外は従来のサーバーを利用
というカタチでプロトタイプでの実装を行いました。

今回の取り組みで分かった事、気づいた事

急遽開発環境を作成したが、AWSの便利さを再確認。

1年で、nodeのバージョンが結構上がってた。
単純に、コミュニティの活力を感じる。

一方で、後方互換性についての懸念もあった(ある)とのことだが、東京node学園で「これからはv1.0のリリースに向け、安定性を大事にしていく」とお話が聞けたので、ちょっと安心した。

nodeはサーバーサイドのJSでエラーが起きた場合に、サーバーが停止してしまうので、エラー制御が怠れない。
今回は、簡単なコードしか書かなったので大きな問題がなかったが、大規模なアプリケーション開発を行う場合は怖いですね。

やはりテストへの注力は大事そう。次に機会があれば、テスト周りと、万が一の停止に備えた対応策について調べておきたい。

フレームワークについては、express使い易いかも。
mojito、sailsも最初の一歩は踏めたので、実際に業務でガッツリnodeを導入する際は比較検討したい。

mojitoはYUIとフレンドリーのようで、YUIに慣れている方には使い勝手が良い印象。今まで縁がなかったが、YUIを使ってみるところから始めるのも面白そう。
プロトタイプを実装することで、実際にPaina!に組み込む場合の具体的なイメージは出来た
今回のような単純な実装方法だと、PHPで実装した部分の大半がリアルタイム通知のインターフェースと成り得るので、nodeへの置き換えが必要となるという結論に達した。(=工数大)

ただこの結論については、発表後の質疑応答で、

  • iframeでnodeのスクリプトを読みこめば、ソースをあまり触らず実装できるのでは?
  • 通知だけなら、ソケットを利用した実装でも良いのでは?
という、なるほどなツッコミを頂き、「最小限で適切なnodeの導入方法についての検討」として、引き続いて検討したい。

今回出来なかった事

  • 必要なサーバースペックや、構成についての検討
  • Webアプリと、ネイティブアプリでのリソースの共有についての検討
私にとっての開発合宿は前職以来(5年前ですかね。懐かしい、、)でしたが、今回もなかなか感慨深い経験が出来たかと思います。

結果、芋づる式にもっと調べたい事、試したい事が出てきましたが、これから1つずつ確認していければいいなといったところです。