侵入式服务与非侵入式程序结构
通常情况下,对于一个后端服务器的结构是没法固定下来的,因为我们不知道服务的技术框架上面会搭建什么业务,结构随着业务的不同而不同。如果是这样的话,我们是不是就没法讨论和抽象出一个可以适用于大多数业务场景的服务器程序结构了呢?其实也未必,大多数服务会与其他服务或者客户端进行网络通信,那么这个服务一定包含网络通信模块。这样的话,网络通信模块将会是不同业务服务的通用部分。基于这一点,我们可以继续讨论。
假设网络通信框架结构一定的情况下,根据通信数据是否从网络框架中流入流出,我们将服务器的结构分为侵入式和非侵入式两种。
非侵入式结构
非侵入式更简单一点,我们先来讨论它。所谓非侵入式,指的是一个服务中所有的通信或业务数据都在网络通信框架内部流动,也就是说没有外部数据源注入网络通信框架或从网络通信框架中流出。举个例子,一个 IM 服务的服务器,通常情况下,无论是单聊消息还是群聊消息,其核心业务本身的数据流都是在网络通信框架内部流动的。单聊时,A 用户给 B 用户发送一条消息,实际上消息流是从 A 用户的连接对象传递到 B 用户的连接对象上,然后通过 B 连接对象的发送方法发送出去。群聊也是一样,从一个用户的连接,同时发给其他多个用户的连接对象。无论是哪种情况,这些连接对象都是网络通信框架的内部结构。
非侵入式服务结构
侵入式结构
如果有外部消息流入网络通信模块或从网络通信模块流出,那么相当于有外部消息"侵入"了网络通信结构中,我们把这种服务器结构称之为侵入式服务结构。
侵入式服务器的结构除了网络通信组件外,其他组件的结构设计可以多种多样。我们来看两种通用的结构:
结构一:业务线程(或者叫数据源线程)将数据处理后交给网络通信组件发送
结构二:网络解包后需要将任务交给专门的业务线程去处理,处理完后需要再次通过网络通信组件发出去
结构一其实是结构二的后半部分,因此我们来重点讨论下结构二。
我们曾介绍过 one thread one loop 思想下的每个网络线程的基本结构:
while