我正在创建一个基于动作的 rpg(不是真正的实时),玩家可以在其中建造自己的城市并在瓷砖地图上移动他的英雄。
背景:
我有这样的收藏:
- 地图瓦片(每个瓦片都有自己的文档),
- 英雄(包含统计数据+地图图块参考 - 将其放置在地图上)
- 城市(每个玩家都有自己的城市,我们存放玩家金币的地方)。
设想:
要移动英雄,我应该:
- 从集合中获取目标地图图块,以检查它是否被占用
- 从收藏中获取英雄并检查他是否已经在目的地地图图块
- 从收藏中获取城市并检查玩家是否有足够的金币移动
然后:
- 减去运动所需的金币并保存城市文件
- 使用新地图块更新英雄并保存英雄文档
问题:
我对整个过程的主要关注是,在找到金币之后和减去金币之前的城市可以通过另一个动作来改变(即认领金币动作,它只是通过在城市文件上的原子 $add 在城市中添加金币)。
当然,一些请求阻塞是在前端完成的,但游戏服务器只是 api,所以每个人都可以同时触发 20 个相同的请求,并导致数据不同步。有什么可以做的还是我超级敏感?
附言。在处理一个文档的任何地方,我们都使用 update 或 findOneAndUpdate(使用 $set、$add 等)来省略查找、更改回调中的记录然后保存。