首先我说的设计是指的最大限度提高单机单节点的服务吞吐和并发。
我们设计一个服务器程序,自用户层->业务实现层->操作系统层,我们要明确的前提或限制有如下:
1 服务程序要保证高吞吐量!服务程序要为用户服务,应该尽可能多的接收和处理用户的业务处理请求
2 对于每个业务处理,业务层面的等待和阻塞不可以避免!(因为业务上获取任何资源数据都是需要时间的,比如数据库访问)
3 在操作系统层面阻塞线程和多开线程的开销很大!(占用内存资源和调度切换计算资源)
通过上面的前提,我们可以得到结论:
服务和业务层面的高吞吐、高并发不能通过直接使用操作系统层面的线程来保证!
但是我们的业务实现根本上还是必须要使用操作系统线程来实现的,我们只有在设计服务业务实现代码的时候,避免阻塞操作系统线程即可!这就是我们的本质思路和解决方案!
具体解决方案分析:
对于上面我说的前提条件1,即业务层面的业务阻塞不可避免,那么我们只要在设计服务的时候做一个“中间抽象层”阻断业务阻塞和操作系统线程阻塞的直接关联就可以了!
如何实现这个中间层?
方案1:最直观的方案,业务代码中设计一套子调度中间层,这个中间层
1 对操作系统层,只用有限个线程,而且绝对不会阻塞操作系统线程
2 对业务层,提供可以被业务阻塞的执行单位封装
3 实现对业务层可阻塞执行单位到操作系统线程的对接和调度,至少应实现遇到执行单位阻塞的时候切换到其他执行单位的功能!
方案2:业务异步和事件化
1 对操作系统层,也是只用有限个线程,而且绝对不会阻塞操作系统线程
2 对业务层,进行业务拆分:大业务拆分成一个个完全非阻塞的业务片段,业务片段之间的执行时间差就是业务的阻塞时间,我们通过额外的线程轮询监听和产生事件,事件用来耦合一个大业务的多个非阻塞小业务片段,这样就实现了业务层面的阻塞和操作系统线程层面的非阻塞!
(完)