使用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. excel江湖异闻录--渣渣

    有朋友问过我,为什么要写这些,细细思量,一来我喜欢这个纯粹的江湖,二则向这些纯粹的高手.大神致敬,三是纪念一下自己学习EXCEL的历程. 其实,每一个篇章都有一个逻辑,只不过这个逻辑,不是按照实力的高 ...

  2. ptmalloc、tcmalloc与jemalloc对比分析

    背景介绍 在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmalloc替代glibc标配的ptmalloc做优化,CPU消耗和耗时确实有所降低.但在晚上高峰时期,在CPU刚刚超过50 ...

  3. kmemleak 和kasan 的区别

    kmemleak 和kasan 都是 Linux 内核中的一些工具和特性,用于帮助进行内存错误检测和修复.然而,它们之间有一些区别: 功能:kmemleak 用于检测内核中未释放的内存泄漏,它可以跟踪 ...

  4. 墨天轮最受DBA欢迎的数据库技术文档-容灾备份篇

    在大家的支持与认可下,墨天轮编辑部继续为大家整理出了[墨天轮最受欢迎的技术文档]系列第二篇--容灾备份篇,希望能够帮助到大家. 作为一名数据库管理员,最怕数据库中心突然失去服务能力.影响业务,而不论是 ...

  5. wpf样式模板的使用

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  6. Android复习(五)设备兼容—>多apk支持

    1. 对于不同的屏幕发布单独的apk https://developer.android.google.cn/training/multiple-apks/screensize 2.多窗口模式 在An ...

  7. linux命令杂记

    chmod 777 lixiangj 修改目录为共享权限cd .. 跳转上一级目录cd - 跳转上一次跳转的目录ll 查看目录下所有文件ctrl+L 清除屏幕内容| head -10 只看结果中的前1 ...

  8. 双指针习题:Kalindrome Array

    Kalindrome Array 题目链接: Kalindrome Array - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题面翻译 对于长度为 \(m\) 的序列 \(b\), ...

  9. VuePress安装

    linux 下预构建二进制文件安装 Nodejs Nodejs预购建二级制文件下载地址 安装 Nodejs 和 npm # 解压 tar xvf node-v20.15.1-linux-x64.tar ...

  10. 如何将rust日志输出到android终端

    本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议.转载请注明来自 唯你 背景 在 Rust 中,使用 println!打印日志时,输出实际上是发送到标准输出(stdout),而 ...