深入消息队列 | 青训营

87 阅读2分钟

消息队列(MQ)

  • Message Queue,保存消息的容器,本质上是个队列,需要支持高吞吐,高并发,高可用

kafka

使用场景:业务日志、用户行为数据、Metrics 使用步骤

  1. 创建集群
  2. 新增topic,逻辑队列
  3. 生产者
  4. 消费者

image.png

基本概念

  • topic,逻辑队列,每个逻辑队列中有多个partition,存放真正的消息
  • offset,消息在partition内的相对位置,作为唯一ID
  • replica,每个partition有多个副本,保证容灾

image.png

kafka架构

image.png

一个消息的自述

image.png 思考一下,假如上述一个过程消耗100ms,那么yis也就智能发10条消息,这显然效率很低,呢么kafka是怎么处理的

image.png 此时可以批量发送减少IO次数,那么此时如果消息两足够大,网络带宽不够用,怎么解决?

image.png kafka会用压缩算法减少消息大小。

Broker消息文件结构

image.png

总结

发送端

  • 通过Batch,批量发送消息,减少IO次数,加强发送能力
  • 通过压缩,减少消息大小
  • 顺序写入,提高写入效率,减少寻道时间 消费端
  • 内部通过二分查找目标消息文件
  • 通过零拷贝,传输数据,通过DMA拷贝,从磁盘拷贝出来,再通过SG-DMA直接拷贝到网卡,发送给消费者进程
  • partition的分配

缺点

  • 每一个broker都有topic的分区,需要保持同步
  • 负载不均衡,某个partition过多,迁移消耗大量IO资源
  • 没有自己的缓存,完全依赖PageCache
  • Controller和Coordinator和Broker在统一进程中,大量IO会造成性能下降

Kafka 的应用场景

  1. 日志聚合:可收集各种服务的日志写入kafka的消息队列进行存储

  2. 消息系统:广泛用于消息中间件

  3. 系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作

  4. 流量削峰:一般用于秒杀或抢购活动中,来缓冲网站短时间内高流量带来的压力

  5. 异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候再进行处理