IO模型
- BIO 同步阻塞
- NIO 同步非阻塞
- AIO 异步非阻塞
NIO核心组件
- Selector
// selectedKeys集合
selector.selectedKeys()
// 是否读就绪事件
SelectionKey.isReadable();
// 服务端注册到选择器,指定监听事件 OP_ACCEPT 客户端连接事件
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT)
- Channel
- Buffer,本质上是一个可读写数据的内存块
ByteBuffer allocate = ByteBuffer.allocate(10);
// 当前索引位置,可以添加的位置,起始位置0
allocate.position();
// 当前索引位置改为1
allocate.position(1);
// 最多能操作到哪个位置索引
allocate.limit();
// 还有多少个可以操作的个数
allocate.remaining();
// 切换读模式,起始位置0,结束位置 limit(),
// 结束位置是原来position()位置
allocate.flip();
// 切换写模式,起始位置0,结束位置 capacity(),覆盖原来的值
allocate.clear();
// 位置开始设置为0
allocate.rewind();
// 写入数据
allocate.put("abc".getBytes());
Reactor模式
使用IO 复用监听事件,收到事件分发给某个线程
- 单Reactor 单线程
- 单Reactor 多线程
- 主从Reactor 多线程
Netty
ChannelPipeline
ChannelHandler的集合,负责处理和拦截 inbound outbound的事件和操作,贯穿Netty的责任链
ChannelHandlerContext
事件处理器上下文对象,Pipline链中的实际处理节点。ChannelHandlerContext包含一个ChannelHandler,也绑定了ChannelPipeline和Channel的信息
粘包和拆包
TCP流,没有界限的一串数据。TCP根据缓冲区的对包进行划分。
- 拆包 ,一个完整的包可能会被TCP拆分成多个包发送,
- 粘包,也可能把多个小的包封装成一个大的数据包发送。
解决方案:
- 消息长度固定,读取定长的报文,就认为读到了一条完整消息 FixedLengthFrameDecoder
- 换行符作为消息结束符 LineBasedFrameDecoder
- 特殊的分隔符作为消息的结束标志 DelimiterBasedFrameDecoder
- 消息头中定义长度字段标识消息的总长度 LengthFieldBasedFrameDecoder
分布式理论
分布式系统
一个业务拆分成多个子业务,分布在不同的节点,构成分布式系统
CAP定理
- C 一致性,数据的强一致性,所有节点访问的都是同一份最新的数据副本
- A 可用性,系统中非故障节点收到的每个请求都必须有响应
- P 分区容错性, 遇到网络分区故障,仍然能对外提供服务
分布式一致性协议
NWR协议
N:在分布式存储系统中,有多少份备份数据
W:代表一次成功的更新操作要求至少有w份数据写入成功
R: 代表一次成功的读数据操作要求至少有R份数据成功读取
满足W+R>N,对于客户端就是强一致性的
Raft协议
引入主节点,通过竞选确定主节点。
节点类型:Follower、Candidate 和 Leader
Lease机制
租约机制,维护分布式系统数据一致性 的一种常用工具。
- Lease是颁发者对一段时间内数据一致性的承诺
- 颁发者发出Lease后,不管是否被接收,只要Lease不过期,颁发者都会按照协议遵守承诺
- Lease的持有者只能在Lease的有效期内使用承诺,一旦Lease超时,持有者需要放弃执行,重新申 请Lease。
分布式系统设计策略
- 心跳检测
- 高可用
- 容错性
- 负载均衡
网友评论