gpt4 book ai didi

node.js - NodeJS + Cluster + Socket.IO 如何正确创建游戏房间?

转载 作者:可可西里 更新时间:2023-11-01 11:19:53 24 4
gpt4 key购买 nike

我正在制作一个简单的游戏引擎,它实现了房间操作。

我想了很多,但仍然怀疑我没有以正确的方式腾出房间。

这是场景。

1) 有一个静态房间,用户可以在其中“注册”。
2) 注册一定数量的用户后,创建动态房间,将一定数量的用户放入该房间,让他们退出静态房间。

因此,如果我们在多个实例中运行它,假设我们正在等待 2 个用户。

2个用户加入静态房间->创建新房间(在redis中)->让这两个玩家进入那个房间(订阅)->让这些玩家离开静态房间(类队列系统)。

现在我觉得是个问题。

2 个用户加入静态房间 -> 在创建新房间之前,另一个玩家加入静态房间(不同 Node 实例) -> 创建新房间 -> 将两个玩家移到那里 -> 另一个实例仍然认为有足够的用户创建新房间room -> 奇怪的事情发生了。

这是正确的吗?队列式房间应该如何实现?

最佳答案

您需要原子操作:将所有这 4 个步骤放入事务中。对于 Redis,您可以使用 TransactionLua 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 脚本以原子方式执行,在我们完成将所有用户从静态房间移动到动态房间之前,没有其他用户可以加入静态房间。

关于node.js - NodeJS + Cluster + Socket.IO 如何正确创建游戏房间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com