慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
Node.js イベントループアーキテクチャー — 単スレッド実行環境が大規模な並行処理をどう処理するか
Raj Dutta · 2026-05-24 · via DEV Community

Node.jsを使い始めた当初、一つ気になるところがありました:

どうして単一スレッドのシステムが同時に数千のリクエストを処理できるのか?

矛盾しているように聞こえます。しかし、イベントループを正しく理解した後(特に公式ドキュメントから)、すべてがピンときました。このブログは、深みを損なわず、できるだけ簡単に説明する私の試みです。


「シングルスレッド」の実際の意味とは

Node.jsはしばしばシングルスレッドと呼ばれますが、その記述は不完全です。

  • JavaScriptの実行は一つのメインスレッド
  • 上で行われますが、Node.js自体は一度に一つの操作に限定されません
  • それには以下のものを使用します:

    • OSカーネル
    • バックグラウンドスレッド(libuv)
    • 非同期I/O

→ 正しい表現は以下の通りです:

Node.jsはJavaScriptの実行において単スレッドですが、I/Oの処理において

マルチシステムです


この区別がすべてです。__JHSNS_SEG_92f3a4cf_21__ 核心アイデア:イベント駆動型、非ブロッキングアーキテクチャ

Node.jsはタスクの完了を待たないです

代わりに、このパターンに従います

  1. リクエストを受け取る
  2. タスクを開始する(DBコール、ファイル読み込み、APIコール)
  3. 待たない
  4. 次のリクエストに移る
  5. 結果が準備できたときに後で戻ってくる

これを呼びます非同期I/O.

→ 官方ドキュメントより
Node.jsは可能な限り作業をシステムにオフロードするため、メインタスクリプトは解放されます


こんな感じで考えてみてください(簡単な類推)

想像してみてください

  • あなたはウェイター(イベントループ)です
  • キッチン=OS/バックグラウンドワーカー

あなた:

  • 注文を取る
  • 厨房に渡す
  • 完成した料理を出す

あなたは:

  • 自分で調理しない
  • 注文を待って無駄になる

これがNode.jsがスケールする正確な方法です


深掘り:イベントループのフェーズ

イベントループは単なるキューではありません。フェーズで動作します はそれぞれ特定のタイプのコールバックを処理しています。

アーキテクチャ:

メインフェーズ:

  1. タイマー
  • setTimeout()setInterval()
  1. からのコールバックを実行します。
  • システムレベルのコールバック(TCPエラーなど)を処理します。
  1. アイドル / 準備
  • 内部使用(私たちが扱うものではありません)
  1. アンケートフェーズ(最も重要)
  • 新しいI/Oイベントを取得
  • I/Oコールバックを実行
  • 何もしない場合は待機
  1. チェックフェーズ
  • setImmediate()のコールバックを実行
  1. クローズコールバック
  • クリーンアップコールバックを実行(socket.on('close')など)
   ┌───────────────────────────┐
   │           timers          │
   └─────────────┬─────────────┘
                 │
                 v
   ┌───────────────────────────┐
┌─>│     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │      close callbacks      │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤           timers          │
   └───────────────────────────┘

フルスクリーンモードに入る フルスクリーンモードを終了

→ このループはこれらを継続的に巡回します.


ポーリングフェーズが心臓である理由

魔法が起こる場所です.

  • 入力リクエストがここで処理されます
  • 完了した非同期タスクがここに戻ります
  • 保留がない場合 → ノードは効率的に待機します

→ それがNode.jsがCPUサイクルを無駄にしない理由で、非常にスケーラブルであるためです。


process.nextTick() と setImmediate()

これは小さいけれど重要な詳細をほとんどの人が無視していることです。

process.nextTick()

  • 実行します現在の関数の直後に
  • 走りますイベントループが続行する前に
  • 悪用されると I/O をブロックできる

setImmediate()

  • の次のイテレーション(チェックフェーズ)で実行されます
  • より安全で予測可能です

→ 公式ドキュメントでは推奨されています:

ほとんどの実世界のシナリオでsetImmediate()を使用することをお勧めします


Node.jsが数千のリクエストを処理する方法

本質的な質問です

伝統的なサーバー(リクエストごとにスレッド)

  • 各リクエストは新しいスレッドとして作成
  • メモリ使用量が重い
  • コンテキストスイッチングのオーバーヘッド

Node.jsのアプローチ

  • 単一のスレッドがすべてのリクエストを処理
  • リクエストごとにスレッドを作成しない
  • 非同期コールバックを使用

実際に起こること:

  • 1000人のユーザーがサーバーにアクセス
  • Node.js:

    • すべてのリクエストを登録します
    • 非同期操作を開始します
    • イベントループを解放します
  • レスポンスが返ってくるたびに:

    • コールバックがキューに入ります
    • イベントループがそれらを実行します

→ 結果:
高い並行性と低いリソース使用


重要な洞察:Node.jsはI/Oバウンド作業に最適です

Node.jsは次のような場面で光ります:

  • データベースクエリ
  • APIコール
  • ファイルシステム操作
  • ストリーミング
  • リアルタイムアプリ(チャット、ソケット)

しかし…

適さないのは:

  • 重いCPU計算
  • 大規模な同期ループ

その理由は:

イベントループをブロックする = すべてをブロックする


パフォーマンスを低下させる一般的なミス

1. ブロッキングコード

while(true) {}

全画面表示モードに入る 全画面表示モードから退出する

→ サーバー全体がフリーズする


2. process.nextTick()

  • を誤使用する
  • イベントループを飢らせる__JHSNS_SEG_92f3a4cf_134__I/O実行を防止する

3. APIで同期コードを書く

fs.readFileSync()

全画面表示モードに入る 全画面表示モードから退出

→ 本番環境では避ける


もっとパワーが必要な場合(1つのコアを超えてスケールする場合)

Node.jsはプロセスごとに単一スレッドですが、以下を使用してスケールできます:

  • Clusterモジュール
  • ワーカースレッド
  • ロードバランサー

→ これにより:

  • マルチコアの利用
  • 横方向のスケーリング

私の最終的な理解

公式のNode.jsドキュメントを確認し、実際にアプリケーションを構築した後、私はそれについてこんな風に考える:

  • Node.jsは一度にすべてをやろうとしていない
  • それはブロックしないようにしようとしている

イベントループはただの賢い調整役です:

  • 準備ができているものを実行
  • 待っているものをスキップ
  • システムを動かし続けます

→ そのためです:

Node.jsは数千の並行リクエストを処理できます — 並列実行ではなく、効率的なスケジューリングと非同期設計


結論

一つの文でまとめると:

Node.jsは速いから拡張できるわけではなく、不必要な待ちを非常に上手くやるから拡張できるこの考え方が理解できるようになると、Node.jsのアーキテクチャに関するすべてが意味をなすようになる