New Best Practices guide for Durable Objects
Cloudflare released a Rules of Durable Objects guide providing opinionated best practices for building effective Durable Objects applications, including design patterns, storage strategies, concurrency guidance, and testing patterns with modern tooling.
A new Rules of Durable Objects guide is now available, providing opinionated best practices for building effective Durable Objects applications. This guide covers design patterns, storage strategies, concurrency, and common anti-patterns to avoid.
Key guidance includes:
- Design around your "atom" of coordination — Create one Durable Object per logical unit (chat room, game session, user) instead of a global singleton that becomes a bottleneck.
- Use SQLite storage with RPC methods — SQLite-backed Durable Objects with typed RPC methods provide the best developer experience and performance.
- Understand input and output gates — Learn how Cloudflare's runtime prevents data races by default, how write coalescing works, and when to use
blockConcurrencyWhile(). - Leverage Hibernatable WebSockets — Reduce costs for real-time applications by allowing Durable Objects to sleep while maintaining WebSocket connections.
The testing documentation has also been updated with modern patterns using @cloudflare/vitest-pool-workers, including examples for testing SQLite storage, alarms, and direct instance access:
import { env, runDurableObjectAlarm } from "cloudflare:test";
import { it, expect } from "vitest";
it("can test Durable Objects with isolated storage", async () => {
const stub = env.COUNTER.getByName("test");
// Call RPC methods directly on the stub
await stub.increment();
expect(await stub.getCount()).toBe(1);
// Trigger alarms immediately without waiting
await runDurableObjectAlarm(stub);
});test/counter.test.tstsimport { env, runDurableObjectAlarm } from "cloudflare:test";
import { it, expect } from "vitest";
it("can test Durable Objects with isolated storage", async () => {
const stub = env.COUNTER.getByName("test");
// Call RPC methods directly on the stub
await stub.increment();
expect(await stub.getCount()).toBe(1);
// Trigger alarms immediately without waiting
await runDurableObjectAlarm(stub);
});Source: original entry ↗
More from Cloudflare
Follow Cloudflare to get its new changes in your feed and email digest.
Cloudflare One Client for macOS 2026.8.2100.0
GA release for macOS Cloudflare One Client with improved split tunnel handling that no longer briefly blocks traffic during reconnects, support for non-RFC 1918 local IPv4 networks, faster connects with lower memory use, and numerous reliability fixes across DNS, reauthentication, and client stability.
Cloudflare One Client for Windows 2026.8.2100.0
This GA release improves split tunnel reliability, adds support for non-RFC 1918 local networks, optimizes connection performance with faster reconnections and lower memory usage, and includes numerous bug fixes for DNS, registration, and network handling. The client now features a service recovery mechanism that automatically restarts on system unlock and better handles large hosts files without blocking traffic.
Cloudflare One Client for Linux 2026.8.2100.0
New GA release for Linux with improved split tunnel handling that no longer briefly blocks traffic during reconnects, support for non-RFC 1918 local IPv4 networks, faster tunnel reconnections, and lower memory usage. Includes numerous stability and reliability fixes for DNS, reconnection behavior, and crash issues.