Architecture Expert
CQRS — Separating Reads and Writes¶
CQRSArchitecturePatterns 3 min read
Command Query Responsibility Segregation for better scalability. Implementation with practical examples.
What is CQRS?¶
CQRS separates writes (Command) from reads (Query). Reads need fast queries over denormalized data, writes need validation and consistency.
Example¶
// Command — write
class OrderCommandHandler {
async createOrder(cmd) {
const order = new Order(cmd.customerId, cmd.items);
await this.orderRepo.save(order);
await this.eventBus.publish('OrderCreated', { orderId: order.id, total: order.total });
}
}
// Query — read from denormalized view
class OrderQueryHandler {
async getOrderSummary(orderId) {
return this.readDb.query('SELECT * FROM order_views WHERE id = $1', [orderId]);
}
}
When to Use¶
- Yes: High read vs write ratio (90:10)
- Yes: Complex queries across multiple aggregates
- No: Simple CRUD
- No: Strong consistency is critical
Summary¶
CQRS is powerful but increases complexity. Use it where read and write requirements are significantly different.
Need Help with Implementation?¶
Our team has experience designing and implementing modern architectures. We’re happy to help.