2017年11月25日土曜日

コメントを複数人で記入する際の動作(備忘録)

コメントの記入を共同作業する際に、作業がバッティングしないよう、WebSocketを使って、記入画面の内容を(だいたい)同期するように改修しました。以下、その備忘録。


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(ポート番号) ;

Nginxでは、Socket.IO用のリバースプロキシを
    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',{...});
     }
   });

こうすることで、更新されたコメント欄を、クラスターのmessageイベント→Socket.IOでリレーして、クライアント側に通知。

0 件のコメント:

コメントを投稿