什么是 CQRS?
CQRS(Command Query Responsibility Segregation)是一种架构模式,将“写操作”和“读操作”完全分离,从而优化系统性能与扩展能力。
核心思想
Command(写)
负责数据变更(Create / Update / Delete)
Query(读)
负责数据查询(Read Only)
为什么需要 CQRS?
问题背景
读多写少
查询压力远大于写入
复杂查询影响写库
JOIN / 聚合拖慢系统
扩展困难
无法单独扩展读能力
性能瓶颈
写库被查询拖慢
CQRS + Prisma 架构
在 Prisma 中实现 CQRS,通常采用双 Prisma Client 或读写数据库分离策略。
架构结构
Command Service
写操作(主库)
Query Service
读操作(从库 / 缓存)
Event Layer
数据同步机制
写模型(Command)
write.service.ts
typescript
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export class WriteService {
async createUser(data: { name: string; email: string }) {
return prisma.user.create({ data });
}
async updateUser(id: number, data: any) {
return prisma.user.update({
where: { id },
data
});
}
}读模型(Query)
read.service.ts
typescript
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export class ReadService {
async getUserList() {
return prisma.user.findMany({
select: {
id: true,
name: true,
email: true
}
});
}
async getUserDetail(id: number) {
return prisma.user.findUnique({
where: { id }
});
}
}读写分离数据库配置
.env
env
# 主库(写)
DATABASE_WRITE_URL="postgresql://user:pass@master:5432/db"
# 从库(读)
DATABASE_READ_URL="postgresql://user:pass@slave:5432/db"双 Prisma Client 实现
prisma.ts
typescript
import { PrismaClient as WriteClient } from '@prisma/client';
import { PrismaClient as ReadClient } from '@prisma/client';
export const prismaWrite = new WriteClient({
datasources: {
db: {
url: process.env.DATABASE_WRITE_URL
}
}
});
export const prismaRead = new ReadClient({
datasources: {
db: {
url: process.env.DATABASE_READ_URL
}
}
});缓存层(Redis)增强读能力
cache.ts
typescript
import Redis from 'ioredis';
import { prismaRead } from './prisma';
const redis = new Redis();
export async function getUser(id: number) {
const cache = await redis.get(`user:${id}`);
if (cache) return JSON.parse(cache);
const user = await prismaRead.user.findUnique({ where: { id } });
await redis.set(`user:${id}`, JSON.stringify(user), 'EX', 60);
return user;
}事件驱动同步
写操作完成后,通过事件(Event / Message Queue)同步到读库或缓存,保证最终一致性。
事件流
User Created
写库成功
Emit Event
发送消息
Update Cache
刷新 Redis
Sync Read DB
更新从库
架构优缺点
CQRS 权衡
优点
高并发、读写隔离、可扩展
缺点
架构复杂度增加
总结
CQRS + Prisma 是从“数据库操作”升级到“系统架构设计”的关键一步,适用于高并发、读多写少的大型系统。
终局总结
完整 Prisma 架构体系
基础层
CRUD / 查询 / 分页
进阶层
事务 / 性能优化
生产层
连接池 / 部署
架构层
SaaS / CQRS / 分库分表
相关笔记
在数字化一期,此笔记未产生更深相关的共鸣分枝。