を作ろうとしていたりしていて、アプリ部分(railsとか)とリアルタイム処理部分(cometベース、もしくはwebsocket)との振り分けをなんとかできないか。

つまり80番ポート1つですべて動かす、ってことができないかを調べてたのでその現時点での自分用メモ。



ていうか、ポート2つ使うものであればshooting_starベースで一応ひと通り動く状態にはなってるんだけど、ポート2つ使っちゃってるから、SSL化できないというのが今の課題。



できるだけ有りモノですまそうとした場合、方法としては2つ。


■nginx用のプラグインで振り分ける
 ⇒リアルタイム処理の部分が独自実装になっていて?悩ましい。
  これからはやっぱwebsocketだろ、という気もしつつ。


■haproxyで、websocketのリクエストを振り分ける
 ⇒これが出来ればこっちで行くんだが、とりあえず動かない。。。
  こっちが本命かなという気もしつつ、websocketの仕様がまだまだ固まらないという話を聞くと実戦投入はまだ先かなとか。。
  そういう意味ではcometはある意味枯れてるよねという話も。




でよくよく考えると、

・URLベースでnginxとかでリバースプロキシすれば1ポートで出来るんじゃないの?
 ⇒これはすんなりとは行かないと思われる。
  例のshooting_starベースだと、チャットでの発言を受けてlong_poll中のセッションにレスポンスを返す部分が一つのコントローラになっていて、これを分離するのが面倒。

・1つのポートですべて完結させたいっていうののそもそもの目的はHTTPSベースにしたい、ってことなんだけどそれって出来るの?
 ⇒websocketにはsslは実装されてるっぽい。。
  cometベースでのlong poll がsslでも大丈夫なのか、ちょっと怪しい気が。keepaliveみたいなこともできなかった気が。(それを解決するのがwebsocketのssl通信ということかと)


というわけで、結局lingrと同様にeventmachineベースで半分自作みたいなcometサーバを作って、リバースプロキシで内部振り分け、っていうのが一番現実的かも。つかもう何年も前にそれできちゃってるlingrはすごすぎる。



まああとリアルタイムチャットにどこまでこだわるか、ってのはあるんだけど。エンタープライズ用途だったらperiodicalExecuteとかで充分な気も。



<参考URL>


Emerge Technology: WebSocketでChatを作ってみた http://blog.liris.org/2009/12/websocketchat.html

go言語によるwebsocketチャットの実装。
以下もそれ系。
簡単なものはすぐできるけど、認証の仕組みとか複数のチャット部屋に分けたりするのはどうしたらいいのか全くわからん。。。。


websocketで遊んでみた - IT素人がIT機器を弄ったり妄想したりする日記 http://d.hatena.ne.jp/the48/20100627/1277646213

WebSocketとWebWorkerを使ってみました - html5-developers-jp | Google グループ https://groups.google.com/group/html5-developers-jp/browse_thread/thread/e82f0d3d0353cfb0?hl=ja
EventMachineとWebSocketでリアルタイムwebアプリを作る: Kwappa開発室 http://kwappa.txt-nifty.com/blog/2010/11/eventmachineweb.html


eventmachineベースのruby用のいろんなgem。em-websocketとem-websocket-serverは違いがよくわからん。。とりあえずem-websocketベースのものが手元では動いている。

igrigorik's em-websocket at master - GitHub https://github.com/igrigorik/em-websocket https://github.com/igrigorik/em-websocket.git

dansimpson's em-websocket-server at master - GitHub https://github.com/dansimpson/em-websocket-server


これは単にProxy。リバースプロキシっぽい使い方が出来るものかと思って期待したんだけど違ったっぽい。
mcolyer's em-websocket-proxy at master - GitHub https://github.com/mcolyer/em-websocket-proxy



Stompってのがあるっぽい。詳細不明。
Matt Colyer » WebSockets & Stomp, the Real Realtime Web http://matt.colyer.name/2010/07/18/websockets-stomp-the-real-realtime-web/


Crampってやつとか。

has_many :bugs, :through => :rails http://m.onkey.org/websockets-made-easy-with-cramp

akitaonrails's cramp_chat_demo at master - GitHub https://github.com/akitaonrails/cramp_chat_demo


この人の記事はひと通り読む価値あり。

Ruby & WebSockets: TCP for the Browser - igvita.com http://www.igvita.com/2009/12/22/ruby-websockets-tcp-for-the-browser/


Ruby & WebSockets: TCP for the Browser | Rails Fire http://www.railsfire.com/article/ruby-websockets-tcp-browser

Nginx & Comet: Low Latency Server Push - igvita.com http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/ em-http




後半がよくわからん。。勉強になりそうな予感。

Websockets and Ruby EventMachine http://www.slideshare.net/ismasan/websockets-and-ruby-eventmachine


これを読んでhaproxyをひと通り調べた

RUBY ON RAILS - Can nginx be used as a reverse proxy for a backend websocket server? - efreedom http://efreedom.com/Question/1-2419346/Can-Nginx-Used-Reverse-Proxy-Backend-Websocket-Server

http://haproxy.1wt.eu/#docs

Re: HAProxy is incompatible with WebSocket protocol revision 76? http://www.mail-archive.com/haproxy@formilux.org/msg03047.html


その他

WebSocket | どうも。わたすがダニーです。 http://daniels-lab.jugem.jp/?cid=5


ポートの話とか。
WebSocketsの実験(未完) - Note ON http://veritas-vos-liberabit.com/note_on/2010/06/websockets.html



後半でなぜかJavaアプリのアプリ化みたいな話がやたら詳しく書いてあったり。

Jettyで始めるWebSocket超入門:第6回 アプリケーションの作成と配布物の生成|gihyo.jp … 技術評論社 http://gihyo.jp/dev/feature/01/websocket/0006



twitterのストリーミングAPIをいじる系

lib/tss_em_web_socket_server.rb at master from gimite's tweet-search-stream - GitHub https://github.com/gimite/tweet-search-stream/blob/master/lib/tss_em_web_socket_server.rb

[tss][ruby] Tweet Search Streamの実装をem-websocketとem-http-requestに - daily gimite http://d.hatena.ne.jp/Gimite/20101011/1286764612


ruby1.9.1での何かのサンプル

Using the em-http gem with WebSockets - SWiK http://swik.net/Ruby/Code+Snippets%3A+ruby/Using+the+em-http+gem+with+WebSockets/ecyzt