在Jetty中实现HTTP2 servlet的最佳方法是什么?

时间:2017-02-05 20:15:38

标签: jetty netty servlet-3.0 http2 grpc

据我所知,Jetty中的HTTP2主要位于连接器,传输和通道级别。

我正在尝试确定哪种组合最适合在客户端和服务器之间传输二进制数据:

  1. 具有异步servlet + Jetty HTTP2客户端的Jetty HTTP2服务器
  2. 带有同步servlet + Jetty HTTP2客户端的Jetty HTTP2服务器
  3. 具有异步servlet + Netty HTTP2客户端的Jetty HTTP2服务器
  4. GRPC客户端和服务器(均为默认的Netty)
  5. 详细信息:

    我想将二进制数据发送到我的客户端,我希望连接是非阻塞/异步的。并发客户端请求的数量可能很高,服务器可能需要几秒钟(有些时间)来响应某些请求。

    每个响应都是一小块二进制数据。如果我能直接发送Netty ByteBufs作为回复而不是复制到byte[]ByteBuffer,我会喜欢它,但这与此特定问题没有直接关系。

    由于ProtoBuf wrapping (link) limitation (link),方法#4不是我的最爱。

    Jetty参考:

1 个答案:

答案 0 :(得分:3)

免责声明,我是Jetty HTTP / 2维护者。

鉴于您拥有大量客户端并且处理可能需要几秒钟,我建议使用选项1 - 异步servlet和Jetty HTTP / 2客户端。

使用" async servlet"你有两种风格:1)使用阻塞I / O进行异步处理,或者2)异步处理+异步I / O.

使用board_list_of_lists.append(line.strip('\n'))

触发Servlet异步处理

分别使用HttpServletRequest.startAsync()ReadListenerWriteListener来触发Servlet异步I / O.

您肯定需要异步处理,因为您拥有大量客户端并按秒级处理 - 这将优化服务器线程的使用。

是否应该测量是否使用异步I / O,因为您有小的二进制响应。 阻塞I / O更容易编码和调试,而异步I / O对代码和调试来说肯定更复杂。当你有大量内容和可能拥塞TCP连接的慢客户端时,异步I / O真的很棒。

如果您想完全异步,请使用异步I / O.如果您可以容忍一些阻塞以换取更简单的代码,请继续阻止I / O. 值得重复的是,在两种情况下 - 异步I / O或阻塞I / O - 您都希望使用异步处理。

关于复制数据的问题,如果您愿意转向Jetty类,可以通过直接将ServletInputStream写入ServletOutputStream子类来避免复制,请参阅this example

最后,使用Jetty客户端,您可以使用带有HTTP / 2传输的高级ByteBuffer作为详细here。好处是只能处理HTTP概念的高级API,而不是使用处理HTTP / 2帧,流等的低级ServletOutputStream

报告您最终选择的内容以及它的效果!