2016-10-15 9 views
0

私は部屋の操作を実装する単純なゲームエンジンを作っています。NodeJS + Cluster + Socket.IOゲームルームの作成方法は?

私はたくさんのことを考えていましたが、私は部屋を有効な方法で作成していないことに疑問を持っていました。

ここにシナリオがあります。だから、

1) There's one static room, where users are able to 'register'. 2) after certain number of users are registered, it should create dynamic room and put these certain number of users in that room and make them quit the static room.

、我々は複数のインスタンスでこれを実行すると、我々は2人のユーザーを待っているとしましょう場合。

2人のユーザーが静的な部屋に参加する - >新しい部屋を作成する(赤目にする) - >その2人のプレイヤーをその部屋に登録する(購読する) - >それらのプレーヤーを静的な部屋(列のようなシステム)から離れるようにする。

今私が思うことは問題です。

2人のユーザーが静的ルームに参加する - >新しいルームを作成する前に、他の1人が静的ルームに参加(別のノードインスタンス) - >新しいルームを作成 - > 2人のプレーヤーを移動 - >新しい部屋 - >奇妙なことが起こる。

これは間違いありませんか?どのようにキュースタイルの部屋を実装する必要がありますか?

答えて

1

アトミック操作が必要:これらの4つのステップすべてをトランザクションに入れます。 Redisでは、TransactionまたはLua Scriptingのいずれかを使用して達成することができます。

Luaスクリプトを使用すると、このようなスクリプトを持つことができますが:

-- add new user to static room 
redis.call('lpush', 'static_room', ARGV[1]) 

-- if the number of static room reaches the limit 
local num = redis.call('llen', 'static_room') 
if num == 2 then 
    -- get the room number for a new dynamic room 
    local new_dynamic_room_num = redis.call('incr', 'dynamic_room'); 
    local dynamic_room = 'dynamic_room' .. new_dynamic_room_num 

    -- move all users from static room to dynamic room 
    while true do 
     local num = redis.call('llen', 'static_room') 

     if num == 0 then break end 

     redis.call('rpoplpush', 'static_room', dynamic_room) 
    end 
end 

のluaスクリプトがアトミックに実行されるため、我々は、動的に静的部屋からすべてのユーザーを移動する終える前に、他のユーザー決して静的ルームに参加することはできませんがルーム。

+0

あなたは絶対に正しいですが、私は1つを知りたいです、それらを原子的に行うネイティブなJavaScriptの方法はありますか? – Nika

+0

申し訳ありませんが、私はjavascriptに精通していません... –

0

解決策は、接続されていないすべてのプレイヤーを部屋の作成とプレイヤーの割り当てを担当する1つの固有のノードインスタンスに入れることです。次に、それらが所定の部屋に割り当てられると、それらをこの部屋を担当するノードインスタンスにリダイレクトする。

+0

ノードクラスタを使用すると意味がありません。 – Nika

+0

最初のインスタンスは単なるエントリポイントなので意味があります。ユーザが部屋に影響を受けると、そのユーザはクラスタ内の別のインスタンスによって処理されます。 –

+0

それは私が推測するマスターである必要がありますか?またはどのように私はそのようなことを行うことができます、私はどのノードインスタンスクライアントに接続するかわからない – Nika

関連する問題