diff --git a/journals/2025_06_18.md b/journals/2025_06_18.md index 344def3..eb02bbb 100644 --- a/journals/2025_06_18.md +++ b/journals/2025_06_18.md @@ -1,2 +1,3 @@ -- [[长时间阅读就是大脑的马拉松]] -- [[ShardingSphere]] \ No newline at end of file +- [[ShardingSphere]] +- [[消息队列]] +- [[Netty]] \ No newline at end of file diff --git a/pages/Kafka.md b/pages/Kafka.md new file mode 100644 index 0000000..abd5726 --- /dev/null +++ b/pages/Kafka.md @@ -0,0 +1,30 @@ +- 高吞吐量:每秒10几万 +- 高扩展性 +- 持久性 +- 容错性 +- 高并发 +- 为什么快? + - 顺序写入磁盘,减少磁盘寻址 + - 支持批量发送消息,积累到一定量再发送,减少网络开销 + - 零拷贝,直接从磁盘发送到网络套接字 + - 支持对消息压缩 +- pull模型 + - 消费者自己记录消费状态,每个消费者独立地顺序拉取分区数据 + - 消费者可以按照任意顺序消费消息,可以重置到旧的偏移量处理之前的消息 + - 支持消费者组,可以多个消费者通通消费一个topic + - 如果没有数据,消费使会出传入一个时长参数timeout +- 消费顺序 + - 生产者发送消息到指定分区,通过自定义分区器实现,为消息指定相同的key + - 消费者单线程消费同一分区 + - 对消息进行编号或者添加时间戳 +- 消息积压 + - 增加消费者,但是不能超过分区数量 + - 增加主题分区数量,重新平衡消费者 +- **分区数决定了同组消费者个数的上限** +- 高可用 + - 多个broker组成一个集群 + - 创建一个topic,然后划分为多个partitiion,各自存放一部分数据,放在不同的broker上面 +- 消息确认机制 + - ack=0,最不可靠,发送后无法知道是否到达broker + - ack=1,等待leader确认消息,但是不等待副本的确认 + - ack=-1,最可靠,等待所有副本同步完成才确认 \ No newline at end of file diff --git a/pages/Netty.md b/pages/Netty.md new file mode 100644 index 0000000..52484de --- /dev/null +++ b/pages/Netty.md @@ -0,0 +1,38 @@ +- Java网络通信底层框架 +- 通过NIO多路复用机制实现单线程万个连接 +- 封装Selector/Channel/Buffer,提供Pipeline责任链式API +- 自带TCP粘包拆包、心跳检测、内存池 +- 性能 + - 基于NIO封装实现I/O多路复用 + - Linux下使用epoll模型 + - 使用零拷贝和堆外内存避免拷贝 + - 利用对象池进行对象复用 +- 扩展 + - 基于事件驱动模型,将业务剥离为ChannelHandler,利用责任链可以根据不同业务扩展 +- 线程处理 + - 非耗时操作 + - EventLoop直接处理 + - 阻塞操作 + - 提交到业务线程池 +- I/O模型 + - 同步阻塞BIO + - 同步非阻塞NIO + - IO多路复用 + - 只使用一个select注册需要监听的连接,并管理连接数据是否就绪,已经就绪就通知别的线程用read来读取数据 + - 信号驱动IO + - 异步IO + - 调用aio_read,然后其他操作由内核完成,内核完成后调用回调 +- 使用场景 + - 框架底层通信 + - 游戏行业处理大量并发连接 + - 通讯系统 + - 物联网,处理内设备数据的收集与下发 +- Reactor线程模型 + - 单Reactor单线程模型 + - 单Reactor多线程模型 + - 主从Reactor多线程模型 +- 零拷贝 + - FileRegion,调用操作系统的sendfile函数,直接将文件数据从文件系统发送到网络接口,无须经过用户态内存 + - CompositeByteBuffer,组合缓冲区,将多个ByteBuffer组合成一个逻辑上的缓冲区,不需要内存拷贝 + - ByteBuf,通过堆外内存避免到JVM内存拷贝,支持将字节数组包装为ByteBuf,也可以通过slice将ByteBuf拆分为小ByteBuf + - 内存映射文件,将文件映射到内存中,直接进行读取和写入,避免内存拷贝 \ No newline at end of file diff --git a/pages/消息队列.md b/pages/消息队列.md new file mode 100644 index 0000000..434b0b1 --- /dev/null +++ b/pages/消息队列.md @@ -0,0 +1,29 @@ +- 消息丢失 + - 生产阶段 + - 发送消息后,只要能正常收到ack确认响应,就表示发送成功,否则进行消息重发 + - 存储 + - 写入多个节点,保证多个副本 + - 消费 + - 消费者接受消息+处理消息之后才回复ack +- 消息可靠性 + - 消息持久化,保存到硬盘 + - 消息确认机制 + - 消息重试策略,多次失败后将消息发送到死信队列 +- 消息顺序性 + - 金融消费,用户转账 + - kafka通过将消息划分到同一个分区中保证分区内消费的有序 + - 通过单线程或串行化策略保证消息按照正确顺序消费 +- 幂等写 + - 唯一标识,每个请求全局唯一UUID + - 数据库事务+乐观锁 + - 数据库唯一约束 + - 分布式锁 + - 消息去重 +- 消息积压 + - 优化消费逻辑,批量处理消息 + - 临时紧急扩容 + - 增加consumer + - 新建topic,使用临时分发数据的consumer分发积压的数据 +- 保证数据一致性/事务消息 + - 发送待发送的消息,生产者继续执行业务,成功就发送消息给消费者,失败就删除消息 +- [[Kafka]] \ No newline at end of file