这是我参与「第三届青训营-后端场」笔记创作活动的第5篇笔记
消息队列的基本概念
消息队列(Message Queue)是现代的微服务架构中的重要中间件
-
定义:消息队列在逻辑上就是一个满足先入先出的队列容器,但又同时满足高吞吐、高可用和高并发。
-
主要使用场景:
-
应用解耦:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
-
异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
-
限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
-
日志存储:分布式系统的数据流通过消息队列建立日志。
-
Kafka消息队列
Kafka是目前主流的消息队列之一,提供分布式、分区的、多副本的日志提交服务,在高吞吐的场景下出色,由Apache基金会开源维护。
-
Kafka的基本概念
- Topic:逻辑队列,不同的业务可以建立不同的Topic
- Partition:一个Topic可以包含一个或多个Partition
- Cluster:物理集群,可以部署一个或多个Topic
- Broker:Cluster中的物理结点
- Producer:生产者,将消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组的Consumer的消费进度互不干涉
-
Kafka的数据容灾
- Kafka为每个topic的在多个服务器中的partitions复制日志。这允许在集群中的一个服务器失败时进行自动的故障切换(failover),从而消息不会由于失败而丢失。
- 复制(replication)的基本单位是partition,包含若干个replica,分为leader和follower。
- 每个partition都有一个leader和零个或多个follower。
- leader中配置的复制因子(replication factor)决定了复制的数量。
- producer生产的数据都会被发送到leader,而consumer的读操作可以从leader或follower中读取。
- follower就像consumer一样,从leader中消费由producer生产的数据,并且将它们应用到自己的日志(log)中。
- 每个follower的日志与leader的日志是相同的,具有相同的偏移和相同顺序的消息。
- 但leader的日志末尾可能有少量的消息尚未来得及被复制到follower。