使用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. 干货必收藏!墨天轮最受DBA欢迎的250份学习文档合集

    作为一个DBA,必须要精通SQL命令.各种数据库架构.数据库管理和维护.数据库调优,必要的时候,还需要为开发人员搭建一个健壮.结构良好.性能稳定的数据库环境. 技术也是不断进步的,社会的发展要求DBA ...

  2. VM Ware 安装mac OS xxx 系统

    1. unlock 文件破解Vm Ware 默认不能安装苹果系统 :https://drive.google.com/file/d/1_AUeYh5JYltqjnuztQh-5UTomAIVBcLZ/ ...

  3. 背靠AI,让AI当牛马,解决程序员的烦恼

    开篇问题? 作为程序员的你,写代码累吗?累!苦嘛?苦,想哭嘛?哭不出来. 还在为工作中繁重的编码任务.复杂的调试过程以及不断更新的技术栈而苦恼吗?这些挑战不仅消耗大量的时间和精力,还时常让人陷入思维的 ...

  4. 云原生周刊:Gateway API v1.1 发布 | 2024.6.3

    开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活.可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种 ...

  5. 负载均衡器 OpenELB ARP 欺骗技术解析

    作者:大飞哥,视源电子运维工程师,KubeSphere 用户委员会广州站站长,KubeSphere Ambassador. K8S 对集群外暴露服务有三种方式:NodePort,Ingress 和 L ...

  6. Games101 光线追踪 代码框架解读

    目录 1 前言 2 main.cpp 3 render.cpp 3.1 折射reflect 反射refract 相关 3.2 Fresnel equation 3.3 递归函数光线追踪 3.2.1 t ...

  7. vue搜索历史记录缓存实现

    思路: 1.浏览器缓存永久保存搜索历史数据. 2.页面初始化将数据保存到页面变量中. 3.对搜索历史记录的怎加和删除,要同步到缓存中. ----------------直接看代码----------- ...

  8. 搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)

    第三章:超越基础--图像中的特征检测 上一篇<揭开计算机视觉的神秘面纱,原来机器是这样"看图"的!> 本篇序言:上一篇我们实现并训练了一个神经网络,成功让计算机&quo ...

  9. 【速记】C++ STL自定义排序

    因为是"速记",难免会有不完善的地方.这篇笔记咱日后应该还会进行补充. 关于sort的比较函数 void sort( RandomIt first, RandomIt last, ...

  10. 今日一学,5道大厂的Java基础面试题

    前言 各种框架眼花缭乱,各种逻辑需求,CRUD.久而久之,写的1000行代码中都是if else,@autowired等等,等出去面试的时候,基础题不断,而且还是不常用,或者说不在意的,往往这些就容易 ...