• このエントリーをはてなブックマークに追加

今なら、継続入会で月額会員費が1ヶ月分無料!

RedisとServer Sent EventでJavaScriptでチャットを作ってみた
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

RedisとServer Sent EventでJavaScriptでチャットを作ってみた

2014-10-28 23:50
  • 2

 No SQLってあるじゃないですか。

 無言会議をやっていたら、チャットサーバーの開発者の秀島さん(元大手通信プロバイダ勤務)が「Redis使ってみたい」と無言会議チャットになんとなく呟いてて、「なにそれ?美味しいの?」と調べてみると、なるほど僕がボーッとしてる間に、サーバー業界もお洗濯に革命が起きていたらしい。

 Redisとは、まあいわゆるひとつのNo SQLで、memcachedよりも高機能らしい。
 ニコニコ生放送でも積極的に使われているらしいぞ。


 しかもちょっと面白そうだなと思ったのは、リストやハッシュ、セットというちょっとしたデータ構造も保存できる。そのうえ全部のデータがオンメモリにあるという前提の仕組みなので、SQLのオーバーヘッドとか気にしなくていいし、そもそもSQLの複雑なクエリー文とか明らかに筋が悪いものも無視できる。


 まあ僕が未踏ソフトウェア創造事業で採択されたのも、根本的にはこのNo SQLデータベースを作るということだった。ただし、僕のはRDFデータベースっぽくなっちゃったのでmemcachedやRedisのようなものとは根本的に違う。


 とにかくデータベースは好きなのよ。
 僕がなんでこれを見落としてたのかなーと思ったら、Redisの登場は2009年で、僕がデータベースをワッショイしてたのは2004年から2007年までだった。その後はiPhoneに行ってたので知らなかったんだねえ。


 Redis、正直、アーキテクチャが美しいとは思えない。
 これが未踏のプロジェクトで提出されていたら、とりあえず挨拶代わりにひとしきり文句を言ったと思う。




 しかし実用的なツールというのは、時に美しさとは無縁のことがある。

 たとえば軽自動車とかね。


 軽自動車が美しいと思ったことはほとんどない。
 が、軽自動車は実用的だ。


 全ての自動車がランボルギーニのようだったら、この世で自動車に乗りたがる人間はいなくなるだろう。

 なにしろスタイリングと馬力を最優先して、居住性については全く考慮されていないからだ。


 にもかかわらず、ランボルギーニは美しい。


 その意味では、Redisはドラッグレース専用カーのようだ。


 アーキテクチャとして美しいとは到底思えない。
 まず、コマンドがやたら沢山ある。
 そして欲しいと思えるデータセットがない。

 RedisはNo SQLだが、SQLが扱うべきデータを全て扱うことが出来るというわけではない。

 ではなんのためにRedisはあるのか。
 とにかく速度のためだ。


 Redisのアーキテクチャは速度のために最適化している。
 それはもう完璧に徹底されている。


 最高の速度で動かすためにデータ型、コマンド、全てのアーキテクチャが揃えられている。
 スピードのために研ぎすまされたデータベース。それはそれで、別の美学があるのかもしれない。


 で、Redis、PHPなどの言語から簡単に使える。

4814bc9bd980e66cb256331e7d5a802cb2577a28

 ああこれは見るからに簡単だ。
 RedisをPHPから使うにはpredisを使う場合と、phpredisを使う場合の二通りある。
 phpredisをインストールするのが若干面倒だったので、インストールのいらないpredisを使ってみた。

 そしてRedisを純粋にREST化するwebdisというのもある。
 これはとても簡単で、これを使うとRedisをブラウザから直接使うことが出来る。

 まああらゆるコマンドをRESTで呼べてしまうので死ぬ程危険だが、ちょっとした内容のプログラムをローカルで試すには便利だ。


 webdisをブラウザのJavaScriptから直接使うには、たとえばこんな感じの関数を作る。

cff385791db9083b015dcf970e71468ab470da7e

 GET/キーでキーの内容を取得、SET/キー/値でキーの値を設定。簡単だ。
 これでredisを使うことができない人はおそらくいないだろう。

 ただしFLUSHDB/で全てのデータを消してしまう。これは危険だ。
 だから実際に運用したかったら本当は必要なAPIだけをphpかなんかで作って外に出す必要がある。

 とはいえ、Redisがどんなものか知りたかっただけなので、簡単なチャットを作ってみようと思った。

 さて、Redisと同時に最近知ったWebブラウザの新機能がServer Sent Eventである。

 これは原理上はCometに似ているが、Cometのようにサーバー側に特殊なことをする必要がない。

08d17a231422d3e71dac5a2bfcb86d16fecd8064

 JavaScript側にこんな感じでEventSourceを作成して'messages'イベントのリスナーを作っておくと、サーバから任意のタイミングでデータを送ってくれるというわけ。


 そこで今回はチャットの内容が格納されたリストの数が変更されたら、Server Sent EventをPHPから発行してクライアントにチャットの内容を表示させるようにした。

sse.php
c605cb9803a1ce8eaff2d6fddca169c833a7d20a

index.html
78752aeeb1051325470131b847ee7b6ed375ec10

 ブロマガのシステムがソースコードをちゃんと表示できるか怪しいので画像にしてしまったけど、まあこれで実際のコードがどんな感じなのかなんとなく掴めると思う。

 

962e5a705ac307b38c0ea30c15fbe8f5.gif

 動作させるとこんな感じ。
 Server Sent Eventは、最近のモダンなブラウザには入っているほか、polyfillもあるので対応してないブラウザでも一応動作させることはできるらしい。

 とりあえずiOSならServer Sent Eventを使えるみたいなので、これで代用になる。

 昔だったら、これと同じようなことをやるのに、NodeJSだとかrocket.ioだとかをインストールしてWebSocketで大騒ぎ(とはいってもNodeJS+rocket.ioはかなり簡単に書けるんだけれども)してたことを考えると雲泥の差だ。


 LindaサーバもRedisで実装すれば今のlinda-baseよりだいぶ高速になりそうな気がする。
 なんかLinda-baseって、流れて来るタプルが増えると突然激重になったりするんだよねー

 というわけでとりあえず使ってみたメモでした。

(shi3z)
チャンネル会員ならもっと楽しめる!
  • 会員限定の新着記事が読み放題!※1
  • 動画や生放送などの追加コンテンツが見放題!※2
    • ※1、入会月以降の記事が対象になります。
    • ※2、チャンネルによって、見放題になるコンテンツは異なります。
ブログイメージ
電脳ヒッチハイクガイド
更新頻度: 毎週月曜日
最終更新日:
チャンネル月額: ¥1,080 (税込)

チャンネルに入会して購読

×
:%s/rocket/socket/g
だと思います。
50ヶ月前
×
Rubyですが、
https://github.com/shokai/sinatra-rocketio
もあるんですね。
50ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。