目录
4.2.4 FileChannel
1.可伸缩的网络服务
经典BIO网络服务端代码设计 thread-per-request,每个处理都可以在独立线程中执行。
存在着很多问题,为了更好的可伸缩对其进行优化。
1.1 可伸缩的目标
- 负载增加时(更多客户端连接)的优雅退化
- 性能随着资源(CPU、内存、磁盘、带宽)不断提高
- 同时满足可用性和性能目标:低时延、满足高峰需求、服务质量可调控
1.2 解决方案
分而治之,总体服务分为以上5个处理阶段,网络服务基础处理结构
|
分:将整个处理过程分成几个子任务,每个任务执行一个非阻塞的操作
治: 借助JavaNIO机制,IO事件(select)触发分发给自任务handler非阻塞地读写数据。NIO中select方法是阻塞的,而read、write读写是非阻塞的,由于多路复用,多个通道多种事件均可触发select返回,大大减少了阻塞的事件,充分利用了CPU资源。
2.事件驱动设计
事件驱动设计依赖Java NIO机制
更高效 | 资源少(不需要每个客户端都创建线程) 低负载 更少的线程切换 |
难实现 | 划分非阻塞操作 需跟踪服务逻辑状态 |
3.Reactor模式
Reactor顾名思义,反应,当IO事件发生时程序做出反应,包含两种角色:Reactor、handler(包括acceptor和IOhandler)
1.Reactor响应IO事件,主要调用select阻塞方法查找事件,分发事件给对应handler处理
2.handler执行非阻塞操作(类似于事件监听器),通常根据事件类型分为Acceptor和IOHandler,Acceptor调用accept()非阻塞方法接收连接、IOHandler调用read()和write()读写数据
两个角色的协作&#