生产者 - 使用MySQL DB的消费者

时间:2014-08-14 22:47:19

标签: java mysql sql algorithm

我的要求如下

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

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

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

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

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

有没有办法解决这个问题?任何其他设计方法也是受欢迎的。

1 个答案:

答案 0 :(得分:1)

您是否需要将关系数据库用作队列?这似乎是解决问题的一种不好的方法,特别是因为消息队列已经解决了这些问题。您可以使用MySQL来保持队列的状态,但它本身不会形成良好的队列。

看看ActiveMQ或JBoss Messaging(假设您使用的是JBoss)