一、前言
产品开发阶段,分为两种类型的设计。一种是进程单实例的开发,如一个客户端进程,所有业务用线程或协程进行高性能处理。一种是多进程开发,如现在微服务架构里面可以动态扩容,或nginx里面的多个worker实例。在不同场景下有不同的选择,但是总结起来两种模式下设计思想各不相同。在此整理一下来作为思想指导,防止开发过程中没有考虑到这些造成思维盲区。
二、对比
| 单进程 | 多进程 | |
|---|---|---|
| 性能提升 | 纵向扩容,提升机器性能 | 纵向&横向,提升机器性能或增加进程(扩容pod或扩容机器) |
| 缓存 | 进程级缓存 | 几乎不能使用进程级缓存,需要第三方缓存机制如redis |
| 负载均衡 | 基本无需考虑 | 依赖外部负载实现负载均衡,防止某个进程达到性能瓶颈 |
| 并发处理 | 进程内部考虑加锁处理 | 依赖第三方的锁机制,如redis的分布式锁 |
三、设计思想
1. 单例
1.1. 单进程思想
- 业务模块有自己的生命周期,跟随进程启动和销毁,销毁则相关业务销毁
- 内部持有配置、状态等,对外暴露的接口调用顺序有依赖要求,每个接口可能会影响到内部状态。
- 并发场景下,业务模块自己加锁即可,可以保证外部调用不会存在并发问题
1.2. 多进程思想
- 每个业务模块都是无状态的,生命周期并不随业务走,销毁业务还在继续
- 每个请求进来重新实例化一个业务模块,所有内部数据来自于第三方数据(如redis、mysql)
- 天然需要考虑并发场景下,数据并发更新的问题,本身业务自己的代码就可能会并发同时调用

