0%

论设计中的单进程和多进程

一、前言

产品开发阶段,分为两种类型的设计。一种是进程单实例的开发,如一个客户端进程,所有业务用线程或协程进行高性能处理。一种是多进程开发,如现在微服务架构里面可以动态扩容,或nginx里面的多个worker实例。在不同场景下有不同的选择,但是总结起来两种模式下设计思想各不相同。在此整理一下来作为思想指导,防止开发过程中没有考虑到这些造成思维盲区。

二、对比

单进程多进程
性能提升纵向扩容,提升机器性能纵向&横向,提升机器性能或增加进程(扩容pod或扩容机器)
缓存进程级缓存几乎不能使用进程级缓存,需要第三方缓存机制如redis
负载均衡基本无需考虑依赖外部负载实现负载均衡,防止某个进程达到性能瓶颈
并发处理进程内部考虑加锁处理依赖第三方的锁机制,如redis的分布式锁

三、设计思想

1. 单例

1.1. 单进程思想

  • 业务模块有自己的生命周期,跟随进程启动和销毁,销毁则相关业务销毁
  • 内部持有配置、状态等,对外暴露的接口调用顺序有依赖要求,每个接口可能会影响到内部状态。
  • 并发场景下,业务模块自己加锁即可,可以保证外部调用不会存在并发问题

1.2. 多进程思想

  • 每个业务模块都是无状态的,生命周期并不随业务走,销毁业务还在继续
  • 每个请求进来重新实例化一个业务模块,所有内部数据来自于第三方数据(如redis、mysql)
  • 天然需要考虑并发场景下,数据并发更新的问题,本身业务自己的代码就可能会并发同时调用