消息队列 | 青训营笔记

110 阅读3分钟

什么是消息队列

消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用。

消息队列的发展历史

  • TIB:诞生于1985 年,服务于金融机构和新闻机构
  • IBM MQ/WebSphere:诞生于1993 年,商业消息队列平台市场主要玩家
  • MSMQ:微软发布于1997年
  • JMS:诞生于2001年本质上是一套JavaAPI
  • AMQP/RabbitMQ:规范发布于2004年,同年RabbitMQ面市
  • Kafka:2010年由Linked开源
  • RocketMQ:2011年阿里中间件团队自研
  • Pulsar:2012年诞生于Yahoo内部

业界消息队列对比

  • Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些 实时场景中运用较广
  • Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替 换掉对应的Kafka集群

消息队列-Kafka

使用场景

  • 搜索服务
  • 直播服务
  • 订单服务
  • 支付服务
  • 搜索、点赞、评论、收藏
如何使用 Kafka
  1. 创建集群
  2. 新增 Topic
  3. 编写生产者逻辑
  4. 编写消费者逻辑

基本概念

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

Kafka-问题总结

  • 运维成本高
  • 对于负载不均衡的场景,解决方案复杂
  • 没有自己的缓存,完全依赖Page Cache
  • Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降

消息队列- BMQ

兼容 Kafka 协议,存算分离,云原生消息
运维操作对比

具体操作 Kafka BMQ
重启 需要数据复制,分钟级重启 重启后可直接对外服务,秒级完成
替换 需要数据复制,分钟级替换,甚至天级别 替换后可直接对外服务,秒级完成
扩容 需要数据复制,分钟级扩容,甚至天级别 扩容后可直接对外服务,秒级完成
缩容 需要数据复制,分钟级缩容,甚至天级别 缩容后可直接对外服务,秒级完成
Databus
  • 简化消息队列客户端复杂度
  • 解耦业务与 Topic
  • 缓解集群压力,提高吞吐

Parquet
直接在 BMQ 中将数据结构化,通过Parquet Engine,可以使用不同的方式构建 Parquet格式文件。

消息队列- RocketMQ

使用场景

例如,针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时, 也会涉及许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等

RocketMQ 基本概念

名称 Kafka RocketMQ
逻辑队列 Topic Topic
消息体 Message Message
标签 Tag
分区 Partition ConsumerQueue
生产者 Producer Producer
生产者集群 Producer Group
消费者 Consumer Consumer
消费者集群 Consumer Grou Consumer Grou
集群控制器 Controller Nameserver