消息队列的原理与实战| 青训营笔记

95 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

一、本堂课重点内容

  • 消息队列的前世今生
  • 消息队列-Kafka
  • 消息队列-BMQ
  • 消息队列-RocketMQ
  • 最佳实践

二、详细知识点介绍

1. 消息队列前世今生

  • TIB
    • 1985,用于高盛,用于解决金融交易。
  • IBM MQ
    • 1993,商业消息队列平台市场主要玩家
  • MSMQ
    • 1997,微软消息队列
  • JMS
    • 2001,试图通过提供公共Java API的方式,隐藏单独MQ产品供应商提供的实际接口,从而跨越了壁垒和解决了互通问题
  • AMQP/RabbitMQ
    • 2004,一套开放标准
  • Kafka
    • 2010,为了解决linkedin的数据管道问题
  • RocketMQ
    • 2011,满足阿里巴巴高频的在线交易场景
  • Pulsar
    • 2012,为了解决雅虎内部各个部门之间数据的协调

2. Kalfa

2.1 使用场景

可概括为业务日志、用户行为数据、Metrics数据(搜索服务、直播服务、订单服务、支付服务)

2.2 使用流程

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

2.3 基本概念

  • Topic:逻辑队列,不同Topic可以建立不同的Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic
  • Producer:生产者,负责将业务消息发送到Topic中
  • Consumer:消费者,负责消费Topic中的消息
  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
  • Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
  • Replica:每个分片有多个Replica,Leader Replica将会从ISR(In-Sync Replicas)中选出
  • ZooKeeper:负责存储集群元信息,包括分区分配信息等

2.4 消息流程

Producer->Broke->Consumer

  • Producer
    • 批量发送,减少IO次数,从而加强发送能力
    • 数据压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法
  • Broker
    • 磁盘结构:移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道的时间成本
    • 顺序写,提高写入效率
    • 消息抓取:Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
  • Consumer
    • Partition在Consumer Group中的分配方案
    • 手动分配(Low Level):通过手动进行分配,哪一个Consumer消费哪一个Partition完全由业务决定。缺点是不能自动容灾、会导致机器启停问题。优点是比较快。
    • 自动分配(High Level):使用Coordinator自动分配。优点是不会存在机器启停问题,分配稳定。

2.5 缺点

  1. 数据复制问题,运维成本高
  2. 负载不均衡的场景解决方案复杂
  3. 没有自己的缓存,完全依赖Page Cache
  4. Controller和Coordinator和Broker(意思是controller和coordinator选的同一个broker)在同一进程中,大量IO造成性能下降,一旦broker挂了,影响controller和coordinator

3. BMQ

BMQ兼容Kafka协议,存算分离,支持云原生消息队列。 存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群。

具体操作KafkaBMQ
重启需要数据复制,分钟级重启重启后可直接对外服务,秒级完成
替换需要数据复制,分钟级替换,甚至天级别替换后可直接对外服务,秒级完成
扩容需要数据复制,分钟级扩容,甚至天级别扩容后可直接对外服务,秒级完成
缩容需要数据复制,分钟级缩容,甚至天级别缩容后可直接对外服务,秒级完成

4. RocketMQ

RocketMQ的高级特性:事务消息、重试和死信队列,延迟队列。

低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广。

使用场景:电商业务线、业务峰值时刻。

与Kafka对比:

名称KafkaRocketMQ
标签Tag
分区PartitionConsumerQueue
生产者集群Producer Group
集群控制器ControllerNameserver

三、个人总结

本节课介绍了消息队列的前世今生、kafka使用场景,业务日志、用户行为数据、Metrics 数据展开,介绍一条消息从生产到消费的处理流程,以及RocketMQ 的使用场景,同时将 RocketMQ 和 Kafka 进行对比,剖析其特征。

四、引用参考