bbeaupain/hella-http:基于nio_uring的Hella快速Java HTTP服务器库


hella-http是一个用于 Java 的 hella 快速 HTTP 库,它使用nio_uring进行 I/O。它具有非常小的代码库,是当今可用于 Java 的最具扩展性的 HTTP 服务器之一。

nio_uring是一个用于 Java 的 I/O 库,它在底层使用io_uring ,其目的是:

  • 简单灵活的 API
  • 超级快速高效
  • 真正的零拷贝(内核直接寻址ByteBufferI/O操作)
  • 有点自以为是

io_uring(以前称为aioring)是一个用于存储设备异步 I/O操作的Linux 内核 系统调用接口,通过/或/等函数提供的类似接口来解决性能问题,用于对文件描述符访问的数据进行操作。

它通过创建两个称为“队列环”的循环缓冲区来工作,分别用于存储提交和完成的 I/O 请求。
对于存储设备,这些称为提交队列 (SQ) 和完成队列 (CQ)。保持这些缓冲区在内核和应用程序之间共享有助于提高I/O 性能,因为无需发出额外且昂贵的系统调用来在两者之间复制这些缓冲区。根据 io_uring 设计论文,SQ 缓冲区只能由消费者应用程序写入,而 CQ 缓冲区只能由内核写入。

Helllo World案例:

public static void main(String args) {
    byte body = "Hello, world!".getBytes(StandardCharsets.UTF_8);
    String bodyLength = body.length +
"";

    Response response = Response.builder()
        .status(200)
        .header(
"Content-Type", "text/plain")
        .header(
"Content-Length", bodyLength)
        .body(body)
        .build();

    new HttpServer(request -> response)
        .start()
        .join();
}


基准测试比Netty_io_uring快得多

点击标题

Reddit网友:
1、我真的很期待有一个主流的 io_uring HTTP 服务器/客户端实现。我认为 Java 社区在接受创新方面通常太慢了,我欢迎朝这个方向发展的各种项目。
我真的很喜欢 hella 的 API 的简单性,我很快就会试用它以提供实际反馈。
我会寻找一些东西:

  • unix套接字支持;
  • nio 缓冲区支持;
  • 可插入例程实现。

2、我无法找到一个用 Java 编写的 HTTP 服务器,它可以在大量并发连接的情况下在性能上竞争。相比之下,甚至 rapidoid-http-fast(通常在 techempower 基准测试中名列前茅)在 c10k 之后也大幅下降。我为这项工作感到非常兴奋和自豪!

3、主要使用 io_uring 而不是 epoll,随着客户端数量的增加,这会大大减少执行 I/O 所需的系统调用数量。
除此之外,HTTP 解码器特别设计用于尽可能少地解析传入请求。它在解析时使用有状态策略来实现大约 O(n) 的性能(实际上稍微少一点),其中 n 是请求行和标头中的字节数。