0

我有基于 LAMP 的业务应用程序。SugarCRM 更准确。目前有 120 多个活跃用户。每个用户每天都会生成一些用于复杂计算的记录,以获得所谓的“个人评分”。

计算一个“个人评分”值大约需要 6 秒。而且之前没有大问题:每个用户点击提供的链接开始“个人评分”计算,等待6-7秒,得到显示的值。

但现在我需要实现“总体评分”计算。这意味着除了“个人评分”之外,我还必须计算并向用户显示:

  • 应用程序所有用户的最低个人评分

  • 应用程序所有用户的最大个人评分

  • 当前用户在所有个人评级范围内的位置。

比如说,当前用户的个人评分等于 220 分,评分最小值为 80,最大值为 235,在所有用户中排名第 23 位。

要解决的主要问题是什么(恕我直言)?

  1. 如果一个计算持续 6 秒,那么整个计算将需要 10 分钟以上。我认为在此期间使应用程序几乎无法访问是没有好处的。如果用户数量在最近的将来会增加 2-3 倍呢?

  2. 这些计算可以作为夜间工作完成,但所有用户都在不同的时区。在俄罗斯,极端时区之间的差异是 9 小时。因此,俄罗斯西部的人们仍在“今天”工作。而东部地区的人们正在“明天”醒来工作。那么在这种情况下,夜间工作的最佳时间是什么时候?

是否有任何最佳实践|方法|算法来建立这样的评级系统?

4

2 回答 2

0

(对不起,没有管理“长”评论发布;所以决定发布作为答案)

@杜克灵

上面提到的几乎所有时间都用于计算的 SQL 查询只是对应该在 PHP 代码中执行的业务逻辑的复制。逻辑被转移到 SQL 中,希望减少计算时间。好的,我将尝试优化 SQL 查询和在 PHP 代码中执行逻辑。

假设经过优化的应用程序仅计算 1 秒的个人评分。伟大的!但即使在这种情况下,第一个登录系统的用户也应该等待 120 秒(120+ 个用户 * 1 秒 = 120 秒)来计算总体评分并获得其在其中的位置。

我正在考虑实施以下方法:

  1. 让我们有 2 个“总体评分”——“今天”和“昨天”。

  2. 出于显示目的,我们将使用“昨天”的总体评分表示为已排序的巨大 PHP 数组。

  3. 当用户点击计算链接时,他开始“今天”计算,但应用程序显示他“昨天”值。因此,我们可以快速访问“昨天”评分,并且每个用户随机启动评分计算,这些计算将在明天显示给他们。

  4. 用户列表按时区划分。每隔一小时,一个 cron 作业就会开始检查在选定的时区中是否有任何用户没有计算出“今天”的个人评分(例如,用户没有登录应用程序)。如果是这样,应用程序开始计算个人评分并将其值放入“今天”(仍然不可见)的总体评分数组中。因此,我们有一个 cron 作业,每晚为每个特定于时区的用户组运行,并在用户未登录系统的情况下填补可能的空白。

  5. 在计算出所有时区的所有用户后,应用程序
    1. 对“今天”数组进行排序,
    2. 滴“昨天”一个,
    3. 将“今天”重命名为“昨天”和
    4. 初始化新的“今天”。

你怎么看呢?是否足够合理?

于 2013-06-24T12:47:40.210 回答
0

仅给出所提供的信息,我看到的唯一选项:

  1. 显而易见的 - 减少评分计算所需的时间(6 秒来计算 1 个用户的评分似乎很多)

  2. 如果可能,有中间值,您只根据需要重新计算其中的一些值(例如,有 10 个构成评级的值,全部基于不同的数据,当一些数据发生变化时,标记适当的值以进行重新计算)。要么重新计算:

    • 在您每天重新计算期间或
    • 更新发生时

  3. 部分批量计算 - 仅以选定的时间间隔重新计算 x 的用户评分(其中 x 是某个选定的值) - 缺点是,在任何时候,一些评分都可能过时

  4. 计算是否不忙 - 连续重新计算评级或仅在选定的时间间隔这样做,但不是锁定系统,而是让它作为后台进程运行,仅在系统空闲时才工作

于 2013-06-24T08:22:38.313 回答