【问题标题】:Queue using table使用表排队
【发布时间】:2010-09-21 18:50:34
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 这对我来说听起来很家庭作业!

标签: queue message-queue queue-table


【解决方案1】:

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

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

祝你好运!


【讨论】:

  • 感谢吉劳恩!我已经查看了带有 ActiveMQ 的 JMS。但由于要求是一个非常小的应用程序,并且队列中的消息会非常少(5000 是我们实际预期的 3 倍多),我们决定使用数据库表作为队列
【解决方案2】:

问题领域:

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

当然还有这个:

  • 问题域的说明不明确

编码愉快!

【讨论】:

    【解决方案3】:

    这听起来不太难;只需包含一个时间戳,您可以在输入作业时对其进行排序。根据数据库,该字段可以自动填充当前时间戳。

    在获取作业时,只需将 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。

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

    【讨论】:

      【解决方案4】:

      感谢维加德。

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

      我在想一个带有以下列的队列表

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

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

      这个有什么问题吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-10
        • 2022-01-25
        • 2023-03-30
        • 2018-04-21
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多