Я первоначально задал этот вопрос здесь, но я понял, что мой вопрос не о в то время как - истинный цикл. То, что я хочу знать, что надлежащий путь состоит в том, чтобы сделать высокоэффективную асинхронную передачу сообщений в Java?
Что я пытаюсь сделать...
У меня есть ~10 000 потребителей, каждое потребление сообщения от их частных очередей. У меня есть один поток, это создает сообщения один за другим и помещает их в очередь корректного потребителя. Каждый потребитель циклы неограниченно долго, проверяя на сообщение для появления в его очереди и обрабатывая его.
Я полагаю, что термин является "single-producer/single-consumer", так как существует один производитель, и каждый потребитель только работает над их частной очередью (несколько потребителей никогда не читают из той же очереди).
В Consumer.java:
@Override
public void run() {
while (true) {
Message msg = messageQueue.poll();
if (msg != null) {
... // do something with the message
}
}
}
Производитель помещает сообщения внутренние Потребительские очереди сообщений в быстрый темп (несколько миллионов сообщений в секунду). Потребители должны обработать эти сообщения максимально быстро!
Примечание: while (true) { ... }
завершается сообщением УНИЧТОЖЕНИЯ, отправленным Производителем как его последнее сообщение.
Однако мой вопрос о надлежащем способе разработать эту передачу сообщений. Какую очередь я должен использовать для messageQueue? Это должно быть синхронным или асинхронным? Как сообщение должно быть разработано? Я должен использовать в то время как - истинный цикл? Потребитель должен быть потоком или чем-то еще? 10 000 потоков замедлятся к проверке? Что альтернатива к потокам?
Так, что надлежащий путь состоит в том, чтобы сделать высокоэффективную передачу сообщений в Java?