Сначала я задал этот вопрос здесь, но я понял, что мой вопрос не о цикле while-true. Я хочу знать, как правильно выполнять высокопроизводительную асинхронную передачу сообщений в Java?
Что я пытаюсь сделать ...
У меня ~ 10 000 потребителей, каждый из которых получает сообщения из своих частных очередей. У меня есть один поток, который создает сообщения одно за другим и помещает их в очередь нужного потребителя. Каждый потребитель зацикливается на неопределенное время, проверяя появление сообщения в своей очереди и обрабатывая его.
Я считаю, что это термин «один производитель / один потребитель», поскольку существует один производитель, и каждый потребитель работает только в своей частной очереди (несколько потребителей никогда не читают из одной очереди).
Внутри Consumer.java:
@Override
public void run() {
while (true) {
Message msg = messageQueue.poll();
if (msg != null) {
... // do something with the message
}
}
}
Производитель помещает сообщения в очереди сообщений потребителей в быстром темпе (несколько миллионов сообщений в секунду). Потребители должны обрабатывать эти сообщения как можно быстрее!
Примечание: while (true) { ... }
завершается сообщением KILL, отправленным производителем в качестве его последнего сообщения.
Однако у меня вопрос о том, как правильно спроектировать эту передачу сообщений. Какую очередь использовать для messageQueue? Должен ли он быть синхронным или асинхронным? Как следует оформить сообщение? Следует ли использовать цикл while-true? Должен ли Consumer быть потоком или чем-то еще? Будет ли 10 000 потоков замедляться до обхода? Какая альтернатива потокам?
Итак, как правильно выполнять высокопроизводительную передачу сообщений в Java?
@Mike:
Существует 10 000 различных символов, и каждый потребитель обрабатывает сообщения для одного символа. Я не знаю, следует ли это реализовывать как потоки, но потребители ничего не разделяют друг с другом и являются хорошим кандидатом для модели акторов. - person Mr. Burgundy   schedule 30.07.2010@Willi Schönborn:
У меня вопрос, если не темы, то что? Я бы хотел обойтись без библиотеки / фреймворка; например, каков правильный дизайн? - person Mr. Burgundy   schedule 30.07.2010