cluster.jsで複数プロセスを起動している環境でSocket.IOを動かすと、クライアント側とサーバーの対応関係がリクエストの都度変わってしまい、うまく動作しない。次善の策として、以下のようにコードを修正:
cluster.js のマスタープロセスでダミーのhttpサーバーを別のポートで動作させ、そのサーバー上でSocket.IOを動作させる:
var server = require('http').createServer(function(req, res) {
res.end();
}) ;
var io = require('socket.io').listen(server);
server.listen(ポート番号) ;
location /daifukujs/socket.io/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:ポート番号/socket.io/ ;
access_log off;
}
のように設定しておく。
ワーカー側でコメント欄の変更を検知したら、マスターにメッセージを送信
process.send({cmd:'comment_updated', .... });
マスター側にはメッセージのハンドラーを登録しておいて、メッセージが届いたら、Socket.IO経由でウェブブラウザ側に通知する。
worker.on('message', function(msg) {
if (msg.cmd && msg.cmd == 'comment_updated') {
io.to(コースのID).emit('comment_updated',{...});
}
});
worker.on('message', function(msg) {
if (msg.cmd && msg.cmd == 'comment_updated') {
io.to(コースのID).emit('comment_updated',{...});
}
});
こうすることで、更新されたコメント欄を、クラスターのmessageイベント→Socket.IOでリレーして、クライアント側に通知。
0 件のコメント:
コメントを投稿