首页 文章

分布式任务队列中的并发( 生产环境 者/消费者)

提问于
浏览
1

我的应用程序(Java)随机生成一些任务,并由分布式后台线程消耗异步 .

我目前没有像ZooKeeper这样的分布式锁解决方案 . 我没有任何第三方消息队列 .

我使用数据库作为任务队列,消耗的结果也保存在数据库中,数据库共享所有消费者/ 生产环境 者的访问权限 .

我有一些像这样的代码:

消费者:

while(true) {
  // block the thread and wait from producer's notify
  // my producers would produce MANY work items but only notify each consumer ONCE.
  waitProducer();

  // consume the queue
  while(database.queueNotEmpty()) {
    // consume each work item and remove from database queue
    consumeAll();
  }
}

制片人:

for(...) {
  database.enqueue(work[i]);
}
// notify all consumers
notifyAllConsumer();

显然上面的代码有并发错误 . 我有3个问题:

1.如何避免分布式消费者消费同样的任务? (关于行:“consumeAll()”)或减少重复的计算 . 多次使用一个任务不会是一个错误,但在我的情况下效率较低 .

2.如何避免队列不是空的但没有消费者活跃?顺序是:一个消费者和一个 生产环境 者样本:

  • Consumer:while(database.queueNotEmpty())//队列为空,打破while循环

  • Producer:database.enqueue(work [i]); //生成一个任务

  • 制片人:notifyAllConsumer(); //通知消费者,但它已经处于活动状态

  • 消费者:waitProducer(); //挂起线程但仍有工作要做


3.这个问题的最佳做法是什么?特别是在纯java中 . 是第三方消息队列还是类似zookeeper的东西?减少锁定或无锁定是首选;在我的情况下,有效率更喜欢正确性 .

谢谢!

1 回答

  • 0

    我建议你在这种情况下使用LinkedBlockingQueue .

    LinkedBlockingQueue tutorial

    你可以使用take()/ put()方法,如果你想等待timelimit,你可以使用offer(),poll()和peek() .

    我也在类似的问题中使用过它 .

相关问题