对线程池的读写保证线程安全
最后,网络模块要实现的是等待服务端返回的结果。由于网络模块同一时间会接收大量客户端网络请求,所以,我们可以创建一个单独的线程,每隔一定时间轮询是否有服务端的返回。
服务端对于服务端来说,我们最关心的是性能问题。因为大量的客户端请求最终都会汇总到服务端一个节点来处理。所以最原始的单线程+while循环的方式肯定满足不了性能要求。所以比较最容易想到的改进点是多线程,虽然在一定程度上能解决第一种方式带来的问题,但这种方式也有很大的缺点:频繁创建线程成本比较大,并且线程之间的切换也需要一定的开销,当线程数过多时显然会降低服务端的性能。目前比较常用的解决方案是Reactor模式,Reactor模式也分为单线程Reactor、多线程Reactor和多Reactor。这几种的区别在书里都有具体说明,这里我就不再介绍了。Reactor模式的优势按照我自己的理解就四个字——各司其职。Manis 中使用的是多Reactor模式,设计图如下:
简单介绍一下图中几个线程的功能Listener: 接收客户端的连接请求,也可以叫做 Acceptor,封装连接请求
Readr: 多线程并行地读取客户端请求,进行反序列化和解析操作
Handler: 多线程并行地读取调用请求,解析调用方法并执行调用
Responder: 读取响应结果,发送给客户端
够各司其职吧。那它们之间怎么联系呢?从图上可以看到是消息队列,消息队列可以很好地实现组件间的解耦。
虽然服务端的职责也比较明确、清晰,但涉及的内容一点不少,包括注册不同的序列化方式,解析并调用相应的请求。最关键的是服务端线程是最多的,并且需要线程之间需要高度协调的,所以对并发编程的要求也更高,这块书中也有重点讲解。
最后我们看看Manis中核心组件的时序图
avatar由于 Manis 在设计上是足够优秀的,所以开发的时候这三个模块可以并行进行。有点像近几年web开发比较火的前后端分离架构,只要各个模块把协议定义好了后,开发就可以并行进行而不需要依赖彼此。至此,Manis 的核心技术就介绍完了,当然这只是冰山一角,毕竟 4600 行代码。
如何获得本书关注公众号 渡码 回复关键字 manis,可获取电子书+源码+读者交流群。
目录 代码结构 本书特色在讲解相册内容同时,大部分章节都加入了课外拓展,针对每一节涉及的基础知识,如:设计模式、序列化/反序列化基础、单例测试、源码分析、并发编程以及Hadoop源码分析等内容都有拓展讲解。力求让零基础的朋友也能跟上本书节奏,从0到1独立完成一个项目。
希望你学完本书后不只学会了某项技术,而是提高了设计实现整个系统的能力。
适宜人群Java工程师
想独立做一个完整项目的朋友
Hadoop 初学者