【问题标题】:Producer - consumer using MySQL DB生产者 - 使用 MySQL 数据库的消费者
【发布时间】:2014-08-14 22:47:18
【问题描述】:

我的要求如下

  • 在表 (MySQL DB) 中维护记录池。
  • 如果条目数低于某个阈值,则作业充当生产者并填满此池。该作业每 15 分钟运行一次。
  • 可以有多个消费者,每个消费者只获取一条记录。同时进来的两个消费者应该得到两条不同的记录。
  • 生产者不应阻止消费者。因此,当生产者作业正在运行时,消费者应该能够获取任何可用的行。

生产者/消费者是应用程序代码的一部分,它又是一个 JBoss 应用程序。

为了确保每个消费者选择不同的记录(在并发的情况下),我们执行以下操作

  • 我们使用整数列作为索引。
  • 消费者将首先使用自己的名称更新索引值最低的记录。
  • 然后它将选择并提取该记录并继续进行。
  • 这种方法可确保两个消费者最终不会得到相同的记录。

我们看到的一个问题是,当生产者填满池时,消费者会被阻塞。由于生产者可能需要一些时间才能完成,因此在此期间的所有消费者都被阻塞,因为消费者的更新等待生产者的插入完成。

有没有办法解决这种情况?也欢迎任何其他设计方法。

【问题讨论】:

    标签: java mysql sql algorithm


    【解决方案1】:

    将关系数据库用作队列是硬性要求吗?这似乎是解决问题的一种不好的方法,尤其是因为消息队列已经解决了这些问题。您可以使用 MySQL 来持久化队列的状态,但它本身不会成为一个好的队列。

    看看 ActiveMQ 或 JBoss Messaging(假设您正在使用 JBoss)

    【讨论】:

    • 很遗憾,我们只能为此目的使用数据库。
    • 或许你可以转发你的架构师这篇文章:blog.engineyard.com/2011/…
    • 那是一篇很有见地的文章。感谢分享。虽然这绝对是将来要避免的事情,但我不得不让数据库以某种方式工作:(
    • 您有一个异步问题(使用术语生产者/消费者)这一事实确实让 JMS 尖叫。为什么必须重新发明解决方案? +1 以赛亚建议 JMS 并使用 MySQL 持久化。
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多