Java: высокоэффективная передача сообщений (single-producer/single-consumer)

Я первоначально задал этот вопрос здесь, но я понял, что мой вопрос не о в то время как - истинный цикл. То, что я хочу знать, что надлежащий путь состоит в том, чтобы сделать высокоэффективную асинхронную передачу сообщений в 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?

6
задан Community 23 May 2017 в 11:53
поделиться