4

我正在为我们的员工整理一个界面,以上传他们需要行业统计数据的产品列表(目前一次手动执行一个)。
然后,每个产品都将通过 webservice api 提供给我们的统计引擎。
我会回复的。Stat 的引擎将从我的 api 请求“下一个受害者”。

用户上传的每个列表将有 50 到 1000 个产品,并且将是自己的队列。
目前,队列/列表可能每天大约添加(并通过完成删除)10-20 次。
如果成功,几个月后流量可能会增加到每天 700-900 个列表。

我们只是计划采用一种简单的循环方法来将流量均匀地引导到队列中。多路复用器将从List A
中获取顶部项目,然后是List B,然后是List C等等,直到再次循环回到List A ......请记住,可以随时添加/删除列表/队列。

我面临的问题只是概念化管理。
我考虑将每个队列存储为一个平面文件并通过关系数据库(MySQL)管理轮换。想过反过来做。考虑过使用完全平面文件或完全关系数据库......底线,我很灵活。
无论如何,当我尝试无国籍地将可变的参与者列表与循环旋转融合在一起时,我的大脑只是蒸汽锁定(我刚从一个短暂的假期回来,我认为我的大脑还没有回家;)

有没有人做过这样的事情?
你是怎么处理的呢?
如果你必须再做一次,你会改进什么?

欢迎任何和所有提示/建议/建议。

注意:由于来自我们统计引​​擎/工具的每个请求都将相隔很多秒,如果不是几分钟的话,我需要保持这个无状态。

4

3 回答 3

1

当然,列表数据应该存储在数据库中。您的 PHP 端应该有一个显示系统状态的视图,以及添加列表的表单。

由于每个请求都成为自己的队列,并且所有请求队列的优先级都被认为是相同的,因此理想的表数可能是三个。一个列出请求及其相对于另一个的优先级(以确定谁在轮询中下一个)和处理状态,另一个列出每个请求的尚未处理的内容(列表项),第三个表列出每个队列中已处理的项目

您还需要一个执行实际处理的脚本,该脚本不是由用户请求驱动,而是由系统调度的定期执行的作业(限制为您想要的任何内容)驱动。这当然也可以在 PHP 中。您可以在此处设置一次 10 次列表检查和更新。

处理将类似于:

  1. 从最高优先级队列中选择下一组最多 10 个项目。
  2. 处理它们,在它们完成时更新它们的数据库状态。
  3. 更新上述队列的优先级,使其现在是最低优先级。

如果添加新队列,它们将以最低优先级添加。

优先级可以用整数表示。

您的用户需要耐心等待他们的列表得到处理,然后查看或下载结果。您可以在视图页面上为此设置一个自动刷新脚本。

于 2012-07-24T23:02:14.717 回答
0

听起来您正在尝试实现Gearman已经做得很好的东西。对于每个上传/请求,您可以简单地将作业发送到 Gearman 服务器以进行排队。

Gearman 可以配置为持久的(以防万一事情变糟),这应该消除您在关系数据库中记录请求的需要。

然后,您可以根据需要启动任意数量的工人。我知道您建议串行运行所有作业,您仍然可以这样做,但您也可以并行化工作,这样您的用户就不会像所有作业都以串行方式处理时那样久坐时尚。

于 2012-07-25T01:37:42.977 回答
0

经过一夜好眠后,我现在对自己有了智慧(我希望:)。
一个简单的解决方案是优先级的平面文件。
有一个文本文件,每行只有一个列表/队列 ID。列表的一端
馈送,然后添加另一端......简单。

欢迎批评;o)

感谢@Trylobot 和@Chris_Henry 的反馈。

于 2012-07-25T12:46:52.370 回答