Erlangでチャットを書いてみた

最近Erlangの入門書を読んだので、Erlangで何か書きたいなとおもっていました。
特に何も思いつかなかったので、ありきたりですが、チャットを書いてみました。

  • やりたかったこと
    • ブラウザだけでチャットしたいよね
    • 超高速ポーリングとか、やだよね(昔学生時代にそんなチャットを作ったな、、)
  • 基本的な構成
    • CGI (WWWサーバ)
      • yawsというerlangのwebサーバ上で動きます
      • リクエスト毎にerlangの1プロセスが割り当てられる感じ
    • バックエンド
      • yaws起動時に立ち上げられるプロセス
      • チャット関連リクエストをさばく担当のプロセスとデータハンドリング用の2プロセスを用意
        • 別に1プロセスでもよかったんだけど、チャットのデータ保持部分を手抜きしてetsでグリグリやっているので、そこはあとから変えられるように隠蔽しておきたかったのです
  • 動作の仕組み
    • ログイン、メッセージの書き込みは同期的(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 )にあるような諸処の問題の検証と対策
      • 実際は、MacのChromeSafariでは動いたからまぁいっかな、とか思ってみたりしている