《AI时代的架构设计100讲》
第8讲:让AI慎用进程内缓存
AI时代,架构设计变了吗?架构师的职责变了吗?准备新起一个AI时代的架构设计系列,初定100讲,每周更新2-3讲,这是第8讲。
缓存簇前三讲,聊了缓存的操作模式、一致性补偿、并发性能——都是"怎么用对"。这一讲反过来,聊一个"慎用"的东西:进程内缓存——以及,怎么防止AI帮我们滥用。老规矩,先搞清楚方案本身,再说spec的事。
什么是进程内缓存?
大部分时候,大家会用redis这类进程外缓存服务。有时候,也会使用进程内缓存。将一些数据缓存在站点,或者服务的进程内,这就是进程内缓存。
进程内缓存的实现载体,最简单的,可以是一个带锁的Map。又或者,可以使用第三方库,例如:leveldb。
进程内缓存有什么好处?
答:与没有缓存相比,进程内缓存的好处是:数据读取不再需要访问后端,例如数据库。一来节省了内网带宽,二来响应时延会更低。
进程内缓存有什么缺点?
答:统一缓存服务虽然多一次网络交互,但仍是统一存储。
如上图,站点和服务中的多个节点访问统一的缓存服务,数据统一存储,容易保证数据的一致性。
而进程内缓存,如上图,如果数据缓存在站点和服务的多个节点内,数据存了多份,一致性比较难保障。
如何保证进程内缓存的数据一致性?
答:保障进程内缓存一致性,有几种方案。
第一种方案,可以通过单节点通知其他节点。如上图:写请求发生在server1,在修改完自己内存数据与数据库中的数据之后,可以主动通知其他server节点,也修改内存的数据。
这种方案的缺点是:同一功能的一个集群的多个节点,相互耦合在一起,特别是节点较多时,网状连接关系极其复杂。
第二种方案,可以通过MQ通知其他节点。如上图:写请求发生在server1,在修改完自己内存数据与数据库中的数据之后,给MQ发布数据变化通知,其他server节点订阅MQ消息,也修改内存数据。
这种方案虽然解除了节点之间的耦合,但引入了MQ,使得系统更加复杂。
上面两种方案,节点数量越多,数据冗余份数越多,数据同时更新的原子性越难保证,一致性也就越难保证。
为什么不能频繁使用进程内缓存?
答:分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。
可以看到,站点与服务的进程内缓存,实际上违背了分层架构设计的无状态准则,故一般不推荐使用。
什么时候可以使用进程内缓存?
答:以下情况,可以考虑使用进程内缓存。
1. 只读数据,可以考虑在进程启动时加载到内存。
2. 极其高并发、透传后端压力极大的场景,可以考虑使用进程内缓存。例如秒杀业务,并发量极高,需要站点层挡住流量,可以使用进程内缓存。
3. 一定程度上允许数据不一致的业务。例如一些计数场景、运营场景,页面对数据一致性要求较低,可以考虑使用进程内页面缓存。
再次强调,进程内缓存的适用场景并不如redis/mc广泛,不要为了炫技而使用。更多的时候,还是老老实实使用redis/mc吧。
那么问题来了,到了AI时代,这条"慎用"的红线,spec该怎么写?
先说结论:思路没变,执行者变了。
没变的部分:无状态准则没变——进程内缓存,默认禁止、例外放行。这个判断,和是不是AI写代码,没有关系。
变了的部分:代码由AI写,而AI特别喜欢自作主张加本地缓存"优化性能"——它看到频繁访问的数据,会觉得"放个本地Map更快",顺手就加了。不写死,它一定会这么干。我们干的活,是把"默认禁止"写进spec。
一份进程内缓存的准入spec,至少写清四件事:
1. 模式声明;
2. 红线约束;
3. 异常与降级;
4. 验收标准;
spec示例(md格式),可以直接复制:
# 进程内缓存使用spec
## 模式
1. 默认使用redis;
2. 进程内缓存,仅闲鱼以下三种场景:
- 只读数据,进程启动时加载到内存
- 极其高并发、透传后端压力极大
- 允许一定程度数据不一致
## 红线
1. 禁止未经声明,擅自引入进程内缓存;
2. 站点/服务层必须保持无状态,禁止以"性能优化"为由破坏该准则;
3. 使用进程内缓存,必须同时给出一致性方案。
## 异常与降级
1. 一致性方案按例外场景选择:节点通知 / MQ通知 / TTL容忍;
2. cache miss时,回源数据库读取。
## 验收标准
1. 任意加节点水平扩展;
2. 新增进程内缓存代码,必须能追溯到本spec中的例外声明;
3. 一致性方案有日志,可查询、可统计。
这四件事写清楚,AI想帮我们"滥用"进程内缓存,就没那么容易了。
总结
1. 进程内缓存省带宽、低时延,但数据存多份,一致性难保障;
2. 一致性方案有两种:单节点通知(耦合网状)、MQ通知(引入MQ更复杂);节点越多,越难保证;
3. 进程内缓存违背无状态准则,默认不用;三种例外:只读启动加载、极高峰挡流量、允许不一致;
4. AI时代,把"默认禁止"写进spec:例外必须显式声明,防AI自作主张加本地缓存。
知其然,知其所以然。
思路比结论更重要。
前篇简介:
今晚直播,欢迎预约:



