Course contentsShow
← Node.js
Lesson 1118 of 1,98010. Real-time Communication and WebsocketsFree lesson

Using SharedArrayBuffer for High-Frequency Data

You will explore shared memory techniques to share data between worker threads for high-performance messaging.

In this lesson, you will learn how to leverage SharedArrayBuffer to eliminate serialization overhead when passing high-frequency data between Node.js worker threads.

The Problem with Structured Cloning

Typically, when you send data between a main thread and a worker thread using postMessage(), Node.js uses the "structured clone algorithm." This creates a deep copy of your data. While safe, this process is computationally expensive. If you are handling real-time WebSocket traffic—like high-frequency market updates or sensor telemetry—the CPU time spent copying buffers can quickly become a bottleneck, leading to increased latency.

Enter SharedArrayBuffer

SharedArrayBuffer provides a raw, binary memory space that can be accessed simultaneously by multiple threads. Instead of copying data, you are essentially passing a "pointer" to the same block of memory. When one thread writes a value into the buffer, the other thread can see that update instantly.

To manage this safely, we pair the buffer with Atomics, which provides methods for thread-safe operations, ensuring that one worker doesn't overwrite data while another is reading it.

Practical Implementation

Here is how you might share a small buffer to act as a high-speed "ticker" for incoming WebSocket data:

// Main thread
const sharedBuffer = new SharedArrayBuffer(1024); // 1KB of shared memory
const int32View = new Int32Array(sharedBuffer);

worker.postMessage({ buffer: sharedBuffer });

// In the worker thread, update the data without cloning
// We use Atomics to ensure safe concurrent access
Atomics.store(int32View, 0, 12345); // Update index 0 to 12345

By using SharedArrayBuffer, you bypass the overhead of the structured clone algorithm entirely. This is crucial for real-time systems where milliseconds matter. Because the memory is shared, you avoid the "stop-the-world" effect that occurs when the garbage collector or the structured clone algorithm processes large, frequent objects. Just remember: since multiple threads share this memory, you must use Atomics to prevent race conditions during read-write operations.

Key Takeaway: SharedArrayBuffer allows multiple threads to access the same memory location directly, eliminating serialization latency for high-frequency data streams.