消息队列 | 青训营笔记

103 阅读2分钟

应用场景

  • 存储系统临时崩溃-->解耦
  • 服务器短时处理能力有限-->削峰
  • 链路耗时长尾-->异步
  • 日志如何处理-->日志系统

消息队列(MQ)

本质上是保存消息的一个容器(队列),支持高吞吐、高并发、高可用

19851993199720012004201020112012
金融/新闻机构IBM MQ微软AMQP协议Linked阿里Yahoo
TIBWebSphereMSMQJMSRabbitMQKafkaRocketMQPulsar
  • Kafka:分布式、分区、多副本日志提升服务,高吞吐场景下发挥出色
  • RocketMQ: 低延迟、强一致、高性能、高可靠、万亿容量、灵活扩展,在实时场景运用较广
  • Pulsar: 下一代云原生分布式信息流平台,消息、存储、轻量化、函数式计算为一体,采用存算分离架构
  • BMQ: 与Pulsar相似,存算分离,逐步替换Kafka

Kafka

简介

graph LR
创建集群 --> 新增Topic
新增Topic --> 编写生产者逻辑
新增Topic-->编写消费者逻辑

image.png

  • offset:消息在Partition中的相对位置,严格递增
  • Replica:每个分片有多个Replica作为备份用来容灾,Leader Replica会从中选出
  • Broker表示kafka节点
  • ZooKeeper用来存储集群的元数据信息

image.png

从不同视角优化

  • Producer
    • 批量发送,增强发送能力
    • 数据压缩,节省带宽
  • Broker
    • 顺序写(符合磁盘物理结构)
    • 搜索
      • 二分法加多级offset分层索引
      • 时间戳快速定位offset,而后找到最终数据
    • 零拷贝
      • sendfile
      • mmap
  • Consumer
    • 如何解决Partition在consumer Group的分配问题
      • 手动,不灵活
      • Rebalance:自动,更均衡,且易扩展(引入Coordinator)

不足

  • 不同节点之间副本需要拷贝,有消耗
  • 重启,数据同步耗时
  • 替换、扩容、缩容麻烦
  • 负载不均衡,解决方案复杂
  • 没有自己缓存,依赖Page Cache
  • Controller Coordinator Broker在统一进程中,大量IO性能下降

BMQ

image.png

  • 兼容Kafka协议,存算分离,云原生的消息队列
  • 运维效率更高,更方便

image.png

  • HDFS写文件流程
    • 随机选择一定数量的DataNode写入
  • 高级特性
    • 只支持泳道
    • Mirror
    • Databus
    • Index
    • Parquet

RocketMq

  • 支持事务
  • 支持延迟发送
  • 支持延迟消息
  • 支持处理失败
  • 消费重试和死信队列