Firebase云功能无法跟上快速数据库更新



你好,我正在尝试构建一个多人游戏。我有一个工作队列:

.ref('Multiplayer/Queue/{queueCategory}/Players/{playerid}')
.onCreate((snapshot, context) => {
const root = snapshot.ref.root;
var category = context.params.queueCategory;
const gameDir = "Multiplayer/Active/" + category;
var gameID = snapshot.ref.root.child(gameDir).push().key;
root.child("Multiplayer/Queue/" + category + "/Players").once("value").then(players => {
var secondplayer: DataSnapshot | null = null;
functions.logger.log(players.numChildren());
players.forEach(player => {
if(player.val() === "placeholder" && player.key !== context.params.playerid) {
secondplayer = player;
}
});
functions.logger.log(secondplayer);
if(secondplayer === null) return null;
root.child("Multiplayer/Queue/" + category + "/Players").transaction(function (matchmaking) {
//check if player joined differnet game
if (matchmaking === null || matchmaking === undefined || secondplayer === null || matchmaking[context.params.playerid] !== "placeholder" || matchmaking[secondplayer?.key || 1] !== "placeholder") return matchmaking;
matchmaking[context.params.playerid] = gameDir + "/" + gameID + "/player1";
matchmaking[secondplayer.key || -1] = gameDir + "/" +gameID + "/player2";
return matchmaking;
}).then(result => {
var playerval: string  = result.snapshot.child(context.params.playerid).val();
var pPath = playerval.split('/');
pPath.pop();
playerval = pPath.join('/');
functions.logger.log("playervalue: " + playerval);
functions.logger.log("gamedir: " + gameDir + gameID);
if(playerval !== gameDir + "/" + gameID) return;
var game = {
gamestate: "init",
category: category,
Players: {
"player1": "",
"player2": ""
}
}
root.child(gameDir + "/" + gameID).set(game).then(snap => {
return null;
}).catch(error => {
console.log(error);
})
}).catch(error => {
console.log(error);
})
return  null;
}).catch(error => {
console.log(error);
})
});

此脚本将玩家配对,并将队列中玩家的值更改为新的游戏室目录.一切正常,除了有多少玩家同时加入队列(以大约1层/秒的速度分解(。我怀疑问题出在代码的这一部分:

var secondplayer: DataSnapshot | null = null;
functions.logger.log(players.numChildren());
players.forEach(player => {
if(player.val() === "placeholder" && player.key !== context.params.playerid) {
secondplayer = player;
}
});
functions.logger.log(secondplayer);
if(secondplayer === null) return null;

如果有许多玩家加入,则第二玩家将与功能的其他实例重叠,并且最终在设置了第二玩家值之后终止。我该怎么解决这个问题?请帮我

云函数不保证执行顺序。有一个Firecast解释并行执行。您可以查看事务,但您的用例似乎不像递增或递减值那样简单。

云功能(任何无服务器功能(可能不是所有情况下的最佳选择。

一旦玩家匹配,您必须确保用户立即从节点中删除。使用交易,您可以立即匹配并移除2名玩家。因此,当第三个即将匹配的用户将被添加到队列中而不是队列中时。

您可能需要在服务器上运行队列(如果读写速度如此之快(,或者重构与玩家匹配的逻辑。云计算可能是更好的选择。你可以使用类似OpenMatch的东西。

我记得我把所有试图匹配的用户都堆在一个数组中,然后每2秒运行一个cron作业,使它们成对。然后,我使用实时数据库将更改发送给相关用户。尽管这在云功能中可能不可能实现,因为每个功能都独立运行。

相关内容

  • 没有找到相关文章

最新更新