在Jetty中实现HTTP2servlet的最佳方式是什么?

在Jetty中实现HTTP2servlet的最佳方式是什么?,jetty,netty,servlet-3.0,http2,grpc,Jetty,Netty,Servlet 3.0,Http2,Grpc,据我所知,Jetty中的HTTP2主要处于连接器、传输和通道级别 我正在尝试确定哪种组合最适合在客户端和服务器之间传输二进制数据: Jetty HTTP2服务器,带有异步servlet+Jetty HTTP2客户端 Jetty HTTP2服务器和同步servlet+Jetty HTTP2客户端 Jetty HTTP2服务器,带有异步servlet+Netty HTTP2客户端 GRPC客户端和服务器(都是基于默认网络的) 详细信息: 我希望向我的客户机发送二进制数据,并且我希望连接是非阻塞/异步

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

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

  • Jetty HTTP2服务器,带有异步servlet+Jetty HTTP2客户端
  • Jetty HTTP2服务器和同步servlet+Jetty HTTP2客户端
  • Jetty HTTP2服务器,带有异步servlet+Netty HTTP2客户端
  • GRPC客户端和服务器(都是基于默认网络的)
  • 详细信息:

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

    每个响应都是一小块二进制数据。如果我可以直接将Netty的
    ByteBufs
    作为响应发送,而不是复制到
    byte[]
    ByteBuffer
    ,我会很乐意,但这与这个特定问题没有直接关系

    因为ProtoBuf,我不喜欢方法4

    码头参考:


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

    考虑到您有大量的客户机,并且处理可能需要几秒钟的时间,我建议使用选项1—异步servlet和Jetty HTTP/2客户机

    使用“AsyncServlet”,您有两种风格:1)带阻塞I/O的异步处理,或2)异步处理+异步I/O

    Servlet异步处理是通过使用
    HttpServletRequest.startAsync()
    触发的

    Servlet异步I/O是通过分别使用
    ReadListener
    WriteListener
    ServletInputStream
    触发的

    您肯定需要异步处理,因为您有大量的客户机,并且以秒为单位进行处理—这将优化服务器线程的使用

    可能应该衡量是否使用异步I/O,因为您有很小的二进制响应。 阻塞I/O更容易编码和调试,而异步I/O显然更复杂。当您有大的内容和可能阻塞TCP连接的较慢的客户端时,异步I/O确实非常出色

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

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

    最后,对于Jetty客户端,您可以使用高级
    HttpClient
    和HTTP/2传输,如图所示。这样做的好处是一个只处理HTTP概念的高级API,而不是使用处理HTTP/2帧、流等的低级
    HTTP2Client


    报告你最终选择了什么,以及它对你的影响

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

    考虑到您有大量的客户机,并且处理可能需要几秒钟的时间,我建议使用选项1—异步servlet和Jetty HTTP/2客户机

    使用“AsyncServlet”,您有两种风格:1)带阻塞I/O的异步处理,或2)异步处理+异步I/O

    Servlet异步处理是通过使用
    HttpServletRequest.startAsync()
    触发的

    Servlet异步I/O是通过分别使用
    ReadListener
    WriteListener
    ServletInputStream
    触发的

    您肯定需要异步处理,因为您有大量的客户机,并且以秒为单位进行处理—这将优化服务器线程的使用

    可能应该衡量是否使用异步I/O,因为您有很小的二进制响应。 阻塞I/O更容易编码和调试,而异步I/O显然更复杂。当您有大的内容和可能阻塞TCP连接的较慢的客户端时,异步I/O确实非常出色

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

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

    最后,对于Jetty客户端,您可以使用高级
    HttpClient
    和HTTP/2传输,如图所示。这样做的好处是一个只处理HTTP概念的高级API,而不是使用处理HTTP/2帧、流等的低级
    HTTP2Client

    报告你最终选择了什么,以及它对你的影响