消息队列(MQ)
- Message Queue,保存消息的容器,本质上是个队列,需要支持高吞吐,高并发,高可用
kafka
使用场景:业务日志、用户行为数据、Metrics 使用步骤
- 创建集群
- 新增topic,逻辑队列
- 生产者
- 消费者
基本概念
- topic,逻辑队列,每个逻辑队列中有多个partition,存放真正的消息
- offset,消息在partition内的相对位置,作为唯一ID
- replica,每个partition有多个副本,保证容灾
kafka架构
一个消息的自述
思考一下,假如上述一个过程消耗100ms,那么yis也就智能发10条消息,这显然效率很低,呢么kafka是怎么处理的
此时可以批量发送减少IO次数,那么此时如果消息两足够大,网络带宽不够用,怎么解决?
kafka会用压缩算法减少消息大小。
Broker消息文件结构
总结
发送端
- 通过Batch,批量发送消息,减少IO次数,加强发送能力
- 通过压缩,减少消息大小
- 顺序写入,提高写入效率,减少寻道时间 消费端
- 内部通过二分查找目标消息文件
- 通过零拷贝,传输数据,通过DMA拷贝,从磁盘拷贝出来,再通过SG-DMA直接拷贝到网卡,发送给消费者进程
- partition的分配
缺点
- 每一个broker都有topic的分区,需要保持同步
- 负载不均衡,某个partition过多,迁移消耗大量IO资源
- 没有自己的缓存,完全依赖PageCache
- Controller和Coordinator和Broker在统一进程中,大量IO会造成性能下降
Kafka 的应用场景
-
日志聚合:可收集各种服务的日志写入kafka的消息队列进行存储
-
消息系统:广泛用于消息中间件
-
系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作
-
流量削峰:一般用于秒杀或抢购活动中,来缓冲网站短时间内高流量带来的压力
-
异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候再进行处理