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

67 阅读4分钟

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

这篇文章主要对消息队列的相关概念以及消息队列的三个模式进行介绍和总结。

1.消息队列基本知识

何为消息队列?

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

 生产 -> Message Message Message Message Message -> 消费

消息队列的发展历程

  1. TIB 诞生于1985年,服务于金融机构和新闻机构

  2. IBM MQ/WebSpere 诞生于1993年,商业消息队列平台市场主要玩家

  3. MSMQ 微软发布于1997年

  4. JMS 诞生于2001年本质上是一套Java API

  5. AMQP/RabbitMQ 规范发布于2004年,同年RabbitMQ面市

  6. Kafka 2010年Linked开源

  7. RocketMQ 2011年阿里中间件团队自研

  8. Pulsar 2012年诞生于Yahoo内部

2.消息队列-Kafka

使用场景:

搜索服务-直播服务-订单服务-支付服务 -> Metrics数据 -> kafka

由此产生的用户行为有:搜索、点赞、评论、收藏

kafka的使用流程:创建集群 -> 新增Topic -> 编写生产者逻辑 -> 编写消费者逻辑

基本概念:

  • Topic:逻辑队列,不同Topic可以建立不同的Topic

  • Cluster:物理集群,每个集群中可以建立多个不同的Topic

  • Producer:生产者,负责将业务消息发送到Topic中

  • Consumer:消费者,负责消费Topic中的消息

  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉

  • Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增

  • Replica:每个分片有多个Replica,Leader Replica将会从ISR中选出

  • ZooKeeper:负责存储集群元信息,包括分区分配信息等

3.消息队列-BMQ

BMQ介绍:兼容Kafka协议,存算分离,云原生消息队列

Broker-Partition状态机需要保证对于任意分片在同一时刻只能在一个Broker上存活

开发流程:开发 -> BOE -> PPE -> Prod

BOE:Bytedance Offline Environment,是一套完全独立的线下机房环境

PPE:Product Preview Environment, 即产品预览环境

Databus的优势所在:1、简化消息队列客户端复杂度;2、解耦业务与Topic;3、缓解集群压力,提高吞吐

  • Index:直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过IndexQuery服务读出数据。

  • Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等)

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

4.消息队列-RocketMQ

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

基本概念:分为三列,分别为:名称、Kafka、RocketMQ

逻辑队列 —— Topic —— Topic

消息体 —— Message —— Message

标签 —— 无 —— Tag

分区 —— Partition —— ConsumerQueue

生产者 —— Producter —— Producter

生产者集群 —— 无 —— Producer Group

消费者 —— Consumer —— Consumer 

消费者集群 ——  Consumer Group —— Consumer Group 

集群控制器 —— Controller —— Nameserver

RocketMQ的基本概念包括:Queue、Tag;底层原理包括:架构模型、存储模型;高级特性:事务消息、重试和死信队列、延迟队列

5.总结

本篇文章主要对消息队列中的简单的基础概念进行了总结,为了更加了解消息队列,我们还需要从网上的相关资源进行实践。针对不同的实际场景进行模拟,将所学到的消息队列的框架运用到相关的业务场景中。总体来说,本节课程了解到很多消息队列的知识,接下来可以更好的巩固相关的知识。

6.引用

本篇文章的主要内容来自于字节内部课程。