我正在构建实时成就Web服务。
我目前的想法是在MongoDB中有一个成就集合以及一个玩家集合。我将成就列表存储在成就集合中(可以修改该列表以添加新的成就并将其用作成就定义),并且其中包含统计信息和阈值(完成成就的目标)列表,而玩家集合将包含由玩家ID组成的对象,以及将每个成就的决定作为键,将许多统计信息(进度)作为值以及信息(完成或未完成)。
当客户发布新的统计信息时,我将获取成就列表,并通过获取成就集合来查找那些在其进度中使用这些统计信息的成就。然后,我需要获取玩家集合以查找哪些成就已经完成,并将那些成就从我当前要处理的成就列表中删除。然后,我将再次获取玩家集合以获取其他统计信息并计算新进度。我需要在玩家收藏上更新成就的进度。如果一项成就完成了,我将向客户发送回叫,这样它就可以“实时”看到它。
我的问题是我需要在高压力下工作的服务(成千上万的玩家发送大量新数据(如击杀次数,也许数千个统计数据和成千上万的成就)),而我目前的想法似乎做得太多了调用数据库。
我曾考虑过改用MySQL数据库,但对它们却不太满意,因此我不确定情况是否会更好(视图能否加快速度?)。对于大型数据库而言,Redis似乎过于昂贵。
我应该使用更好的流程/设计模式吗?
有没有一种制作模式的方法,以便在重负载下仍然可以快速进行?
我应该改用MySQL吗?如果是的话,什么是可以帮助我加快速度的关键因素? (所以我可以阅读并设计更好的东西)
最佳答案
我从未使用过NoSQL,但经常使用SQL。所以我的想法可能有偏见或以SQL为中心。
话虽如此,这是我的主意。总的来说,我认为每个新统计信息需要两个数据库调用。
当客户发布新的统计信息时,我将获取成就列表,并通过获取成就集合来查找那些在其进度中使用这些统计信息的成就。
如果成就集合足够小,则可以在初始化服务时将其缓存到内存中。
如果没有,我认为您应该使用“ MySQL”方法,不要单独执行此步骤,而应加入下一步。总之,我们可以减少一次DB旅行
然后,我需要获取玩家集合以查找哪些成就已经完成
这可能是第一次进入数据库
从我当前要处理的成就列表中删除那些
我相信这与数据库无关,但与程序内的逻辑有关。但是,如果我错了,请纠正我。
然后,我将再次获取玩家集合以获取其他统计信息并计算新进度。
我认为您可以从第一次数据库旅行中获得此信息并将其保存在内存中的某个位置。因此,无需进一步的数据库旅行
我需要在玩家收藏上更新成就的进度。
这将是您的第二次数据库更新。
如果一项成就完成了,我将向客户发送回叫,这样它就可以“实时”看到它。
这与数据库无关
如果这仍然是太多的DB调用,而您只想进行一次旅行,那么我唯一的想法是切换MySQL并创建一个处理逻辑的过程。
这样,每个统计信息只能建立一个数据库联系人,这是不可避免的,并将所有负载推到数据库层,以便在该层进行扩展。
关于mysql - 可扩展的几乎实时的RESTful成就Web服务,如何减少调用数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43638072/