使用Project Loom 虚拟线程实现5M 持久连接| 黑客新闻

记得十几年前 erlang 火的时候,单机 20万连接、100万连接不停刷新,后来 golang 也开始炫耀,抛开连结构化错误处理都没有不谈 golang 还是挺不错的,尤其是 channel 设计的很棒。多年以后 Java 终于也可以飞一把了。和 erlang/golang 一样,今后 Java 世界的网络编程模型将变得非常简单,一个请求一个线程、一个任务一个线程还不简单吗?

这么多年各种回调带来的折腾尤其式丑陋的 reactive 终于没有理由再活着了。byebye reactive,byebye vertx!

受益的还有 graal 带的一堆脚本,比如 js, python, groovy 等等,都可以放飞自我了,当然我的 d2js 也可以放飞一把,想想已经太久没有摸服务器端了。

跑 500万连接的 Echo 服务器代码,和 erlang 一个样

// https://github.com/ebarlas/project-loom-c5m/blob/main/src/main/java/loomtest/EchoServer.java
package loomtest; import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.StandardSocketOptions;
import java.time.Duration;
import java.util.concurrent.atomic.LongAdder; public class EchoServer { final Args args;
final LongAdder connections;
final LongAdder messages; EchoServer(Args args) {
this.args = args;
connections = new LongAdder();
messages = new LongAdder();
} void run() throws InterruptedException {
for (int i = 0; i < args.portCount; i++) {
int port = args.port + i;
Thread.startVirtualThread(() -> serve(port));
}
long start = System.nanoTime();
while (true) {
long elapsed = Duration.ofNanos(System.nanoTime() - start).toMillis();
System.out.printf("[%d] connections=%d, messages=%d\n", elapsed, connections.sum(), messages.sum());
Thread.sleep(1_000);
}
} void serve(int port) {
try (ServerSocket serverSocket = new ServerSocket(port, args.backlog, InetAddress.getByName(args.host))) {
serverSocket.setOption(StandardSocketOptions.SO_REUSEADDR, true);
serverSocket.setOption(StandardSocketOptions.SO_REUSEPORT, true);
while (true) {
Socket socket = serverSocket.accept();
connections.increment();
Thread.startVirtualThread(() -> handle(socket));
}
} catch (Exception e) {
e.printStackTrace();
}
} void handle(Socket socket) {
try (Socket s = socket) {
byte[] buffer = new byte[args.bufferSize];
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
while (true) {
int numBytes = in.read(buffer);
if (numBytes < 0) {
break;
}
out.write(buffer, 0, numBytes);
messages.increment();
}
} catch (Exception ignore) {
// auto-close
} finally {
connections.decrement();
}
} record Args(String host, int port, int portCount, int backlog, int bufferSize) {
static Args parse(String[] args) {
return new Args(
args.length >= 1 ? args[0] : "0.0.0.0",
args.length >= 2 ? Integer.parseInt(args[1]) : 8000,
args.length >= 3 ? Integer.parseInt(args[2]) : 1,
args.length >= 4 ? Integer.parseInt(args[3]) : 0,
args.length >= 5 ? Integer.parseInt(args[4]) : 32);
}
} public static void main(String[] args) throws InterruptedException {
Args a = Args.parse(args);
System.out.println(a);
new EchoServer(a).run();
} }

使用 JDK19 虚拟线程实现5百万持久连接的更多相关文章

  1. 支持JDK19虚拟线程的web框架,之一:体验

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于虚拟线程 随着JDK19 GA版本的发布,虚拟线程 ...

  2. 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...

  3. 支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 前文链接 支持JDK19虚拟线程的web框架,之一:体 ...

  4. 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <支持JDK19虚拟线程的web框架>系列 ...

  5. 虚拟线程 - VirtualThread源码透视

    前提 JDK19于2022-09-20发布GA版本,该版本提供了虚拟线程的预览功能.下载JDK19之后翻看了一下有关虚拟线程的一些源码,跟早些时候的Loom项目构建版本基本并没有很大出入,也跟第三方J ...

  6. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  7. 在Tomcat中启用虚拟线程特性

    前提 趁着国庆前后阅读了虚拟线程相关的源码,写了一篇<虚拟线程 - VirtualThread源码透视>,里面介绍了虚拟线程的实现原理和使用示例.需要准备做一下前期准备: 安装OpenJD ...

  8. Java将增加虚拟线程,挑战Go协程

    我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制.一个 go 语句就可以发起一个协程 (goroutin).协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是 ...

  9. Java的虚拟线程(协程)特性开启预览阶段,多线程开发的难度将大大降低

    高并发.多线程一直是Java编程中的难点,也是面试题中的要点.Java开发者也一直在尝试使用多线程来解决应用服务器的并发问题.但是多线程并不容易,为此一个新的技术出现了,这就是虚拟线程. 传统多线程的 ...

  10. Java SE 19 虚拟线程

    Java SE 19 虚拟线程 作者:Grey 原文地址: 博客园:Java SE 19 虚拟线程 CSDN:Java SE 19 虚拟线程 说明 虚拟线程(Virtual Threads)是在Pro ...

随机推荐

  1. ceph-rbd和cephfs使用

    目录 1 用户权限管理和授权流程 1.1 列出用户 1.2 用户管理 1.2.1 ceph auth add 1.2.3 ceph auth get-or-create 1.2.4 ceph auth ...

  2. STL标准模板库

    STL(Standard Template Library)标准模板库 是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于数据结构和算法的实现.STL的核心部分包括容器.算法和迭 ...

  3. 基于Keras-YOLO实现目标检测

    Keras-YOLO 3项目使用Python语言实现了YOLO v3网络模型,并且可以导入Darknet网络预先训练好的权重文件信息直接使用网络进行目标识别. 1. 下载Keras-YOLO 3项目 ...

  4. 在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

    之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题.这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过 ...

  5. 墨天轮沙龙 | 北京大学李文杰:面向知识图谱应用的图数据库系统gStore

    在6月8日举办的[墨天轮数据库沙龙第七期-开源生态专场]中,北京大学重庆大数据研究院图数据库与知识图谱实验室副主任.北京大学王选计算机研究所全职博士后 李文杰老师分享了<面向知识图谱应用的图数据 ...

  6. Putty 远程 连接kali Linux拒绝访问 refused connection

    1. 设置  ssh 文件 crtl + alt + t 代开终端 输入命令: vim /etc/ssh/sshd_config 说明 : 使用 vim 编辑器编辑 ssh 文件 : 说明: 修改第3 ...

  7. ERQ:32位转5位仅掉些许精度,来看看两段式后训练量化 | ICML 2024

    后训练量化(PTQ)在视觉Transformer(ViTs)领域引起了广泛关注,因为它在模型压缩方面表现出了高效率.然而,现有的方法通常忽视了量化权重和激活之间复杂的相互依赖关系,导致了相当大的量化误 ...

  8. 云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29

    开源项目推荐 Skaffold Skaffold 是一个命令行工具,有助于 Kubernetes 应用程序的持续开发.您可以在本地迭代应用程序源代码,然后部署到本地或远程 Kubernetes 集群. ...

  9. Tomcat线程池详解,为什么SpringBoot最大支持200并发?

    Q:经典面试题,SpringBoot 应用可以同时并发处理多少请求? A:SpringBoot 应用并发处理请求数主要由两个因素影响,使用的 Servlet容器(默认使用 Tomcat,常用的还有 j ...

  10. curl命令详解【转载】

    本文转载自curl 的用法指南-阮一峰 简介 curl 是常用的命令行工具,用来请求 Web 服务器.它的名字就是客户端(client)的 URL 工具的意思. 它的功能非常强大,命令行参数多达几十种 ...