我有基于LAMP的业务应用程序。 SugarCRM更精确。目前有120多名活跃用户。每个用户每天都会生成一些用于复杂计算的记录,以获得所谓的“个人评级”。
计算一个“个人评级”值需要大约6秒钟。之前没有一个大问题:每个用户点击提供的链接开始“个人评级”计算,等待6-7秒,并显示值。
但现在我需要实施“整体评级”计算。这意味着除了“个人评级”之外,我还要计算并显示给用户:
应用程序的所有用户中的最低个人评级
应用程序的所有用户中的最大个人评级
当前用户在所有个人评级范围内的位置。
说,当前用户的个人评分等于220分,评分的最小值为80,最大值为235,他在所有用户中排名第23位。
(imho)有哪些主要问题需要解决?
如果一次计算持续6秒,则整体计算将花费超过10分钟。我认为在这个时期使应用程序几乎无法访问是不合适的。如果用户数量在不久的将来会增加2-3倍呢?
这些计算可以作为夜间工作完成,但所有用户都在不同的时区。在俄罗斯极端时区之间的差异是9小时。因此,俄罗斯西部地区的人们仍在“今天”工作。虽然东部地区的人们正在醒来“明天”工作。那么在这种情况下夜间工作的最佳时间是什么?
是否有建立此类评级系统的最佳实践方法?
答案 0 :(得分:0)
只提供所提供的信息,我看到的唯一选项是:
显而易见的一个 - 减少评分计算所需的时间(6秒计算1个用户的评分似乎很多)
如果可能,请根据需要重新计算某些中间值(例如,有10个构成评级的值,所有基于不同的数据,当某些数据发生变化时,标记相应的值)重新计算的价值)。要么重新计算:
部分批量计算 - 仅按所选间隔重新计算用户评级的x(其中x是某个选定值) - 缺点是,在某些时候,某些评级可能已过期
计算是否不忙 - 要么连续重新计算评级,要么只按选定的时间间隔进行评分,而不是锁定系统,让它作为后台进程运行,只在系统空闲时才能正常工作
答案 1 :(得分:0)
(抱歉,没有管理“长”评论发布;所以决定发帖作为答案)
@Dukeling
几乎所有时间进行上述计算的SQL查询只是应该在PHP代码中执行的业务逻辑的复制。逻辑被移到SQL中,希望减少计算时间。好的,我将尝试优化SQL查询并在PHP代码中执行逻辑。
假设优化后的应用程序仅计算1秒的个人评级。大!但即使在这种情况下,登录系统的第一个用户应该等待120秒(120+用户* 1秒= 120秒)来计算总体评级并获得其中的位置。
我正在考虑实施以下方法:
让我们有2个“整体评分” - “今天”和“昨天”。
为了显示目的,我们将使用“昨天”整体评级表示为已经排序的巨大PHP数组。
当用户点击计算链接时,他开始“今天”计算,但应用程序显示“昨天”值。因此,我们可以快速访问“昨天”评级,每个用户随机启动将于明天为他们显示的评级计算。
用户列表按时区划分。每小时一个cron作业开始检查所选时区中是否有任何用户没有计算“今天”个人评级(例如用户没有登录应用程序)。如果是这样,应用程序开始计算个人评级并将其值放在“今天”(仍然不可见)的评级数组中。因此,我们有一个cron作业,每晚为每个特定于时区的用户组运行,并在用户未登录系统时填补可能的空白。