几乎实时的恢复成就Web服务可以扩展,如何减少呼叫数量



我正在建立实时成就Web服务。

我目前的想法是在MongoDB和玩家收藏中获得成就集合。我将在成就集合中存储成就列表(可以对该列表进行修改以添加新成就,并将作为成就定义(,它将包含统计数据和阈值列表(目标完成成就(,而播放器则将收集将具有由playerID组成的对象,以及每个成就的键,作为键,许多统计数据(进度(作为值以及信息(是否已完成(。

当客户发布新的统计数据时,我将获得成就列表,并通过获取成就集合来找到在其进度中使用这些统计数据的成就列表。然后,我需要获取玩家的收集,以查找已经完成的成就,并从当前的成就列表中删除这些成就。然后,我将再次获取玩家收集以获取其他统计数据并计算新的进度。我需要更新播放器收藏的成就的进度。如果成就完成,我会将回调发送给客户,以便看到它"实时"。

我的问题是我需要服务在高压下工作(成千上万的玩家发送了很多新的统计数据(例如杀人次数,也许是成千上万的成就统计数据((,我目前的想法似乎确实如此对数据库的电话太多。

我想改为更改为MySQL数据库,但我对它们不太好,因此我不确定情况是否会更好(可以看待速度速度吗?(。Redis对于一个大数据库来说似乎太昂贵了。

我应该使用更好的流/设计模式吗?

有没有办法制作模式,以便在重负荷下仍然很快?

我应该使用mySQL吗?如果是,那么什么可以帮助我加快事情的速度?(因此我可以阅读并设计更好的东西(

我从未使用过nosql,但经常使用SQL。所以我的想法可能是偏见或以SQL为中心的。

话虽如此,这是我的主意。总的来说,我认为根据新统计数据需要两个DB调用。

当客户发布新的统计数据时,我将获得成就列表,并通过获取成就集合来找到在其进步中使用这些统计数据的成就列表。

如果成就集合足够小,则可以在初始化服务时缓存到内存中。如果不是这样,我认为您应该采用" MySQL"方法,而不是独自完成此步骤,而是加入下一步。总之,我们可以减少一次DB

的旅行

然后,我需要获取玩家收集以查找已经完成的成就

这可能是DB

的第一次旅行

从我当前的成就列表中删除那些

我相信这与您的程序内的逻辑无关,而是逻辑。但是,如果我错了,请纠正我。

然后,我会再次获取玩家收集以获取其他统计数据并计算新的进度。

我认为您可以从第一次DB旅行中获取此信息,并保存在内存中的某个地方。因此不需要进一步的数据库旅行

我需要更新播放器收藏的成就的进度。

这将是您第二次更新的DB旅行。

如果成就完成,我会将回调发送给客户,以便看到它"实时"。

这与db

无关

如果这仍然太多了DB调用,并且您只想进行一次旅行,那么我唯一的想法是切换MySQL并创建一个处理逻辑的过程。

以这种方式,您将仅进行每个统计数据,这是不可避免的,并将所有负载推向DB层,以便在那儿扩展。

最新更新