0

socket.io+クラスターを使用しておしゃべりアプリをスケーリングしようとしています。子プロセスが着信要求を処理することは、そのプロセスID(fork時に割り当てられる)に属することは可能ですか?
例えば:

http://mydomain/calculate?process=1

上記のリクエストはプロセス1によってのみ処理され、他のプロセスはそれを無視します。このように、同じ部屋のリクエストが同じプロセスで処理されるようにしたいので、socket.ioバックエンドとしてRedisStoreを使用する必要がない場合があります。

また、RedisStoreを使用すると、すべてのプロセスでio.sockets.manager.roomsデータが正確ではないことがわかったため、RedisStoreがどのように機能するのか疑問に思います。

編集:
別の言い方をすれば、クラスターマスタープロセスは、クエリ文字列に基づいて異なる子プロセスにリクエストをディスパッチできますか?

4

1 に答える 1

2

答えはノーです。この状況では、OSが負荷分散を処理します。クエリ文字列を処理するには、既にWebサーバー(この場合は子プロセス)に接続している必要があります。

私の経験から、クラスターは少し役に立たないと思います。複数のNodeJSプロセス(複数のポート上)を生成し、それらの前にプロキシ(nginx?)を配置する方がはるかに簡単です。簡単でスケーラブルです。

socket.ioについて:クラスターでは正しく機能しないと思います(グローバル変数を共有しているため、問題が発生します)。繰り返しますが、個別のNodeJSプロセスを生成すると、問題が修正されるはずです。また、複数のマシンに拡張する必要があるポイントに到達すると便利です。クラスターを使ったトリックは、その時点では役に立ちません。

最後の注意:socket.ioは適切にスケーリングされません。独自のWebSocketサーバー(たとえば、WSに基づく)を作成し、独自のスケーリングメカニズムを実装することをお勧めします。たとえば、全対全のUDP pingに基づいています。これは、少量のサーバー(50〜100?)を処理する場合に適切に拡張できるはずです。

于 2012-11-21T09:24:55.630 に答える