我正在使用beanstalkd的Perl客户端。我需要一种简单的方法来不要将相同的工作排成两次。
我需要的东西基本上要等到有K个元素,然后将它们组合在一起。要做到这一点,我有制作人:
insert item(s) into DB
insert a queue item into beanstalkd
消费者:
while ( 1 ) {
beanstalkd.retrieve
if ( DB items >= K )
func_to_process_all_items
kill job
}
这是请求/处理的数量是线性的,但是在:
的情况下insert 1 item
... repeat many times ...
insert 1 item
假设所有这些插入都发生在检索作业之前,这将添加N个队列项,并且它会这样做:
check DB, process N items
check DB, no items
... many times ...
check DB, no items
是否有更智能的方法来执行此操作,以便它不会不必要地插入/处理以后的作业请求?
答案 0 :(得分:2)
我有相关的要求。我只想在几分钟内处理一次特定的工作,但是生产者可以排队同一工作的几个实例。我使用memcache来存储作业标识符,并将密钥的到期时间设置为几分钟。
当工作人员尝试将作业标识符添加到memcache时,只有第一个成功 - 如果未能添加作业ID,则工作人员将删除该作业。几分钟后,密钥将从memcache到期,并且可以再次处理作业。
不是特别优雅,但它有效。
答案 1 :(得分:1)
这对你有用吗?:
reserve()
电话reserve()
您只需要注意作业不会从隐藏状态返回缓冲区队列。一种故障安全的方法可能是删除它,然后将其添加到实时。
两个独立的队列仅用于清洁分离。你可以通过埋葬每个工作来做同样的事情,直到有K-1,然后在第K个工作到来时,将所有这些工作都踢出去。