我需要使用表实现一个队列。 业务需求是有一个单一的队列,可以通过5-10个盒子获取下一个工作/作业。每天不会有超过5000个工作。另外,一批工作应该一次“出列”。队列使用表
只是想知道什么是我可能遇到的问题领域和问题,因为我以前没有做过。如果任何人以前遇到过/做过这些事情,能否请您指出一个设计/样例实施或需要处理的问题。
谢谢
我需要使用表实现一个队列。 业务需求是有一个单一的队列,可以通过5-10个盒子获取下一个工作/作业。每天不会有超过5000个工作。另外,一批工作应该一次“出列”。队列使用表
只是想知道什么是我可能遇到的问题领域和问题,因为我以前没有做过。如果任何人以前遇到过/做过这些事情,能否请您指出一个设计/样例实施或需要处理的问题。
谢谢
有很多通用的排队或消息服务。即使你想实现你自己的系统,你也可以试着看看其他几个。首先想到的是JMS(Java Message Service),其实现方式如Apache ActiveMQ,OpenJMS或JBoss Messaging。那么你也有很多非开源的产品。
想到的第二件事是Amazon Simple Queue Service。有几个产品实现了相同类型的界面,如django-queue-service。
祝你好运!
感谢Guillaurne!我已经看过JMS和ActiveMQ。但是,由于需求是一个非常小的应用程序,队列中的消息将会非常少(5000是我们实际期望的3倍多),因此我们决定使用数据库表作为队列 – 2008-11-11 10:39:58
有问题的地方:
当然这一个:
编码愉快!
这听起来不太难;只需输入一个时间戳,只要输入作业即可排序。根据数据库的不同,可以使用当前时间戳自动填充此字段。
提取作业时,只需将SELECT和DELETE语句放入事务中即可。如果你觉得不舒服,这样的事情可能做到这一点:
UPDATE tblQueue SET mark = <unique application id> WHERE mark IS NULL ORDER BY timestamp ASC LIMIT 1
SELECT * FROM tblQueue WHERE mark = <unique app id>
DELETE FROM tblQueue WHERE mark = <unique app id>
通过使用这种设置可避免交易,如果他们吓唬你。
你对一批的定义有些不清楚;如果您只是表示我应该能够一次处理10个项目,只需将第一个查询的LIMIT 1子句更改为LIMIT 10即可。
如果您的意思是可以对作业进行分组,则可能需要一个作业队列,并将子项目放在另一个表(不是队列,只是一个外键指向作业项的常规表)。
谢谢Vegard。
但是,您提出的方法会导致作业请求丢失,以防系统执行作业失败/崩溃。
我用下面的列
思维队列表我可以写一个存储过程[GetNextItemsInQueue]
它返回一个列表可以说10请求,设置锁定时间和锁定时间。如果锁定时间增加了指定的限制,则记录可以恢复到待定状态。
这个问题?
这听起来对我来说很有家庭气息! – 2008-11-11 10:25:28