1、消息队列概述
消息队列是存储消息的一个容器,本质上也是一个队列,但是需要保持高吞吐,高并发,并且高可用。
1、解耦:崩溃的服务不会直接影响到整个业务流程,导致系统崩溃。
2、削峰: 先将请求放在消息队列中,每次只获取10个请求进行处理。
3、异步:可以将一些逻辑先写入消息队列。
4、日志处理(异步):将日志的相关信息交给消息队列解决。
2、Kafka
- 使用场景:离线的消息处理
1、日志信息等。
2、用户行为:点赞,评论、搜索,收藏等。
使用流程:创建Kafka集群-->新增Topic-->编写生产者逻辑-->编写消费者逻辑。
- Kafka基本概念:
1、Cluster:集群,每个集群中可以建立多个Topic。
2、Topic:逻辑队列,每个Topic内还有多个Partition。
每条消息用offset进行标识,在partition内部严格递增。
6、每个Partition有不同的Replica(副本),Leader Replica会从ISR中选出。容灾
3、Producer:生产者,将消息发送到Topic中,支持Batch批量发送,支持压缩算法来减少数据量。
4、Comsumer:消费者,从Topic中拿到消息进行消费。
5、Comsumer Group:消费者组,不同组的Comsumer消费互不干扰。
Consumer通过Fetch Request来请求消息数据,Broker会指定Offset处的消息,按照时间窗口和消息窗口发送给Consumer。
根据Topic拉取到消息之后,需要将Partition分配给Consumer Group中的各个Consumer。Kafka提供了一种自动分配机制,使用Coordinator来监控Consumer的状态,对Partition进行分配,实现简单的负载均衡和容灾。Rebalance的具体流程:
-
- Consumer Group中的每个Consumer向Broker Cluster发送FindCoordinatorRequest的请求,然后Broker Cluster会为该Group分配一个Coordinator。
- Comsumer向Coordinator发送Join Group Request,Coordinator会选取一个leader Consumer。
- Consumer Group知道自己的Leader之后,发送Sync Group Request,Leader Consumer会将Partition的协调发案发送给Coordinator,Coordinator将协调方案作为Response发送回所有的Consumer。
- 每个Consumer定期向Coordinator发送心跳。
6、Broker:每个Broker代表一个节点。Broker Controller:对集群的Broker和副本进行管理分配。
基于磁盘的寻道时间优化,Broker会对日志文件和消息进行顺序写。
Broker消息文件结构:LogSegment的命名是根据第一个消息的Offset来命名。可以使用二分去查找消息所处的LogSegment文件。
每个Record Batch会有多条消息,维护一个offset-position表,二分找到对应的Batch。
零拷贝技术:磁盘数据-->内核空间-->网卡-->消费者进程。
写入消息:用户空间不应过内核空间直接拷贝到磁盘。
7、ZooKeeper:与Controller配合,存储集群的元数据,Broker副本的位置信息等。
\