编程 Bun.jsv1.1.25版本发布,性能显著提升,每秒可处理129万个HTTP请求

2024-11-18 03:36:05 +0800 CST views 1113

Bun.jsv1.1.25版本发布,性能显著提升,每秒可处理129万个HTTP请求

images

近期,Bun 发布了 v1.1.25 版本,并高调宣布在最新的性能测试中,每秒可以处理 129 万个 HTTP 请求。让我们一起来看看这个版本究竟做了哪些改进吧。

node:cluster 支持

Bun 现在支持 node:cluster API。通过使用这个 API,你可以在同一个端口上运行一组 Bun workers,从而实现更高的吞吐量和利用率。对于拥有多个 CPU 核心的机器来说,这是在生产环境中进行负载均衡的最佳选择。

示例:

主要的 worker 会创建 n 个子 worker,通常数量与 CPU 核心数相同;每个子 worker 都会监听相同的端口(使用 reusePort);传入的 HTTP 请求会在子 worker 之间进行负载均衡分配处理。

import cluster from "node:cluster";
import http from "node:http";
import { cpus } from "node:os";
import process from "node:process";

if (cluster.isPrimary) {
  console.log(`主进程 ${process.pid} 正在运行`);

  // 根据 CPU 核心数创建 N 个子进程
  for (let i = 0; i < cpus().length; i++) {
    cluster.fork();
  }

  cluster.on("exit", (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 退出`);
  });
} else {
  // 请求会由子进程池中的工作进程处理,而不是主进程
  http
    .createServer((req, res) => {
      res.writeHead(200);
      res.end("hello world\n");
    })
    .listen(3000);

  console.log(`工作进程 ${process.pid} 已启动`);
}

这个示例代码可以与 node:http API 以及 Bun.serve() API 一起使用。

import cluster from "node:cluster";
import { cpus } from "node:os";

if (cluster.isPrimary) {
  // 主进程逻辑:根据 CPU 核心数创建子进程
  for (let i = 0; i < cpus().length; i++) {
    cluster.fork();
  }
} else {
  // 工作进程逻辑:使用 Bun 框架提供的 API 运行服务器
  Bun.serve({
    port: 3000, // 监听的端口号
    fetch(request) {
      return new Response(`你好,来自工作进程 ${process.pid}`);
    },
  });
}

**注意:**目前 reusePort 只在 Linux 系统上有效。在 Windows 和 macOS 上,操作系统无法像预期那样对 HTTP 连接进行负载均衡处理。

开始支持 V8 公开 C++ API

Bun 现在支持 V8 的公开 C++ API,这使得像 cpu-features 这样的软件包可以在 Bun 中正常工作。值得注意的是,Bun 并不是像 Node.js 一样构建在 V8 之上,而是构建在 Safari 使用的 JavaScript 引擎 JavaScriptCore 上。因此,Bun 官方实现了一个自己的 C++ 翻译层,将 V8 的 API 与 JavaScriptCore 对接。

#include "v8.h"
#include "V8Primitive.h"
#include "V8MaybeLocal.h"
#include "V8Isolate.h"

namespace v8 {

enum class NewStringType { /* ... */ };

class String : Primitive {
public:
    enum WriteOptions { /* ... */ };

    BUN_EXPORT static MaybeLocal<String> NewFromUtf8(Isolate* isolate, char const* data, NewStringType type, int length = -1);
    BUN_EXPORT int WriteUtf8(Isolate* isolate, char* buffer, int length = -1, int* nchars_ref = nullptr, int options = NO_OPTIONS) const;
    BUN_EXPORT int Length() const;

    // 将本地字符串对象转换为JavaScriptCore的JSString对象
    JSC::JSString* localToJSString()
    {
        return localToObjectPointer<JSC::JSString>();
    }
};
}

在此之前,尝试导入使用这些 API 的软件包会报错。现在,像 cpu-features 这样的包可以正常导入并在 Bun 中运行。

$ bun index.ts
{
  arch: "aarch64",
  flags: {
    fp: true,
    asimd: true,
    // ...
  },
}

使用 @aws-sdk/client-s3 实现的 S3 上传速度提高了 5 倍

Bun 修复了 node:http 客户端实现中的一个 bug,这使得上传到 S3 的速度提高了 5 倍。

独立可执行文件中的 Worker 支持

Bun 的单文件独立可执行文件现在支持绑定 Workernode:worker_threads

// main.ts
console.log("Hello from main thread!");

new Worker("./my-worker.ts");

// my-worker.ts
console.log("Hello from another thread!");

要使用 worker 编译独立可执行文件,可以将文件入口传递给 bun build --compile 命令:

bun build --compile ./main.ts ./my-worker.ts

这将在生成的可执行文件中将 my-worker.tsmain.ts 作为独立的入口点进行打包。

使用 OMGJIT 在 Windows 上实现更快的 WebAssembly

Windows 上的 WebAssembly 现在支持 JavaScriptCore 的优化即时编译器 (JIT),称为 OMGJIT。

Node.js 兼容性改进

execa 现在可以正常工作了。Bun 修复了一个不能正确支持 EventTargetsetMaxListeners 的 bug,这个问题影响到了像 execa 这样的包。

import { execa } from "execa";

const { stdout } = await execa`echo "test"`;

问题已修复:在调用 destroy() 关闭 TCP 连接后,与 node:net 的连接出现挂起

Bun 修复了一个 bug,在调用 destroy() 关闭 TCP 连接后,进程没有始终正确退出,因为事件循环仍然处于活动状态。这有时会导致像 postgres 这样的包无限期地挂起。

import net from "node:net";

const server = net.createServer((socket) => {
  socket.on("connect", (data) => {
    socket.destroy();
  });
});

server.listen(3000);

推荐文章

介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
php腾讯云发送短信
2024-11-18 13:50:11 +0800 CST
php指定版本安装php扩展
2024-11-19 04:10:55 +0800 CST
html夫妻约定
2024-11-19 01:24:21 +0800 CST
# 解决 MySQL 经常断开重连的问题
2024-11-19 04:50:20 +0800 CST
Redis函数在PHP中的使用方法
2024-11-19 04:42:21 +0800 CST
浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
使用Python实现邮件自动化
2024-11-18 20:18:14 +0800 CST
JavaScript设计模式:发布订阅模式
2024-11-18 01:52:39 +0800 CST
20个超实用的CSS动画库
2024-11-18 07:23:12 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
Nginx 防盗链配置
2024-11-19 07:52:58 +0800 CST
用 Rust 构建一个 WebSocket 服务器
2024-11-19 10:08:22 +0800 CST
2024年公司官方网站建设费用解析
2024-11-18 20:21:19 +0800 CST
在 Rust 生产项目中存储数据
2024-11-19 02:35:11 +0800 CST
聚合支付管理系统
2025-07-23 13:33:30 +0800 CST
windows下mysql使用source导入数据
2024-11-17 05:03:50 +0800 CST
程序员出海搞钱工具库
2024-11-18 22:16:19 +0800 CST
基于Webman + Vue3中后台框架SaiAdmin
2024-11-19 09:47:53 +0800 CST
纯CSS实现3D云动画效果
2024-11-18 18:48:05 +0800 CST
MySQL 日志详解
2024-11-19 02:17:30 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
程序员茄子在线接单