Erlangでチャットを書いてみた
最近Erlangの入門書を読んだので、Erlangで何か書きたいなとおもっていました。
特に何も思いつかなかったので、ありきたりですが、チャットを書いてみました。
- やりたかったこと
- ブラウザだけでチャットしたいよね
- 超高速ポーリングとか、やだよね(昔学生時代にそんなチャットを作ったな、、)
- 基本的な構成
- 動作の仕組み
- ログイン、メッセージの書き込みは同期的(javascriptだから実際は非同期だけど、イメージの問題)にCGIに投げつけている
- メッセージ取得部分は、ロングポーリングなイメージで、jsonpのリクエストをCGIサーバに投げて、CGIサーバが新着メッセージがあるとそのリクエストに返事する、という仕組み。Cometになっているか分からないけどそういうのをイメージして作った
- http://ja.wikipedia.org/wiki/Comet <-- Comet
- やり残していること
- ロングポーリングっていってるけど完全に投げっぱなしなので、ある程度でタイムアウトもうけて再度リクエストを投げなおすように、クライアント/サーバの双方にそういう仕組みを入れたい
- ログアウトとかないのでしばらく応答がなかったクライアントは強制的に退出扱いにするとか、そういう仕組みは入れないとサーバが死ぬ
- 今回作ったものは1つのチャットルームでみんながしゃべる、というものだけど、erlang的にはおいしいところを味わいきれていない。
- 多くのチャットルームがあって、それぞれにerlangのノードが割り当てられている
- ノードの管理をするスーパーノードがいて、そいつに行き先のノードを聞いて、、、、っていうすてきなことができたらいいな、、、あはw
- 奥さんのすてきな記事( http://labs.cybozu.co.jp/blog/kazuho/archives/2007/02/keeping_comet_alive.php )にあるような諸処の問題の検証と対策
- 動作サンプル
- http://doublefree.org:8081/
- 誰でも適当な名前でログインできます
- ソース