端口复用,通过互斥锁来避免惊群效应
为什么不采用多线程模型管理连接
- 无状态服务,无需共享进程内存
- 采用独立的进程,可以让互相之间不会影响。一个进程异常崩溃,其他进程的服务不会中断,提升了架构的可靠性。
- 进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。
为什么不采用多线程处理逻辑业务?
- 进程数已经等于核心数,再新建线程处理任务,只会抢占现有进程,增加切换代价。
- 作为接入层,基本上都是数据转发业务,网络 IO 任务的等待耗时部分,已经被处理为非阻塞/全异步/事件驱动模式,在没有更多 CPU 的情况下,再利用多线程处理,意义不大。
- 并且如果进程中有阻塞的处理逻辑,应该由各个业务进行解决,比如 openResty 中利用了 Lua 协程,对阻塞业务进行了优化。