문제

많은 클라이언트가 중앙 서버에 연결하는 응용 프로그램을 설계하고 있습니다. 이 서버는 이러한 연결을 유지하여 30 분마다 유지를 보냅니다. 서버에는 임베디드 HTTP 서버가있어 클라이언트 연결에 대한 인터페이스를 제공합니다 (예. http : // server/isclientConnected? id = id). 나는 이것에 대해 가장 좋은 방법이 무엇인지 궁금했다. 내 현재 구현은 Java에 있으며 ID가 키로 맵을 가지고 있지만 각 연결마다 스레드가 시작되며 이것이 실제로이를 수행하는 가장 좋은 방법인지 모르겠습니다. 모든 포인터는 감사 할 것입니다.
감사,
이삭 월러

도움이 되었습니까?

해결책

이 페이지에 설명 된대로 java.nio 패키지를 사용하십시오. Java Nio를 사용하여 고도로 확장 가능한 서버 구축. 또한이 페이지를 매우 신중하게 읽으십시오. 확장 가능한 NIO 기반 서버의 아키텍처.

개인적으로 나는 NIO 내부를 귀찮게하지 않고 다음과 같은 프레임 워크를 사용합니다. 아파치 미나 또는 xsocket. Nio는 복잡하고 매우 모호한 방식으로 잘못을 당하기 쉽습니다. "그냥 작동"하고 싶다면 프레임 워크를 사용하십시오.

다른 팁

연결 당 단일 스레드를 사용하면 일반적으로 단일 시스템에서 최대 약 10,000 개의 연결을 확장 할 수 있습니다. Windows 32 컴퓨터의 경우 아마도 약 1,000 개의 연결이 한계에 도달 할 것입니다.

이를 피하려면 프로그램 디자인을 변경하거나 확장 할 수 있습니다 (수평). 하드웨어 비용으로 개발 비용을 가중시켜야합니다.

단일 연속 연결이있는 사용자 당 단일 스레드는 일반적으로 가장 쉬운 프로그래밍 모델입니다. 현재 하드웨어의 한계에 도달 할 때 까지이 모델을 고수합니다. 이 시점에서 코드를 변경하거나 더 많은 하드웨어를 추가하기로 결정했습니다.

클라이언트가 오랜 시간 동안 연결되면 클라이언트 당 스레드를 할당하는 것은 문제가 될 수 있습니다. 서버의 각 스레드에는 일정량의 리소스 (예 : 스택에 대한 메모리)가 필요합니다.

당신은 사용할 수 있습니다 부두 연속 비동기 서블릿을 사용하여 더 적은 스레드로 클라이언트 요청을 처리합니다.

반응기 패턴에 대해 자세히 알아보십시오. Java에는 구현이 있습니다 (클라이언트 용 스레드 대신 채널을 사용). 구현하기 쉽고 매우 효율적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top