Enterprise Node.js Architecture: When & Why CTOs choose Node.js for scalable applications

 

Ameet Shrivastav
Kellton is a global leader in digital engineering and enterprise solutions, helping businesses navigate the complexities of... read more
Published On: August 28 , 2026
Updated On: August 28, 2026
Enterprise Node.js Architecture

Modern backend performance is determined by architecture, not programming language. As user traffic grows, response times increase, infrastructure costs rise, and development teams spend more time addressing scalability issues than delivering new features. In many cases, the bottleneck is not the database or cloud infrastructure - the real culprit is the backend architecture.

Node.js has become one of the most widely adopted backend runtimes because its architecture is designed to handle thousands of concurrent requests efficiently without relying on traditional thread-per-request models. This architectural approach enables organizations to build APIs, real-time platforms, SaaS products, and event-driven systems that scale while maintaining cost efficiency.

In this guide, you'll learn how Node.js architecture works, explore its core components, understand common architecture patterns, review enterprise implementation best practices, and discover when Node.js is the right choice for modern backend development. Whether you're evaluating a new application or modernizing an existing platform, understanding Node.js's architecture is essential for making informed technology decisions. The key takeaways from the blog include:

  • What is Node.js architecture, and why does it differ from traditional server architectures?
  • How do the Event Loop, V8 engine, and Libuv work together to process requests efficiently?
  • The architecture of a typical Node.js web application
  • Common Node.js architecture patterns used in enterprise software
  • Best practices for building scalable, production-ready backend systems
  • When is Node.js the right choice, and when is another runtime more appropriate?

What is Node.js architecture?

Node.js architecture is the internal design that enables Node.js applications to process multiple client requests efficiently using an event-driven, asynchronous, non-blocking execution model.

Unlike traditional web servers that dedicate a separate thread to every incoming request, Node.js uses a lightweight Event Loop to coordinate asynchronous operations. Instead of waiting for a database query, API call, or file operation to complete, the Event Loop immediately accepts new requests while background operations continue independently.

This approach allows a relatively small amount of compute infrastructure to support a high number of concurrent users, making Node.js particularly effective for applications where responsiveness and scalability are priorities.

Rather than viewing Node.js as simply a JavaScript runtime, enterprise architects should think of it as a high-throughput request orchestration platform. Its architectural model is designed to minimize idle compute resources and maximize throughput for I/O-heavy workloads.

Is Node.js the Right Fit for Your Enterprise Stack?

Don't let I/O bottlenecks slow your growth. Discover how Kellton's certified Node.js architects build resilient, high-throughput backend ecosystems..

Schedule a Free 15-Min Stack Audit

CTA Image

 

Why is Node.js architecture different from traditional web server architectures?

In legacy web server architectures (like Apache or traditional Java deployments), thread capacity dictates your scaling ceiling. Each client request locks a thread from start to finish. During external I/O operations—such as reading a file or querying a database—threads remain blocked while consuming server RAM. Under heavy load, this leads to thread exhaustion, latency degradation, and escalating cloud costs.

Node.js solves the thread-starvation problem:

  • Traditional Thread Model: 1 Request = 1 Occupied Thread (Blocks on I/O wait times).
  • Node.js Architecture: 1 Event Loop + Asynchronous Delegation (Non-blocking I/O via Libuv).

By delegating asynchronous tasks to background worker threads only when necessary, Node.js processes thousands of concurrent HTTP requests without memory bloat. To understand why modern engineering teams are shifting toward event-driven runtimes, here is a direct comparison of how legacy thread-per-request servers stack up against Node.js in high-throughput enterprise environments:

Server Architecture Comparison

Traditional Server ArchitectureNode.js Architecture
One thread per requestSingle Event Loop with asynchronous operations
High memory consumptionLower memory footprint
Threads remain idle during database operationsEvent Loop continues processing new requests
Scaling often requires additional server resourcesHigher concurrency on the same infrastructure
Best suited for CPU-intensive workloadsBest suited for I/O-intensive workloads

For modern digital platforms where API calls, database access, authentication, messaging, and external integrations dominate request processing, this architectural difference can translate into improved scalability and lower infrastructure costs.

What are the core components of Node.js architecture?

To evaluate Node.js for mission-critical enterprise systems, engineering leaders must look beyond high-level abstractions and understand how its runtime components process, offload, and execute requests under load.

V8 JavaScript Engine: Developed by Google, V8 compiles JavaScript directly into native machine code using multi-tier Just-In-Time (JIT) compilation (spanning Sparkplug, Maglev, and TurboFan optimization pipelines). Beyond execution, V8 manages execution contexts, the call stack, and automated heap memory allocation via concurrent Garbage Collection (GC).

The Event Loop: The orchestrator of Node.js concurrency. Implemented via C/C++, the Event Loop processes asynchronous tasks across distinct phases (Timers, Pending Callbacks, Poll, Check, and Close Callbacks). By continuously offloading non-blocking I/O operations, it enables a single main thread to coordinate tens of thousands of concurrent client connections without thread locks.

Libuv: The cross-platform C library that handles low-level, non-blocking asynchronous I/O. Libuv abstracts OS-native kernel mechanisms—such as epoll (Linux), kqueue (macOS), and IOCP (Windows)—allowing Node.js to delegate networking, DNS resolution, and file system operations directly to the underlying operating system.

Libuv Worker Pool & Worker Threads: While network I/O is handled asynchronously via OS kernel epoll/kqueue notifications, blocking file system tasks, DNS lookups, and intensive cryptographic or compression functions rely on Libuv’s internal C thread pool (UV_THREADPOOL_SIZE). For user-land CPU-heavy parallel computing, modern Node.js backends utilize native worker_threads to isolate heavy processing without stalling the main Event Loop.

Core APIs & Native Web Standards: Node.js ships with high-performance built-in modules (http, https, fs, stream, crypto, events, buffer). Modern enterprise runtimes natively support Web Standard APIs—including native fetch, WebStreams, Web Crypto, and structured ESM (ES Modules)—reducing reliance on unvetted third-party packages.

Task Queue Architecture (Microtasks & Macrotasks): Asynchronous callbacks do not execute simultaneously. Completed I/O tasks land in the Macrotask Queue (Callback Queue), while high-priority promises and process.nextTick() callbacks land in the Microtask Queue. The Event Loop strictly drains the Microtask Queue before advancing to the next phase, preserving deterministic execution order and sub-millisecond API responsiveness.

Here’s a quick visualization of Enterprise Request Flow. In modern cloud-native environments, Node.js rarely operates in isolation. Below is what a Node.js architecture diagram looks like. The diagram below explains how requests flow through a resilient and event-driven Node.js backend:

Node.js backend

How does Node.js architecture process thousands of requests simultaneously?

The most persistent myth in backend engineering is that Node.js is inherently slow because it runs on a single thread. In reality, while JavaScript execution takes place on a single main thread (the V8 Call Stack), I/O operations do not.

Node.js achieves massive concurrency through a decoupled execution flow:

  • Non-Blocking I/O Offloading: When an HTTP request triggers an external dependency—such as a PostgreSQL query, an AWS S3 upload, or a Redis cache lookup—Node.js delegates the asynchronous operation directly to the OS kernel (via epoll/kqueue) or Libuv’s background C thread pool.
  • Non-Blocking Event Loop: Rather than pausing to wait for the database or network socket to respond, the main Event Loop immediately pops the completed stack frame and picks up the next incoming client request.
  • Deterministic Event Registration: When the background OS kernel or Libuv worker completes the operation, it places a completion signal (and callback metadata) onto the Event Queue.
  • Microtask/Macrotask Execution: During its continuous polling cycle, the Event Loop drains high-priority promises (Microtask Queue) before executing standard I/O callbacks (Macrotask Queue), returning the payload to the client with sub-millisecond overhead.

For enterprise API-first platforms—where 90% of a request’s lifecycle is spent waiting on external microservices, authentication checks, and database roundtrips—this architecture enables a single Node.js container instance to handle tens of thousands of concurrent connections on a fraction of the RAM required by traditional thread-per-request runtimes.

What happens during the Node.js request lifecycle?

Every incoming HTTP request triggers an event-driven flow engineered to minimize thread context switching and maximize resource utilization in modern cloud environments. Let’s understand how this lifecycle helps engineering teams identify performance bottlenecks, optimize latency, and build scalable backend systems.

1. Ingress & Socket Initialization: The client connection hits the API gateway or load balancer and reaches the Node.js HTTP server. Node opens a non-blocking TCP socket managed by native OS primitives (epoll on Linux, kqueue on macOS).

2. Main Thread Interception: The Event Loop picks up the network event on the main thread and initializes the execution stack inside the V8 engine.

3. Execution Branching:

  • Synchronous Work: Inline JavaScript operations (data mapping, basic validation, JSON parsing) execute immediately on the call stack.
  • Asynchronous Offloading: Operations that require external I/O (SQL queries, S3 uploads, microservice calls, DNS lookups) are immediately handed off to Libuv.

4. Background Offloading Mechanisms:

  • Kernel-Level I/O: Network sockets utilize OS kernel polling directly without allocating thread resources.
    Libuv Thread Pool (UV_THREADPOOL_SIZE): Blocking disk operations, cryptographic routines (crypto.pbkdf2), and DNS lookups execute in parallel on native background C threads.
  • Callback Enqueueing & Priority Resolution: Upon I/O completion, callbacks enter internal queues. Promises drain continuously from the high-priority Microtask Queue before the loop advances to process standard callbacks in the Macrotask Queue.
  • Egress Response: The main thread processes the completed callback and streams the HTTP response back through the open socket connection, maintaining single-digit millisecond overhead.

Unlike legacy multi-threaded web servers that stall while waiting for network sockets or disk I/O, Node.js never blocks the main thread on I/O. This non-blocking architecture allows a single lightweight instance to smoothly handle tens of thousands of concurrent client connections.

Unlike traditional servers that wait for every operation to finish before processing the next request, Node.js immediately returns to the Event Loop and continues serving additional users. This architectural behavior is the primary reason Node.js excels in API-heavy enterprise applications.

Why is the Event Loop the heart of Node.js architecture?

If the V8 engine functions as the execution brain of Node.js, the Event Loop operates as its traffic conductor. Built on top of C-based Libuv, it continuously manages asynchronous events, schedule queues, and call stack evaluation—ensuring the application remains non-blocking even under heavy concurrent load.

Anatomy of the Event Loop Phases

Rather than running a generic while-loop, the Event Loop executes through six distinct sequential phases during every iteration (tick):

  • Timers Phase: Executes callbacks scheduled by setTimeout() and setInterval() whose thresholds have expired.
  • Pending Callbacks Phase: Processes deferred I/O callbacks (such as system-level TCP errors or socket responses) deferred from the previous tick.
  • Idle, Prepare Phase: Internal engine phase used strictly by Libuv for state preparation before polling.
  • Poll Phase: The core phase of the loop. It retrieves new I/O events (incoming network connections, data reads) and executes their callbacks. If no pending timers exist, the loop blocks here briefly waiting for incoming kernel signals.
  • Check Phase: Executes callbacks registered via setImmediate(), allowing developers to run tasks right after the Poll phase completes.
  • Close Callbacks Phase: Drains cleanup events for closed resources (e.g., socket.on('close', ...)).

Between every phase transition, Node.js pauses to completely drain the Microtask Queue which holds process.nextTick() callbacks and resolved native Promise resolutions. Because microtasks run before the loop advances to the next phase, unhandled recursive promises can starve the Event Loop, causing API latency to skyrocket.

By constantly delegating blocking operations to system kernel threads and processing callbacks in deterministic phases, the Event Loop maintains low-latency responsiveness across enterprise microservices.

How does Node.js architecture compare with traditional server architectures?

Selecting a backend runtime is fundamentally an architectural trade-off between concurrency models, memory footprints, and compute workloads.

Traditional application servers (such as Spring/Java, Apache/PHP, or ASP.NET Framework) historically relied on a Thread-per-Request model. Under high load, each incoming HTTP connection claims a dedicated OS thread. As concurrent users scale into the tens of thousands, memory usage scales linearly, while CPU context-switching overhead degrades system throughput.

Node.js shifts the paradigm to an Event-Driven, Single-Threaded Orchestration model backed by non-blocking kernel I/O and worker pools.

Enterprise Architecture Comparison: Node.js vs. Thread-per-Request Runtimes

Architectural DimensionTraditional Thread-per-Request Runtimes (JVM, Apache/PHP, .NET Framework)Modern Node.js Architecture (V8 Engine + Libuv)Enterprise Business Impact
Concurrency ModelDedicated OS thread spawned/allocated per incoming request.Single-threaded Event Loop orchestrating asynchronous kernel/worker tasks.Node.js handles 10x–50x more concurrent idle/slow client connections per node.
Memory FootprintHigh Overhead: ~1 MB to 2 MB allocated memory per active thread stack.Ultra-Low: Shared heap memory with lightweight event descriptors (~KB per socket).Decreased RAM consumption; higher container density per physical host.
I/O Bottleneck HandlingBlocking: Thread enters idle wait state during DB/network calls.Non-blocking: Main thread immediately releases call stack for next request.Sub-second response times under peak API traffic; no thread starvation.
CPU Context SwitchingHigh OS context-switching tax as active thread count scales.Zero main-thread context switching; CPU time goes directly to execution.Sustained high throughput (RPS) without CPU thrashing.
CPU-Heavy WorkloadsNative Strength: Multi-core execution handles parallel CPU math easily.Requires native worker_threads, cluster modules, or microservice offloading.Node.js requires deliberate architectural decoupling for heavy computation.
Infrastructure TCOHigher hardware/cloud costs due to thread memory overhead under load.Lower TCO for I/O-intensive workloads (APIs, gateways, microservices).Reduces cloud compute footprint (AWS ECS/EKS nodes) by 30%–60%.

Which Enterprise Applications Benefit Most from Node.js Architecture?

Node.js delivers its highest enterprise ROI in systems where workloads spend significantly more time waiting on asynchronous network I/O than executing heavy CPU-bound math. For organizations prioritizing high availability, sub-second API responsiveness, and rapid feature delivery across distributed teams, its event-driven design aligns naturally with modern cloud infrastructure.

  • SaaS Platforms & Customer Portals Building modern multi-tenant SaaS platforms requires serving millions of concurrent user sessions while maintaining fast API response times. Node.js excels as a unified API layer, providing high-throughput endpoint orchestration, streamlined JWT/OAuth authentication pipelines, and rapid iteration cycles for continuous deployment environments.
  • E-Commerce Platforms & Digital Retail Modern e-commerce architectures rely heavily on asynchronous event orchestration across inventory systems, payment gateways, and recommendation engines. Node.js easily absorbs massive traffic surges—such as Black Friday flash sales—without thread exhaustion, allowing digital storefronts to aggregate third-party microservice responses instantly.
  • Banking Portals & Fintech Systems Fintech platforms utilize Node.js primarily for low-latency API orchestration, account aggregation, and real-time transaction streaming. Its non-blocking architecture ensures sensitive operations—like multi-factor authentication checks, fraud-detection event publishing, and push notifications—execute continuously without blocking core user sessions.
  • Healthcare Platforms & EHR Systems Interoperability is the central challenge in modern health-tech systems, which must ingest, parse, and route payloads across diverse clinical APIs (HL7, FHIR, DICOM). Node.js serves as an exceptionally efficient integration layer, streaming patient data securely between legacy health databases and modern web/mobile client interfaces.
  • Logistics, Supply Chain & IoT Fleet Management Supply chain platforms handle continuous telemetry, package location updates, and sensor payloads from millions of edge devices. Node.js natively manages high-concurrency event streams (via MQTT or WebSockets) and pub/sub messaging queues (Kafka, RabbitMQ) to power real-time tracking dashboards with minimal hardware overhead.
  • Real-Time Media & Streaming Services Applications requiring persistent bi-directional communication—such as live chat, collaborative tools, and media streaming gateways—leverage Node.js to manage tens of thousands of simultaneous WebSocket connections per instance while maintaining a minimal RAM footprint.

Evaluating Node.js for your next enterprise platform modernization?

Kellton helps C-level tech leaders architect high-concurrency microservices, eliminate backend bottlenecks, and reduce cloud infrastructure costs.

Consult with a Kellton Solutions Architect

CTA Image

 

What are the most common Node.js architecture patterns?

Selecting Node.js is only the first step; structuring your application determines long-term velocity, maintainability, and operational stability. The optimal pattern depends on your team structure, domain complexity, and scaling targets.

  • Modular Monolith (Layered Architecture): Organizes code into distinct logical layers (controllers, services, repositories). Ideal for mid-sized teams requiring high development velocity without the operational overhead of distributed microservices.
  • NestJS & Enterprise Domain-Driven Design (DDD): Leverages TypeScript, dependency injection, and modular boundaries to enforce strict domain isolation. Best for large-scale corporate applications requiring strict maintainability and standardized conventions.
  • Microservices Architecture: Decouples business domains into independently deployable Node.js services communicating over gRPC, REST, or lightweight event buses. Perfect for enterprise platforms requiring independent team autonomy and targeted horizontal auto-scaling.
  • Event-Driven Architecture (Pub/Sub): Utilizes event brokers (Apache Kafka, RabbitMQ, AWS SNS/SQS) to process asynchronous tasks non-blockingly. Highly effective for telemetry ingestion, notification engines, and real-time audit logs.
  • BFF (Backend-for-Frontend): Places lightweight Node.js API layers between frontend clients (web, mobile, IoT) and core downstream microservices to tailor data payloads, reduce over-fetching, and improve mobile latency.

Revealing the best practices for enterprise Node.js architecture and workload limitations?

Achieving production excellence with Node.js requires strict architectural standards around maintainability, security, and operational resilience.

Adopt TypeScript by Default: Enforce strong typing, safer refactoring, and clear interface definitions across growing engineering teams to prevent common runtime errors before deployment.

Isolate Core Business Logic: Decouple domain rules from framework dependencies (Express, NestJS) and database drivers using a layered or clean structure. Controllers should strictly handle request/response mechanics, services manage domain rules, and repositories handle persistence.

Architect APIs for Evolution: Standardize on versioning strategies (/v1/), consistent JSON payloads, rate limiting, pagination, and automated OpenAPI (Swagger) documentation to avoid breaking downstream clients.

Implement Strategic Caching: Offload database read bottlenecks by caching high-frequency, low-variance data (user sessions, product catalogs, global settings) using distributed stores like Redis.

Embed Comprehensive Observability: Instrument centralized logging (Winston/Pino), distributed tracing (OpenTelemetry), APM metrics, and health-check endpoints from day one to minimize mean time to resolution (MTTR).

When to Choose Alternative Runtimes

While Node.js excels at high-concurrency I/O and API orchestration, its single-threaded model makes it less suited for continuous, heavy CPU-bound processing.

Workload CategoryWhy Node.js StrugglesPreferred Enterprise Alternative
Heavy Numerical & Scientific ComputingBlocks the main Event LoopC++ / Rust
Video Transcoding & 3D RenderingRequires high parallel CPU pipeline executionC++ / Go
Machine Learning & AI TrainingLacks native tensor operations and deep ecosystem librariesPython
High-Frequency Financial ModelingGarbage collection pauses introduce unpredictable latencyRust / C++

Accelerate Enterprise Modernization with Kellton’s Node.js Expertise

Building enterprise-grade Node.js systems requires a deliberate alignment between architecture, performance, and long-term business goals. Whether you are launching high-concurrency digital platforms, decomposing complex legacy monoliths, or optimizing cloud-native microservices, structural design decisions directly dictate your team’s development velocity and operational resilience.

At Kellton, we bridge the gap between high-level architectural strategy and hands-on engineering execution. Our deep domain expertise across API design, serverless integrations, microservices decomposition, and performance tuning empowers organizations to eliminate technical debt, maximize request throughput, and slash infrastructure costs. By tailoring every implementation—from modular monoliths to event-driven ecosystems—to your specific operational requirements, Kellton ensures your backend architecture scales seamlessly alongside your business.

Planning a new backend platform or modernizing an existing application?

Explore Kellton's Node.js Development Services to learn how our engineering teams design scalable, secure, and cloud-ready backend architectures for enterprise applications.

Partner with Kellton to Scale Your Enterprise Backend

CTA Image

 

Frequently asked questions

Q: What is Node.js architecture?

A: Node.js architecture is an event-driven, single-threaded runtime model that handles high-concurrency requests asynchronously by coordinating execution via the V8 engine and delegating background I/O tasks to Libuv.

Q: Why is Node.js considered highly scalable?

A: Node.js processes thousands of concurrent connections on a single thread without blocking, minimizing memory overhead. It scales vertically through non-blocking I/O and horizontally across containerized environments with load balancing.

Q: What are the core components of Node.js architecture?

A: The foundational components include the V8 JavaScript Engine, the Event Loop, Libuv, the Thread Pool, the Callback/Event Queue, and native C++ bindings for low-level OS operations.

Q: Which architecture pattern is best for Node.js applications?

A: Selection depends on domain complexity: Layered Architecture fits mid-sized CRUD apps, Clean and Hexagonal patterns suit enterprise domains requiring high maintainability, and Microservices favor decoupled, multi-team platforms.

Q: Is Node.js suitable for enterprise-grade applications?

A: Yes. Its high throughput, massive ecosystem, and asynchronous performance make it ideal for fintech platforms, SaaS backends, real-time analytics engines, eCommerce, and microservices API gateways.

Q: When should Node.js not be used as the primary backend?

A: Avoid Node.js for heavy compute-bound tasks like raw 3D video rendering, large-scale scientific simulations, or heavy AI model training, where multi-threaded CPU-bound execution in languages like C++ or Rust is superior.

Q: What is the core difference between the Event Loop and Worker Threads?

A: The Event Loop handles I/O orchestration, network events, and API callbacks on the main thread, whereas Worker Threads run CPU-intensive processing tasks in parallel without freezing request processing.

Q: What is the primary function of Libuv in Node.js?

A: Libuv is the native C library that abstracts OS-level asynchronous operations. It manages the Event Loop, thread pool, network sockets, file system tasks, and timer execution.

Q: How does Layered Architecture simplify backend development?

A: Layered Architecture organizes code into distinct tiers (Routes, Controllers, Services, Repositories). This separation of concerns speeds up developer onboarding, simplifies unit testing, and lowers maintenance costs, though growing applications must keep service layers modular to avoid complexity.

Q: Why is MVC still popular in Node.js applications?

A: Model-View-Controller separates data handling, user interfaces, and routing logic. Its straightforward organization enables rapid prototyping and widespread framework adoption (like Express.js), making it ideal for CRUD-heavy admin portals, though scaling requires adding explicit domain boundaries.

Q: When should enterprises adopt Clean Architecture?

A: Adopt Clean Architecture when core business rules must remain completely independent of frameworks, databases, and third-party APIs. It isolates business logic at the center, ensuring long-term flexibility, simplified tech upgrades, and high testability for complex domain applications.

Q: What is Hexagonal Architecture, and why does it improve flexibility?

A: Hexagonal Architecture (Ports and Adapters) decouples core business logic from external infrastructures via strict interfaces. This allows teams to swap out databases, messaging systems, or external APIs without impacting domain logic, significantly reducing vendor lock-in.

Q: Why is Microservices Architecture preferred for modern enterprises?

A: Microservices divide monoliths into independently deployable, domain-specific services communicating over APIs or event buses. This enables team autonomy, targeted auto-scaling, and fault isolation, though it introduces distributed transaction complexity, monitoring overhead, and service-mesh management requirements.

Q: How does Event-Driven Architecture improve backend scalability?

A: Event-Driven Architecture leverages message brokers (like Kafka or RabbitMQ) to decouple services asynchronously. Instead of blocking on synchronous HTTP calls, applications publish and consume real-time events, dramatically improving system resilience, throughput, and cross-system data integration.

Q: When should Serverless Architecture complement Node.js backends?

A: Serverless platforms (AWS Lambda, Google Cloud Functions) complement Node.js for event-triggered, transient, or unpredictable workloads like file processing, webhooks, and background automation. This hybrid approach optimizes cloud infrastructure costs by charging only for active compute time.

Q: What is non-blocking I/O, and why does it matter for enterprise platforms?

A: Non-blocking I/O allows Node.js to initiate database queries or external API calls and immediately move on to process other client requests without waiting for responses. Multiplied across thousands of concurrent users, this eliminates thread-idling and slashes infrastructure costs.

Q: What role does Libuv play in Node.js architecture?

A: Libuv is the cross-platform C library underlying Node.js that handles asynchronous background operations like file system access, DNS resolution, and TCP communication. It delegates heavy tasks to native OS kernel primitives or its internal thread pool, notifying the Event Loop upon completion.

Q: How do Worker Threads differ from the Event Loop in handling heavy workloads?

A: The Event Loop orchestrates incoming network traffic and non-blocking I/O callbacks on the main thread. In contrast, Worker Threads execute CPU-heavy computations (such as image processing, encryption, or AI inference) in parallel, preventing main-thread blocking and preserving low-latency API performance.