首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分布式任务队列中的并发性(生产者/使用者)

分布式任务队列中的并发性(生产者/使用者)
EN

Stack Overflow用户
提问于 2014-05-27 12:43:02
回答 1查看 1.2K关注 0票数 1

我的应用程序(Java)随机产生一些任务,并由分布式后台线程异步使用。

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

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

我有这样的代码:

消费者:

代码语言:javascript
复制
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();
  }
}

制片人:

代码语言:javascript
复制
for(...) {
  database.enqueue(work[i]);
}
// notify all consumers
notifyAllConsumer();

显然,上面的代码存在并发错误。我有三个问题:

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

2.如何避免队列不是空的,而是没有使用者活动的?顺序是:一个消费者和一个生产者样本:

  • 使用者: while(database.queueNotEmpty()) // queue为空,中断while循环
  • 生产者: database.enqueue(worki);//生成一个任务
  • 生产者: notifyAllConsumer();//通知使用者,但它已经激活了
  • 使用者: waitProducer();//挂起线程,但仍有工作要做

3.对这一问题有何最佳做法?尤其是纯java。第三方消息队列或类似动物园管理员之类的东西是必须的吗?更少的锁或没有锁是首选的;在我的情况下,效率优先于正确性。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-08-01 05:45:26

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

LinkedBlockingQueue教程

您可以使用put() /put()方法,如果您想在timelimit中等待,可以使用methods ()、poll()和peek()。

我也用这个来解决类似的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23889764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档