2017-01-08 3 views
-1

서버 푸시 기술에 익숙하지 않습니다. 일부 연구를 수행했으며 서버 전송 이벤트에 대해 알고 있습니다.연결된 여러 클라이언트에 대한 서블릿이 포함 된 서버 측 이벤트

실시간 모니터링 소프트웨어를 구현하고 있습니다. 내 백 엔드 자바 서블릿으로 작성됩니다. 동시에 30 ~ 50 대의 브라우저가 서버에 계속 연결됩니다.

내 연구에는 내 마음 속에 3 가지 질문이 있습니다.

  1. 내가 무한 루프를 사용해야합니까 그래서 클라이언트 내가 무한 루프를 사용하지 않는 경우가 할 것 오초 후 다시하지 극,해야?

  2. 우리가 알고있는 것처럼 서버는 들어오는 요청마다 서블릿의 서비스 메소드를 실행하기 위해 별도의 스레드를 생성합니다. 서블릿에서 무한 루프를 사용하여 위에서 설명한 첫 번째 포인트에서 설명한 프로세스를 실행하면 50 연결된 클라이언트를 한 번에. 그렇다면 계속 실행될 별도의 50 개의 스레드가 있음을 의미합니까? 클라이언트의 수가 50에서 100으로 증가 할 것이고 스레드가 50에서 100으로 증가 할 것인가?

  3. 위의 2 번 항목에 해당되면 sse가 내 경우에 실시간 모니터링에 적합하지 않습니다. 클라이언트 수가 증가함에 따라 서버 자원이 소진됩니까?

답변

0

답변

  1. 당신이 서블릿을 사용하는 경우 예, 당신은 아마의 수면, 무한 루프를해야합니다.
  2. 또한
  3. 정확한, 당신이 요청 당 하나 개의 스레드를 사용하고, 이 스레드는 서블릿 컨테이너의 HTTP 리스너 스레드가됩니다.
  4. 예, http 리스너 스레드가 더 이상 없으면 요청이 거부됩니다. Tomcat에 200 개의 스레드를 쉽게 가질 수 있으며 모든 작업이 잠자기 상태 일 때 각 클라이언트에 약간의 데이터를 보내면 작동 할 수 있습니다.

그러나 이이 혹시 넘어 200 클라이언트 확장 할 수있는 기회가 특히, 나는 서블릿 API를 사용하여 해결할 문제 같은 소리하지 않습니다. 대신 엔드 - 투 - 엔드 NIO 솔루션을 사용할 것이므로 연결 당 스레드가 필요하지 않습니다.

Netty 또는 RatPack을 살펴보고 싶다면 서블릿 API와 프로그래밍 스타일이 다르지만 더 좋은 선택이라고 생각할 것입니다. 이벤트 중심적이며 수천 개의 연결된 클라이언트를 가질 수 있으며 CPU 코어 당 하나의 스레드 만 사용합니다.

서블릿 컨테이너를 사용하기로 결정했다면 스프링 프레임 워크에 익숙해지는 것이 좋습니다. http 리스너 스레드를 사용하지 않고 다른 스레드 풀로 오프로드하는 Spring을 사용하여 실제로 솔루션을 생성 할 수 있습니다.

또 다른 가능한 솔루션 (클라이언트가 브라우저이므로)은 WebSocket을 사용하는 것입니다. 여기서도 Spring Framework를 사용합니다.

0
  1. 당신만큼 당신이 어딘가에 클라이언트와의 연결을 지킬 때, 그 작업을 수행 할 필요가 없습니다, 당신은 등 연결 요청, 타이머 이벤트와 같은 특정 이벤트 (로 데이터를 보낼 수 ...)

  2. 이것은 사실이 아닙니다. SSE는 여러 클라이언트에 대해 단일 연결을 공유하는 비동기 서블릿과 결합됩니다.

  3. AFAIK (벤치 마크되지 않음)이지만 SSE는 웹 소켓을 포함한 다른 유사한 대안보다 가볍습니다.

당신이 JEaSSE 라이브러리를 사용하여 서블릿 경량 SSE의 예를보고 싶은 경우, README에보고 준비하시기 바랍니다 https://github.com/mariomac/jeasse

관련 문제