PocketIO on docCloud

Hachioji.pmで作ってる Yairc(仮) の関係で、PocketIO(Socket.IOのPerl版)をdotCloudで動かす方法を調べました。

dotCloudでPocketIOを動かすには

dotCloudでは本家Socket.IOが動きますし、WebSocketのサポートがアナウンスされていたので動くだろうとは思っていましたが、いくつかハマりポイントがありました。

dotCloudで動かせるPocketIOのサンプルアプリケーションを以下のリポジトリに置いてあります。
GitHub - hideo55/pocketio_on_dotcloud: PocketIO example on dotCloud.

必要なことはほとんどdotcloud.ymlに書くようにしてあります。必要に応じて、ビルドスクリプトを追加したり、supervisord.confをカスタマイズするなどしてください。

www:
  type: perl
  ports: 
    www: http
  requirements:
    - Twiggy
    - PocketIO
  postinstall: mv $HOME/current/profile $HOME/profile
  processes:
    chat: twiggy -p $PORT_WWW -a chat/app.psgi

ポイント毎に説明していきます。

type: perl

Perlを使用するので当然この設定をします。この設定をする事によって、Makefile.PLまたはdotcloud.ymlの'requirements'で指定した依存モジュールをデプロイ時にインストールすることができます。

ports

フロントからのポート転送を設定します。ちなみに、ドキュメントによるとフロントのロードバランサはWebSocketに対応したNode.js製のもののようです。

requirements

依存モジュールを指定します。

postinstall

Hookスクリプトです。Post-Installでsupervisordで起動されるサービスが読み込むprofileをホームディレクトリに移動しています。type=custom等だと.dotcloud_profileがデフォルトで読み込まれていますが、type=perlだと読み込まれないための措置です。sshでログインして.profileを変更したり、supervisord.confを書いて.dotcloud_profileを読み込むなど他の手段でも代替可能です。

processes

バックグラウンドでプロセスを起動します。この指定をすると以下の様なsupervisord.confが生成されます。

[program:chat]
command=bash -lc "[ -f ~/profile ] && source ~/profile; exec twiggy -p $PORT_WWW -a chat/app.psgi"
directory=/home/dotcloud/current
redirect_stderr=true
stdout_logfile=/var/log/supervisor/chat.log
stderr_logfile=/var/log/supervisor/chat.log

上記のように、$PORT_WWWをポートとして指定することによりフロントから転送された通信をTwiggyで受けることができます。

PocketIO Tips

動作を確認する過程で調べたことをメモしておきます。

Transportを指定する方法

本家のSocket.IOでは利用する通信方法を以下の様に指定します。

io.set('transports', [
  'websocket',
  'xhr-polling',
  'jsonp-polling'
]);

PocketIOでも以下のようにすることで通信方法を指定できます。

builder {
    mount '/socket.io' => PocketIO->new(
        handler => sub {
            my $self = shift;
            $self->on(
            ...
        },
        socketio => {
            transports => [qw/websocket xhr-polling jsonp-polling/],
        },
    });
};