消息队列 | 青训营笔记

80 阅读3分钟

消息队列

TODO
消息队列是一个让人既熟悉又不熟悉的东西,熟悉的是平时经常有听到这个词汇,什么 Kafka、RocketMQ、RabbitMQ。这些都是面试和jd的常客,但是这些究竟是什么东西呢,何为消息队列。今天我们就跟着这篇文章来了解下 Message Queue吧!

前言:

案例一:系统崩溃

提供存储服务的供应商出事了,如何解决

mq-case-qus1.png

解决方案:解耦

mq-case-ans1.png

案例二:服务能力有限

多个用户同时下单,如何解决高并发。

mq-case-qus2.png

解决方案:削峰

mq-case-ans2.png

案例三:链路耗时长尾

返回时间过长,用户接受不了。

mq-case-qus3.png

解决方案:异步

mq-case-ans3.png

案例四:日志存储

日志丢失。

解决方案:日志处理

mq-case-ans4.png

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

|  生产 --------------------------------  ^ 消费
|_>   Message Message Message Message   __|
    ------------------------------------
    

01 前世今生

发展历程:

mq-develop-history.png

业界消息队列对比:

mq-compare.png


02 Kafka

2.1 使用场景

一般有 日志信息、Metrics 数据和用户行为

常见服务:搜索服务、直播服务、订单服务、支付服务

一般用在离线的消息处理中,例如 日志信息。上述服务的日志会先发到 kafka进行处理。再由kafka的下游对日志进行分治和处理。

还有 Metrics 数据,对程序运行的状态进行采集的数据,例如 QPS,例如 Latency。

第三个就是使用APP时的用户行为,例如 搜索、点赞、评论、收藏,都有自己的用户行为数据,也会放到消息队列里。

2.2 如何使用Kafka

mq-how-use-kafka.png

  1. 创建 Kafka 集群

  2. 在这个集群中创建topic 并设置好分片数量。

  3. 引入 Kafka 的 SDK,实现上游生产逻辑(配置好集群和 Topic 等参数,初始化一个生产者,调用 Send方法)。即要把 Hello World 发送到 Topic(Kafka) 当中。

  4. 通过消费者,把刚刚写入的Hello World 通过 Poll 方法把他拉取出来进行业务处理。(配置好topic 和 Kafka参数,初始化消费者,调用 Poll方法,将收到你刚刚发送的 Hello World)

2.3 基本概念

mq-kafka-construction.png

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

每一个不同的业务场景就是不同的 Topic,对于此业务来说,所有的数据都储存在这个 Topic 当中。

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

  •  Producer: 生产者,负责将业务消息发送到对应的 Topic 中,由 Consumer 负责处理

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

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

  • Partition:Topic 的分区,对于 Topic 有多个不同的分区,不同的分区可以并发处理,可以来提高单个 Topic 的吞吐能力。

Offset

消息在 Partition 内的对应位置信息,可以理解为唯一 ID,在 Partition 内部严格递增。

mq-kafka-offset.png

Replica

mq-kafka-replica.png Partition 层 下方还有 副本(Replica)。对于每一个分片有多个Partition,Partition 有不同的角色,多个副本(Replica) 会分布在集群的不同机器上,以此来达到容灾的作用。

Replica 的不同角色,副本有 Leader角色和 Follower角色。Leader 用来对外进行写入和读取,从生产者过来的消息会先写到Leader,消费也会从 Leader消费。 Follower 会不断的从 Leader上面去把数据给拉取下来,努力和 Leader保持一致。

ISR(In-Sync Replicas):Kafka 的特性,对于Follower 来讲,与Leader的差距是有个配置的,如果大于差距,就会被踢出 ISR(在同步当中的副本)。Replica3 差距过大,所以不允许在同步当中的副本。

### 2.4