2012-09-06 2 views
0

내 현재의 자바 구현을 기다립니다FIFO 큐는 요청을 보내고 그래서를 heres 응답

  1. 는 비 블로킹 큐에 패킷을 넣어 스레드를 사용하여 UDP 소켓에서 UDP 패키지를 수신 .
  2. 300 개의 스레드 중 하나가이 논 블로킹 큐를 읽고이 패킷을 TCP 호스트/포트에 연결된 소켓에 대한 요청으로 처리합니다.
  3. 응답을 기다렸다가 UDP 소켓으로 되돌립니다.

이 부분은 모두 정상적으로 작동하지만로드가 많은 TCP 소켓 부분을 분석 한 결과 무작위로 TCP 소켓 부분을 완료하는 데 약 2 ~ 5 초가 걸릴 수 있음을 확인했습니다. 보통이 부분은 2 ~ 3 밀리 초가 걸립니다. 내 질문은 내가 그냥 임의의 스레드 실행과 함께 TCP 소켓 타격이고 그 스레드 작업의 FIFO가 없다는 것입니다.

'요청'정보와 현재 스레드 참조 ('응답'을 처리 할 스레드를 알고있는 것)를 배치 할 수있는 방법이 있습니까? FIFO 차단 대기열에 가장 오래된 스레드가 먼저 처리되도록하십시오. 그 TCP 소켓 요청/응답 작업은 최소한의 시간이 걸립니다.

+0

TCP 작업을 차단하는 개별 스레드가 있습니까? 아니면 비 블로킹으로 배치 했습니까? 그렇다면 어떻게? –

+0

왜? TCP 응답 시간이 변경된다는 것을 어떻게 알 수 있습니까? 왜 UDP 자체가 순서가 맞지 않을 때 순서가 중요합니까? – EJP

+0

상자에 300 개의 코어가 있기를 바랍니다. –

답변

0

내가

내가 각 요청에 대해 증가 얻을 것 인 AtomicLong 요청 카운터를 가질 것 '요청'정보 플러스, 현재의 thread 참조를 배치 할 수있는 방법이 있나요. 그런 다음 카운터는 다른 요청 별 정보와 함께 요청 맵의 UDP 소켓과 연결됩니다. 카운터는 TCP 소켓을 통해 전송됩니다. TCP 소켓으로부터의 응답은 request-counter로 되돌아 올 것이고, reader 쓰레드는 적절한 UDP 소켓을 통해 응답을 보내거나 쓰레드 풀에서 그것을 스케줄 할 것이다.

일단 요청 카운터가 있으면 TCP 소켓은 요청/응답 스트림이되므로 필요할 경우 순서가 바뀌어 보낼 수 있습니다. 스레드는 원격 서버에 요청을 보내고 다른 스레드는 응답을 읽고 UDP 클라이언트에 응답을 다시 스케줄합니다. 필요한 경우 FIFO 순서를 보장 할 수 있지만 다른 응답이 준비되어 있으면 순서가 잘못되어 대기해야하는 이유가 표시되지 않습니다.

서버 측에서는 작업 대기열에서 모두 소모되는 유사한 리더 및 라이터 스레드가 있습니다.

0

나는 당신이 ConcurrentLinkedQueue을 찾는다 고 생각합니다. - 여기에 대한 설명이 있습니다.

링크 노드에 근거하는, 안 바운드 스레드 안전 큐. 이 큐는 요소 FIFO (선입 선출)을 주문합니다. 큐의 헤드는 큐에 큐에 있었던 해당 요소입니다. 큐의 꼬리 큐에 큐에 있었던 해당 요소입니다. 새로운 요소는 큐의 끝에 삽입되고 큐 검색 조작은 큐의 헤드에서 요소를 가져옵니다. 많은 스레드가 공통 콜렉션에 대한 액세스를 공유 할 때 ConcurrentLinkedQueue가 적절한 선택입니다.이 큐는 null 허용되지 않습니다 요소.

관련 문제