上周写了一些 Thrift 的代码学习笔记。Thrift 作为大家常用的 RPC 服务端,它的服务端设计感觉还是挺科学的。

最常用的 Thrift Server

用得最多的 Thrift Server,应该就是 TThreadedSelectorServer

这个 Server 应该可以说是一个 Half-Sync/Half-Async(半异步-半同步)的 Server。

TThreadedSelectorServer的线程模型

下面是线程模型:

TThreadedSelectorServer的线程模型

程序里面有3个模块:

  • AcceptThread 负责 Accept 客户端请求。
  • SelectorThread 负责处理客户请求的读写。
  • 线程池 负责业务代码的执行

Server 启动的时候,开启 AcceptThread。当 AcceptThread accept 到客户端请求,再把请求路由到几个已经启动好的 SelectorThread 中的一个里面。

一个 SelectorThread 要负责处理多个客户端连接。SelectorThread 里面还是使用 NIO 的 Selector。会一直 select() IO事件,再依次处理这些 IO 的读写。

要是请求信息读取完毕,则把请求信息封装好,发到线程池执行业务逻辑。

业务逻辑处理完之后,再把返回信息通过 SelectorThread 写回给客户。

优缺点

这样子 AcceptThread 变成了只处理客户端请求的 accept 工作,避免了一个 AcceptThread 中的 selector 在处理读写时,客户端出现连接不上的问题。

一个 SelectorThread 处理多个客户端连接,而且 SelectorThread 处理这些连接的过程中是单线程的。避免了多线程编程的复杂。

缺点没想到。。。