8

我在这里有一个设计头痛,我将 PHP 和 MySQL 与 Java 结合使用(我的项目是一个 Android 应用程序)。我必须决定如何定期运行一系列服务器端计算。这里有大量关于 SO 解决如何创建 cron 作业等的材料,这很好,我很可能会到此结束,但我不确定如何从更广泛的意义上解决我的项目的这一部分。

该应用程序完全以用户的地理位置为中心。它们总是组织成 4 到 40 个之间的集群,这些集群在我的数据库中形成一个实例记录。这些实例可以随时变为活动或不活动。

任务

对于我的数据库中的每条记录,或者,我更喜欢实例,在每个时期,我想从其用户位置重新计算实例的质心(这很容易,特别是使用标量方法,因为它们非常接近),有效地移动位置通过更新实例的数据库中的纬度和经度值来了解实例本身。用户随后会在打电话回家时定期收到这些新的实例质心坐标。

方法

由于我的等级缺乏经验,这就是它变得混乱的地方。我首先编写了一个相对简单的计算,涉及一个 SQL 选择查询和一个后续 SQL 更新操作,对于每个实例,在每个时期。如果我们现在假设更新间隔约为 20-30 秒,那就是不到一分钟,显然这违反了 cron 作业的 1 分钟限制。(应该注意,如果绝对必要,可以硬编码时期之间的时间差)。

在短期内,这个过程可能只需要很少的时间来执行,因为实例/集群很少。但是,如果实例数量达到数千个,它可能会堆积大量 SQL 查询和大量时间来处理所有计算......为了减少不必要的负载,我自然想要结合一些机制来排除不活动的实例,尽管我猜仍然可以想象所需的计算时间可能会超过 epoch 间隔。我想这是(很多)以后的问题。

问题

就目前而言,问题有两个方面:

  1. 我想在每个时期为所有活动实例执行相同的简单功能。那么,有没有比运行那么多迭代更有效的方法呢?我可以使用一个大型的最终 SQL 更新查询以某种方式一次更新许多表行吗?像 mysqli_multi_query() 这样的东西在这里真的很有帮助吗?(此时我没有mysqli)。
  2. 考虑到它可能违反我一直在阅读的 cron 作业的 1 分钟限制这一事实,我如何最好地实施计时器或触发机制以在每个时期重新启动此过程?

我的点子

我目前的做法如下:

  1. 运行一个 SQL 选择查询以将其全部设置为当前 epoch,获取需要质心移位的实例 ID 号。
  2. 使用这些实例 ID 填充 PHP 数组
  3. 使用循环和一个或非常多的 SQL 更新(见上文)顺序移动每个实例,以将新的坐标对写入数据库。
  4. 安排在每个时期执行此任务(换句话说,每 x 秒)

上述方法合理吗?在这一点上,除非有更好的建议,否则我打算这样做。我真的不知道如何安排在每个时期执行的任务(第 4 点),但是……我已经到处找了,我自己也无法解决没有一些指导,我还不是很好。:) 一如既往,任何建议将不胜感激。

4

1 回答 1

4

您可能会考虑从计划任务转移到按需更新的方法。这很容易实现,但需要权衡取舍。

  • 添加一个名为 Last Updated 的日期时间字段

  • 每次查询对象时,检查
    “新鲜度”的最后更新字段(在您的情况下,如果它是 > 30 秒前)

  • 如果它是新鲜的,则将数据发送给用户。

  • 如果不新鲜,重新计算数据并将其保存到数据库中
    (确保更改最后更新的字段)。然后,将新
    数据发送给用户。

这将消除对计划任务的需要并摆脱更新每一行的浪费。但是,它会减慢对用户的响应。

于 2012-07-17T14:09:52.157 回答