Мое приложение (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. Как избежать того, чтобы очередь НЕ была пустой, но потребитель не был активен? последовательность будет следующей: один потребитель и один образец производителя:
- Потребитель: while(database.queueNotEmpty()) // очередь пуста, прерываем цикл while
- Производитель: database.enqueue(work[i]); // создать задачу
- Производитель: notifyAllConsumer(); // уведомляем потребителя, но он уже активен
- Потребитель: waitProducer(); // приостановить поток, но еще есть работа
3. Любая лучшая практика для этой проблемы? особенно в чистой java. Нужна ли сторонняя очередь сообщений или что-то вроде zookeeper? Меньше блокировки или отсутствие блокировки предпочтительнее; в моем случае эффективность предпочтительнее правильности.
Спасибо!
BlockingQueue
? Они предназначены для такой работы - person fge   schedule 27.05.2014waitProducer()
,consumeAll()
иnotifyAllConsumer()
? Кроме того, вам лучше использовать любой из доступных MQ, готовых к производству. - person pingw33n   schedule 27.05.2014