4

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

只是想知道我以前没有做过的问题领域和问题是什么。如果有人以前遇到过这个/做过这个,请您指出一个设计/示例实现或需要注意的问题。

谢谢

4

4 回答 4

3

有很多通用的队列或消息服务。即使您想实现自己的系统,您也可以尝试查看其他一些系统。首先想到的是带有Apache ActiveMQOpenJMSJBoss Messaging等实现的 JMS( Java 消息服务)。然后你也有很多非开源产品。

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

祝你好运 !


于 2008-11-11T10:33:36.933 回答
2

问题领域:

  • 并发
  • 安全
  • 速度
  • 编码
  • 独特性

当然还有这个:

  • 问题域的不明确说明

快乐编码!

于 2008-11-11T10:37:29.653 回答
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。

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

于 2008-11-11T12:17:11.373 回答
0

谢谢维加德。

但是,如果执行作业的系统失败/崩溃,您建议的方法将导致作业请求丢失。

我正在考虑一个包含以下列的队列表

  • RequestID/MessageID(主键)
  • LockedBy(正在处理请求的人)
  • LockedTime(当请求被锁定以进行处理时)
  • RequestedTime(当请求被添加到队列时)
  • CompletionTime(请求何时完成)
  • 状态(待处理/处理中)
  • RequestMessage(在我的例子中是序列化的java对象)
  • 请求者(将请求排队)

我可以编写一个存储过程[GetNextItemsInQueue],它返回一个让我们说 10 个请求的列表,设置锁定者和锁定时间。如果 Locked Time 增加了指定的限制,则可以将记录放回 Pending 状态。

这个有问题吗?

于 2008-11-11T13:57:44.353 回答