2012-11-29 3 views
8

현재 운동으로 간단한 P2P 네트워크를 개발 중입니다. 네트워크의 각 노드는 하트 비트를 다른 노드의 서브 세트로 전송하여 네트워크에서 나간 노드를 감지 할 수 있습니다. 하트 비트 패킷 옆에 새 노드가 네트워크에 가입/탈퇴 할 때 패킷을 보내고 리소스 (작은 텍스트 파일)를 찾고 싶을 때 패킷을 보냅니다. 모든 패킷은 UDP 패킷입니다.들어오는 많은 패킷을 처리하는 가장 좋은 방법

패킷을받을 때마다 해당 특정 패킷을 처리하는 새 스레드가 시작됩니다. 그러나 나는 한 응용 프로그램 수명 동안 시작하는 스레드의 양에 많은 관심을 가지고 있습니다 (특히 하트 비트 때문에). (교착 상태 등의 위험이 있으므로 피하고 싶습니다.)

들어오는 모든 패킷을 넣고 그 큐에서 한 번에 하나씩 모든 패킷을 처리하는 단일 스레드 (생산자 - 소비자 패턴과 같은 것)가있는 큐에 대해 생각했습니다. 패킷을 빠르게 처리하여 보낸 사람이 패킷이 손실되었다고 생각하지 않도록하고 싶습니다.

각 수신 패킷을 새로 시작하지 않고도 많은 수신 패킷을 처리하는 가장 좋은 방법은 무엇입니까? 내가 가진 것, 프로듀서를 소비하는 것 또는 다른 무엇인가를 가져야합니까?

+1

물론입니다. LinkedList와 함께 producer-consumer를 사용하십시오. 내가 생각할 수있는 가장 쉬운 방법. – DankMemes

+0

자신이 언급 한 방식처럼 구식으로 시작하고 벤치 마크를 수행 한 다음 "Disruptor"(http://lmax-exchange.github.com/disruptor/)와 같은 최신 항목을 시도한 다음 더 많은 작업을 수행 할 수 있습니다 벤치 마크. –

+1

"들어오는 많은 패킷"을 정량화하는 데 도움이 될 수 있습니다 ... 상대적으로 말하면 하트 비트는 많이 사용하지 않아야합니다. 현대 시스템은 일반적으로 NIC의 수와 유형에 따라 초당 수천에서 수천 개의 패킷을 처리 할 수 ​​있습니다 . 나는 심장 박동이 분당 수십 개의 범위에서 더 많을 것으로 생각한다. – twalberg

답변

0

응용 프로그램에서 하나의 패킷을 처리하는 데 얼마나 걸리나요?

핑 (ping)의 경우, 수신했을 때 처리하는 것이 더 빠를 수도 있습니다. 다른 큐를 특정 블로킹 큐와 같은 공유 데이터 구조에 넣을 수 있습니다. 따라서 큐가 비어 있으면 작업자 스레드는 새로운 작업이 추가되고 새 작업이 추가되면 스레드가 활성화되어 작업을 수행합니다.

아마도 패킷 당 하나의 스레드를 시작하면 실제로 작업을 수행하는 것보다 스레드 시작 및 중지에 더 많은 시간이 소요됩니다.

패킷의 응답으로 수행 할 작업이 모든 유형의 패킷에 너무 많은 시간이 소요되지 않으면 큐의 잠금 및 스레드 예약에 소요되는 추가 시간으로 인해 프로그램 속도가 느려질 수 있습니다 오히려 더 빠릅니다.

어쨌든 스레드 풀을 사용하고 처음부터 작업자를 시작하십시오. 원하는 경우 지난 분의로드에 따라 동적으로 작업 스레드 수를 늘리거나 줄일 수 있습니다.

+0

시간은 약간 다릅니다. 대부분의 패킷은 빠르게 처리되지만 일부 작업에는 새로운 패킷이 전송되고 응답이 필요합니다. 그러나 나는 스레드 풀과 대기열을 사용할 것이라고 생각합니다. 감사. – Wondering

0

나는 event driven architecture을 사용할 것입니다. 모든 패킷에 대해 새 스레드를 생성하는 것은 확장 가능하지 않으므로 일정량의 작업량까지는 작동하지만 더 이상 작동하지 않는다는 점이 있습니다. 이를 예를 들어와 비교할 수 있습니다. 메시지가 패킷 인 Facebook 채팅과 같은 채팅 프로그램. 이벤트 기반 아키텍처는 확장 성이 뛰어나고 사용자가 원하는 것을 정확하게 사용할 수 있습니다. 인터넷 검색을 해보고, 많은 프로그래밍 언어 용 라이브러리가 있으므로, 당신에게 맞는 라이브러리를 선택하십시오. (얼랭, 스칼라, C 또는 파이썬에서 그렇게하고 싶습니다.)

편집 : 확인, 자바 태그를 보지 못했습니다. 그러나 언어는 중요하지 않습니다.

예를 들어이 링크에서보세요 : http://www.nightmare.com/medusa/async_sockets.html

나는 그것이 이벤트 기반 프로그래밍의 아이디어를 얻을 수있는 아주 좋은 하나를 찾을 수 있습니다.

+0

하지만 그는 UDP를 사용하고 있기 때문에 아마도 파일 설명자는 하나뿐입니다. – LtWorf

+0

비동기로 만들 가능성을 배제하지 않습니다. 비 블로킹 소켓, 비동기 I/O 또는 심지어 이벤트 구동 소켓 (기본적으로 모든 동일한 아이디어를 설명합니다)을 찾습니다. – Cravid

+0

나는 아직도 그것을 할 수 있다는 것을 알고 있지만,이 특별한 상황에서 번거롭게 할만한 가치가 있는지 확신하지 못합니다. – LtWorf

관련 문제