2017-02-05 8 views
0

Jetty의 HTTP2는 주로 커넥터, 전송 및 채널 수준에 있다는 것을 알고 있습니다.Jetty에 HTTP2 서블릿을 구현하는 가장 좋은 방법은 무엇입니까?

나는 클라이언트와 서버 사이의 바이너리 데이터를 전송하기 위해 최선을 다 할 것이다 조합 결정하려고 해요 :

  1. 부두 HTTP2 서버 동기화 서블릿과 비동기 서블릿 + 부두 HTTP2 클라이언트와
  2. 부두 HTTP2 서버 + 부두 HTTP2 클라이언트
  3. 비동기 서블릿 +의 Netty HTTP2 클라이언트와
  4. 부두 HTTP2 서버
  5. GRPC 클라이언트와 서버 (모두가 기본 인 Netty를 기반으로)

세부 사항 :

내 클라이언트에 바이너리 데이터를 전송하고자하는 나는 비 차단/비동기로 연결을하고 싶습니다. 동시 클라이언트 요청 수는 높을 수 있으며 서버는 일부 요청에 응답하는 데 몇 초 (몇 번) 걸릴 수 있습니다.

각 응답은 작은 바이너리 데이터입니다. byte[] 또는 ByteBuffer으로 복사하는 대신 Netty의 ByteBufs을 직접 응답으로 보낼 수는 있지만이 특정 질문과 직접 ​​관련이없는 경우이를 좋아할 것입니다.

ProtoBuf wrapping (link)limitation (link) 때문에 방법 # 4가 제일 좋아하지 않습니다.

부두 참조 :

답변

3

부인, 나는 부두 HTTP/2 메인테이너입니다.

클라이언트 수가 많고 처리 시간이 몇 초가 걸리는 경우 옵션 1 - async servlet 및 Jetty HTTP/2 클라이언트를 사용하는 것이 좋습니다.

"async servlet"을 사용하면 1) 블로킹 I/O를 통한 비동기 처리 또는 2) 비동기 처리 + 비동기 I/O의 두 가지가 있습니다.

서블릿 비동기 처리는 HttpServletRequest.startAsync()을 사용하여 트리거됩니다.

ReadListenerWriteListener을 각각 ServletInputStreamServletOutputStream과 함께 사용하면 서블릿 비동기 I/O가 트리거됩니다.

많은 수의 클라이언트를 보유하고 있고 몇 초 만에 처리하므로 비동기 처리가 필요합니다. 이는 서버 스레드 사용을 최적화합니다.

작은 바이너리 응답이 있으므로 비동기 I/O를 사용할지 여부를 측정해야합니다. I/O 차단은 코딩과 디버그가 훨씬 쉬우 며 비동기 I/O는 코드와 디버깅이 훨씬 더 복잡합니다. 비동기 I/O는 TCP 연결이 혼잡 할 수있는 클라이언트의 컨텐츠가 크고 느린 경우에 정말 빛난다.

완전히 비동기가 되려면 비동기 I/O로 이동하십시오. 좀 더 간단한 코드를 사용하여 약간의 블로킹을 견딜 수 있다면 I/O 블로킹을 유지하십시오. 비동기 I/O 또는 블로킹 I/O 모두 비동기 처리를 사용하려는 경우 모두 반복됩니다. 당신이 부두 클래스에 쫓겨하고자하는 경우

데이터를 복사하는 문제에 관해서는, 당신이 직접 ByteBufferServletOutputStream 서브 클래스를 작성하여 복사를 방지 할 수 있습니다, this example를 참조하십시오.

마지막으로 Jetty 클라이언트에서는 here과 같이 HTTP/2 전송을 사용하여 높은 수준의 HttpClient을 사용할 수 있습니다. HTTP/2 프레임, 스트림 등을 다루는 하위 레벨 HTTP2Client을 사용하는 대신 HTTP 개념만을 다루는 고급 API가 이점이됩니다.

마지막으로 선택한 것을보고하고, 어떻게 당신을 위해 간다!