有状态服务改造到无状态服务注意点
之前在摩西科技工作时候的小反思,现在总结一下。
为什么要做有状态服务 #
- 为了快速处理高并发的问题,我们把有竞争关系的请求都转发到同一个服务上(根据用户 id 或者竞争资源的 id 来转发),同时利用 Node.js 的单进程模型,在内存中操作数据,并异步保存。因为操作内存不会有 IO 操作,所以请求的处理顺序就是请求的到来顺序。
- 异步保存会存在数据丢失的可能性,不过我们的业务没有直接和钱相关的,所以暂时降低了可用性的考量。
为什么又要改造成无状态服务 #
- 我们希望可以接入 k8s,让 k8s 来管理日益增多的微服务,并提供动态扩缩容能力。
- k8s 也可以做有状态服务,但是会很复杂,所以我们决定改造成无状态服务。
改造注意点 #
- 之前把有竞争关系的请求到转发到同一个服务上,现在需要通过加锁或者让 Redis lua 脚本处理竞争问题。
- 为了解决在扩容之后对数据库的压力,通过 Redis 来缓存数据,一般我们使用 Cache Aside Pattern 来读取和更新数据,更新的时候先把数据保存到数据库,再把缓存失效。
- 在内存中缓存包含其他服务的数据一定要小心。