使用 JDK19 虚拟线程实现5百万持久连接
使用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百万持久连接的更多相关文章
- 支持JDK19虚拟线程的web框架,之一:体验
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于虚拟线程 随着JDK19 GA版本的发布,虚拟线程 ...
- 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...
- 支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 前文链接 支持JDK19虚拟线程的web框架,之一:体 ...
- 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <支持JDK19虚拟线程的web框架>系列 ...
- 虚拟线程 - VirtualThread源码透视
前提 JDK19于2022-09-20发布GA版本,该版本提供了虚拟线程的预览功能.下载JDK19之后翻看了一下有关虚拟线程的一些源码,跟早些时候的Loom项目构建版本基本并没有很大出入,也跟第三方J ...
- Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?
Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...
- 在Tomcat中启用虚拟线程特性
前提 趁着国庆前后阅读了虚拟线程相关的源码,写了一篇<虚拟线程 - VirtualThread源码透视>,里面介绍了虚拟线程的实现原理和使用示例.需要准备做一下前期准备: 安装OpenJD ...
- Java将增加虚拟线程,挑战Go协程
我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制.一个 go 语句就可以发起一个协程 (goroutin).协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是 ...
- Java的虚拟线程(协程)特性开启预览阶段,多线程开发的难度将大大降低
高并发.多线程一直是Java编程中的难点,也是面试题中的要点.Java开发者也一直在尝试使用多线程来解决应用服务器的并发问题.但是多线程并不容易,为此一个新的技术出现了,这就是虚拟线程. 传统多线程的 ...
- Java SE 19 虚拟线程
Java SE 19 虚拟线程 作者:Grey 原文地址: 博客园:Java SE 19 虚拟线程 CSDN:Java SE 19 虚拟线程 说明 虚拟线程(Virtual Threads)是在Pro ...
随机推荐
- 干货必收藏!墨天轮最受DBA欢迎的250份学习文档合集
作为一个DBA,必须要精通SQL命令.各种数据库架构.数据库管理和维护.数据库调优,必要的时候,还需要为开发人员搭建一个健壮.结构良好.性能稳定的数据库环境. 技术也是不断进步的,社会的发展要求DBA ...
- VM Ware 安装mac OS xxx 系统
1. unlock 文件破解Vm Ware 默认不能安装苹果系统 :https://drive.google.com/file/d/1_AUeYh5JYltqjnuztQh-5UTomAIVBcLZ/ ...
- 背靠AI,让AI当牛马,解决程序员的烦恼
开篇问题? 作为程序员的你,写代码累吗?累!苦嘛?苦,想哭嘛?哭不出来. 还在为工作中繁重的编码任务.复杂的调试过程以及不断更新的技术栈而苦恼吗?这些挑战不仅消耗大量的时间和精力,还时常让人陷入思维的 ...
- 云原生周刊:Gateway API v1.1 发布 | 2024.6.3
开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活.可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种 ...
- 负载均衡器 OpenELB ARP 欺骗技术解析
作者:大飞哥,视源电子运维工程师,KubeSphere 用户委员会广州站站长,KubeSphere Ambassador. K8S 对集群外暴露服务有三种方式:NodePort,Ingress 和 L ...
- Games101 光线追踪 代码框架解读
目录 1 前言 2 main.cpp 3 render.cpp 3.1 折射reflect 反射refract 相关 3.2 Fresnel equation 3.3 递归函数光线追踪 3.2.1 t ...
- vue搜索历史记录缓存实现
思路: 1.浏览器缓存永久保存搜索历史数据. 2.页面初始化将数据保存到页面变量中. 3.对搜索历史记录的怎加和删除,要同步到缓存中. ----------------直接看代码----------- ...
- 搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)
第三章:超越基础--图像中的特征检测 上一篇<揭开计算机视觉的神秘面纱,原来机器是这样"看图"的!> 本篇序言:上一篇我们实现并训练了一个神经网络,成功让计算机&quo ...
- 【速记】C++ STL自定义排序
因为是"速记",难免会有不完善的地方.这篇笔记咱日后应该还会进行补充. 关于sort的比较函数 void sort( RandomIt first, RandomIt last, ...
- 今日一学,5道大厂的Java基础面试题
前言 各种框架眼花缭乱,各种逻辑需求,CRUD.久而久之,写的1000行代码中都是if else,@autowired等等,等出去面试的时候,基础题不断,而且还是不常用,或者说不在意的,往往这些就容易 ...