8月22日、Bun v1.1.25がリリースされた。
このリリースでは、42件のバグ修正が行われ、node:cluster
のサポートやV8のC++ APIへの対応が新たに追加された。また、Windows上でのWebAssemblyのパフォーマンス向上や、@aws-sdk/client-s3を用いたS3へのアップロード速度が5倍に向上するなど、多くの改善が含まれている。
主な新機能と改善点
node:clusterのサポート
Bunはnode:cluster
APIをサポートするようになり、複数のBunワーカーが同一ポートを共有して動作することが可能となった。これにより、複数のCPUコアを持つマシンでのスループットと利用効率が向上し、プロダクション環境での負荷分散が容易になる。
node:cluster
はNode.jsにおいて、サーバーアプリケーションがマルチコアプロセッサの能力を活用できるようにするためのAPIである。通常、JavaScriptのランタイム環境では単一のスレッドでコードが実行されるため、1つのプロセスは1つのCPUコアしか使用できない。しかし、node:cluster
を利用することで、複数のワーカープロセスを生成し、それぞれが同じポートでリクエストを処理することができる。このアプローチにより、高負荷のウェブアプリケーションでのパフォーマンスが大幅に向上する。
以下はそのサンプルコードである。
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(`Primary ${process.pid} is running`);
for (let i = 0; i < cpus().length; i++) {
cluster.fork();
}
cluster.on("exit", (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} exited`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end("hello world");
}).listen(3000);
console.log(`Worker ${process.pid} started`);
}
上記のコードでは、メインプロセス(Primary
)が複数のワーカープロセスを生成し、それぞれがHTTPリクエストを処理する。各ワーカーは同じポートで待ち受けるが、LinuxではreusePort
オプションにより、オペレーティングシステムが自動的にリクエストをワーカーに振り分ける。これにより、負荷分散が実現される。ただし、WindowsやmacOSではこのオプションは期待通りに動作しないため、Linuxほどの効果は得られない場合がある。
V8 C++ APIサポートの初期対応
BunはV8の公開C++ APIをサポートするようになった。これにより、cpu-features
のようなパッケージがBunでも動作するようになる。
BunはJavaScriptランタイムとして、GoogleのV8ではなくJavaScriptCore上で動作するため、独自のC++翻訳レイヤーを実装することで実現された。
S3アップロードの速度が5倍に向上
- @aws-sdk/client-s3を使用したS3へのアップロードが5倍速くなった。これは、
node:http
クライアントのバグ修正により実現されたものである。
スタンドアロン実行ファイル内でのWorkerサポート
- Bunのシングルファイルスタンドアロン実行ファイルが
Worker
およびnode:worker_threads
をバンドルしてサポートするようになった。
以下はそのサンプルコードである。
console.log("Hello from main thread!");
new Worker("./my-worker.ts");
また、bun build --compile
を用いて、これらのエントリーポイントをコンパイルすることが可能である。
バグ修正とその他の改善
TextEncoderStream
が誤った型を返す問題を修正- Bunのシェルでエスケープされたバックティックを正しく処理しないクラッシュを修正
TextEncoder
がJITされた際にクラッシュする問題を修正- WebSocketサーバーでの希少なクラッシュを修正
詳細は[Bun v1.1.25]を参照していただきたい。