2008-11-11 39 views
4

我需要使用表实现一个队列。 业务需求是有一个单一的队列,可以通过5-10个盒子获取下一个工作/作业。每天不会有超过5000个工作。另外,一批工作应该一次“出列”。队列使用表

只是想知道什么是我可能遇到的问题领域和问题,因为我以前没有做过。如果任何人以前遇到过/做过这些事情,能否请您指出一个设计/样例实施或需要处理的问题。

谢谢

+0

这听起来对我来说很有家庭气息! – 2008-11-11 10:25:28

回答

3

有很多通用的排队或消息服务。即使你想实现你自己的系统,你也可以试着看看其他几个。首先想到的是JMS(Java Message Service),其实现方式如Apache ActiveMQ,OpenJMSJBoss Messaging。那么你也有很多非开源的产品。

想到的第二件事是Amazon Simple Queue Service。有几个产品实现了相同类型的界面,如django-queue-service

祝你好运!


+1

感谢Guillaurne!我已经看过JMS和ActiveMQ。但是,由于需求是一个非常小的应用程序,队列中的消息将会非常少(5000是我们实际期望的3倍多),因此我们决定使用数据库表作为队列 – 2008-11-11 10:39:58

2

有问题的地方:

  • 并发
  • 安全
  • 速度
  • 编码
  • 唯一

当然这一个:

  • 问题域的规范不清

编码愉快!

2

这听起来不太难;只需输入一个时间戳,只要输入作业即可排序。根据数据库的不同,可以使用当前时间戳自动填充此字段。

提取作业时,只需将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即可。

如果您的意思是可以对作业进行分组,则可能需要一个作业队列,并将子项目放在另一个表(不是队列,只是一个外键指向作业项的常规表)。

0

谢谢Vegard。

但是,您提出的方法会导致作业请求丢失,以防系统执行作业失败/崩溃。

我用下面的列

思维队列表
  • 请求ID /邮件ID(主键)
  • LockedBy(谁是工作的要求)
  • LockedTime(当请求被锁定处理)
  • RequestedTime(当请求被添加到队列)
  • CompletionTime(当请求完成)
  • 状态(等待/加工)
  • RequestMessage(序列化的Java在我的案件对象)
  • 请求者(谁入队请求)

我可以写一个存储过程[GetNextItemsInQueue]它返回一个列表可以说10请求,设置锁定时间和锁定时间。如果锁定时间增加了指定的限制,则记录可以恢复到待定状态。

这个问题?