Mongo bungeecord 播放器传输时数据库配置文件同步

Mongo Database profile sync on bungeecord player transfer

我在 bungeecord 服务器上有几个 Spigot 运行 实例。我有一个插件可以在每台服务器上进行自定义配置文件管理。此配置文件管理插件读取和写入 Mongo 数据库。所有的代码都很好用,我不是来写代码的。

但是,我的问题是这样的。当玩家从一台服务器传输到另一台服务器时,在目标服务器上再次加载配置文件之前,数据不会同步(写入数据库),这会导致加载旧数据。因此,人们的统计数据和经济状况没有得到正确反映。现在,如果他们登录,切换到迷你游戏服务器,玩游戏,然后赚取金币,然后他们退出服务器(注销),那么统计数据将在下次登录时正确反映。

配置文件管理器在 PlayerJoinEvent and data is written (saved) on PlayerQuitEvent and the PlayerKickEvent.

上加载配置文件内容

解决此问题的最佳方法是什么?有人可以给我指出正确的方向吗?

编辑:electroniccat 在官方 Spigot IRC 上表示,玩家在与之前的服务器断开连接之前开始连接到目标服务器。既然这确实有意义,解决这个问题的最佳方法是什么?

我建议将 status 变量添加到 MongoDB 中的玩家资料中。

然后,使用蹦极插件或类似工具来检测玩家何时开始交换服务器;将 状态 设置为 saving

当您保存播放器数据时 on PlayerQuitEvent,将 状态 设置为 saved

然后,当玩家登录时,PlayerJoin 确保状态为 saved。如果不是,添加一个等待几秒钟的计时器(我建议实际在 AsyncPlayerPreLoginEvent 上加载,这样登录会延迟,他们不会带着空配置文件四处走动)——和确保计时器继续尝试(可能最多 3 次)直到 statussaved。如果 3 次尝试都通过但仍未保存,则踢玩家/阻止登录(尽管这不应该发生)。确保尝试之间有足够的延迟。

我不确定你为什么会遇到这个问题,因为我以前使用 Mongo 作为蹦极服务器,但从未遇到过玩家配置文件的问题。

另一种选择是通过 redis 进行配置文件缓存,通过保存间隔和休假保持更新。 或 pub/sub 或插件消息传递,将配置文件数据发送到 bungee 实例并让它处理保存配置文件。

确保在玩家登录并加载他们的个人资料后立即将状态设置为saving。否则这些数据将不会被及时推送以供读取,因为加入事件在蹦极退出之前被触发。 (也许使用布尔值而不是 'saving' / 'saved' 会更好)

时间线:

(状态 1 = 已保存,状态 0 = 等待保存)

初始加入 bungee:加载配置文件,加载配置文件后设置 status: 0

切换服务器: 目标服务器上的 AsyncPlayerPreLoginEvent 触发:检查配置文件是否已加载(如果状态 = 1),如果已加载则设置 status: 0。第一次尝试时可能不会出现这种情况,因此每约 20-40 个刻度设置一个计时器以重新尝试

源服务器上的 PlayerQuitEvent 触发:更新 status: 1,使用相同的更新将配置文件保存到 mongo。这将允许目标服务器上的 AsyncPlayerPreLoginEvent 加载配置文件。

我建议通过 Redis 使用缓存,因为它与 mongo 配合得很好,并且可以使这种情况更容易处理,尤其是在加载时间方面。