← Recipes

阅读中文版本

Cache Serialization with MessagePack

Swap JSON for MessagePack in a hot cache path to cut serialization CPU and payload size without changing semantics.

~30 minperformancecachingserialization

Task

Replace JSON serialization with MessagePack for a cache value and measure the improvement.

When to use this

Cache reads dominate CPU because JSON parsing of large values is expensive.

Prerequisites

  • A MessagePack library for your runtime
  • A cache you can modify
  • A benchmark with representative values

Steps

1. Encode and decode with MessagePack instead of JSON.

import { encode, decode } from '@msgpack/msgpack';
await cache.set(key, encode(value));
const value = decode(await cache.get(key));

Expected output: Values round-trip through a compact binary format with the same data.

2. Benchmark size and CPU.

node bench.js # compare JSON.stringify vs encode byte size and time

Expected output: Payload size and serialization time both drop measurably.

Troubleshooting

Problem

Schema evolution breaks decoders

Solution

Version cached values and keep a JSON fallback during migration.

Problem

Debugging harder

Solution

Provide a CLI or inspector that decodes MessagePack for support.

Limitations

  • Binary formats are less debuggable.
  • Both producer and consumer must agree on the format.
  • Gains vary with data shape.

What this recipe does

Replace JSON serialization with MessagePack for a cache value and measure the improvement.

Cache reads dominate CPU because JSON parsing of large values is expensive.

Prerequisites

  • A MessagePack library for your runtime
  • A cache you can modify
  • A benchmark with representative values

Procedure

  1. Encode and decode with MessagePack instead of JSON.
import { encode, decode } from '@msgpack/msgpack';
await cache.set(key, encode(value));
const value = decode(await cache.get(key));

Expected result: Values round-trip through a compact binary format with the same data.

  1. Benchmark size and CPU.
node bench.js # compare JSON.stringify vs encode byte size and time

Expected result: Payload size and serialization time both drop measurably.

How to confirm it worked

Run the commands above and confirm every expected result in order. If a step does not produce the stated output, use the troubleshooting notes before continuing. A passing run shows benchmarks show smaller payloads and lower serialization CPU with identical decoded values.

Troubleshooting

Schema evolution breaks decoders — Version cached values and keep a JSON fallback during migration.

Debugging harder — Provide a CLI or inspector that decodes MessagePack for support.

Limitations

  • Binary formats are less debuggable.
  • Both producer and consumer must agree on the format.
  • Gains vary with data shape.