消息队列
TODO
消息队列是一个让人既熟悉又不熟悉的东西,熟悉的是平时经常有听到这个词汇,什么 Kafka、RocketMQ、RabbitMQ。这些都是面试和jd的常客,但是这些究竟是什么东西呢,何为消息队列。今天我们就跟着这篇文章来了解下 Message Queue吧!
前言:
案例一:系统崩溃
提供存储服务的供应商出事了,如何解决
解决方案:解耦
案例二:服务能力有限
多个用户同时下单,如何解决高并发。
解决方案:削峰
案例三:链路耗时长尾
返回时间过长,用户接受不了。
解决方案:异步
案例四:日志存储
日志丢失。
解决方案:日志处理
消息队列(MQ),指保存消息的一个容器,本质是个队列。但是这个队列需要支持 高吞吐,高并发,并且高可用。
| 生产 -------------------------------- ^ 消费
|_> Message Message Message Message __|
------------------------------------
01 前世今生
发展历程:
业界消息队列对比:
02 Kafka
2.1 使用场景
一般有 日志信息、Metrics 数据和用户行为
常见服务:搜索服务、直播服务、订单服务、支付服务
一般用在离线的消息处理中,例如 日志信息。上述服务的日志会先发到 kafka进行处理。再由kafka的下游对日志进行分治和处理。
还有 Metrics 数据,对程序运行的状态进行采集的数据,例如 QPS,例如 Latency。
第三个就是使用APP时的用户行为,例如 搜索、点赞、评论、收藏,都有自己的用户行为数据,也会放到消息队列里。
2.2 如何使用Kafka
-
创建 Kafka 集群
-
在这个集群中创建topic 并设置好分片数量。
-
引入 Kafka 的 SDK,实现上游生产逻辑(配置好集群和 Topic 等参数,初始化一个生产者,调用 Send方法)。即要把 Hello World 发送到 Topic(Kafka) 当中。
-
通过消费者,把刚刚写入的Hello World 通过 Poll 方法把他拉取出来进行业务处理。(配置好topic 和 Kafka参数,初始化消费者,调用 Poll方法,将收到你刚刚发送的 Hello World)
2.3 基本概念
- Topic:逻辑队列,不同 Topic 可以建立不同的 Topic
每一个不同的业务场景就是不同的 Topic,对于此业务来说,所有的数据都储存在这个 Topic 当中。
-
Cluster: 物理集群,每个集群中可以建立多个不同的 Topic
-
Producer: 生产者,负责将业务消息发送到对应的 Topic 中,由 Consumer 负责处理
-
Consumer: 消费者,负责消费 Topic 中的信息
-
ConsumerGroup: 消费者组,不同组 Consumer 消费进度互不干涉,消费独立。
-
Partition:Topic 的分区,对于 Topic 有多个不同的分区,不同的分区可以并发处理,可以来提高单个 Topic 的吞吐能力。
Offset
消息在 Partition 内的对应位置信息,可以理解为唯一 ID,在 Partition 内部严格递增。
Replica
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