支持工作批处理的排队系统(例如,一次为1名工人提供多个工作)

时间:2012-03-03 22:52:24

标签: php gearman beanstalkd

我正在寻找一个可以支持以下场景的排队系统:

  • 客户添加一份工作 - 检查特定网址(URL1)有多少Facebook喜欢;
  • 客户端添加另一个作业 - 检查URL2的相同信息;
  • [...]

  • 一个工人从队列中挑选1到50个工作(网址)(例如,如果只有5个 - 它拿到5个,如果有60个 - 拿起50个,其他人拿到另一个工人),并发出针对Facebook API的请求(每个请求允许多个网址)。如果成功,所有作业都将从队列中取出,如果失败 - 所有作业都将保留。

我正在使用PHP,我调查了GearmanBeanstalkd,但没有找到任何类似的功能。是否有任何(免费)排队系统支持这种“批次出列”?

或者,或许,任何人都可以提出另一种处理此类问题的方法?我已经考虑在排队系统之外保留一个“检查”网址列表,然后在每个X周期运行一个cron作业的最多N个项目的捆绑中添加它们。但那是建立自己的队列,这会破坏整个目的,不是吗?

2 个答案:

答案 0 :(得分:1)

我已经使用Beanstalkd一次获取100个推特名称,然后用它们全部调用API。当我完成后,我删除了它们 - 但如果我愿意,我可以选择不删除一些(或全部)。

这是一个简单的循环来保留初始100(一次一个),然后我将结果(作业ID和返回的数据)放入一个数组中。当我完成处理有效负载(在这个例子中,是一个推特屏幕名称)时,我经历了删除它们 - 但我可以很容易地将它们释放回队列。

答案 1 :(得分:0)

也许你可以从MediaWiki's job queue system中获取灵感。不是很复杂,但如果您决定自己动手,它可能会遇到some issues

用于此目的的数据库表定义为here