처음에는이 질문을 here에게 물었습니다. 그러나 제 질문은 while-true 루프가 아니라는 것을 깨달았습니다. Java에서 고성능 비동기 메시지 전달을 수행하는 적절한 방법은 무엇입니까? 내가 할 노력하고있어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 루프를 사용해야합니까? 소비자가 스레드가되어야합니까? 10,000 개의 스레드가 느려지 게됩니까? 쓰레드의 대안은 무엇입니까?
그래서 Java에서 고성능 메시지 전달을 수행하는 적절한 방법은 무엇입니까?
왜 10k 스레드가 있습니까? 각 스레드마다 많은 양의 대기열을 필요로하는 매우 많은 코어 나 작업이 없으면 스레드 전환에 많은 오버 헤드가 발생합니다. – Mike
10k 쓰레드는 고성능에서 멀리 떨어져 있습니다. – whiskeysierra
'@Mike :'10,000 개의 다른 심볼이 있으며 각 소비자가 하나의 심볼에 대한 메시지를 처리합니다. 스레드로 구현해야하는지 모르겠지만 소비자는 서로 아무 것도 공유하지 않으며 배우 모델에 대한 좋은 후보자가됩니다. –