关于消息队列(上)| 青训营

71 阅读3分钟

消息队列可以用于处理怎样的场景?

1.系统崩溃

2.服务处理能力有限

3.链路耗时长尾(将订单加入队列后反应的时间过于长)

4.日志如何处理

什么是消息队列

消息队列指保存消息的一个容器,本质是一个队列。但其具有高并发,高吞吐,高可用的特点

消息队列之kafka

kafka使用方法:创建集群 --> 新增topic --> 编写生产者逻辑 --> 编写消费逻辑

kafka的基本概念.png topic:用于存储不同的业务场景中的数据

cluster:kafka的物理集群,每个集群可以新建不同的topic、

partion:topic中的不同分片,使得topic可以并发的处理消息,以此提高topic的吞吐量

offset:消息在partion中的相对位置信息,就相当于唯一键,并且在partion中是严格递增的

Replica:分片的副本,分布于不同的机器上,可以用于容灾,其中存在leader和follower,leader与follower相似,当leader挂掉了follower可以直接顶替上去

kafka副本分布图.png 如上为kafka副本分布图^

每个broker代表kafka的一个节点,所有节点构成一个集群,其中topic1被分为了两个切片,中间的broker扮演Controller的身份,其负责对副本和broker进行分配

除了集群,kafka中还存在ZooKeeper,其用于存储集群中的元数据,比如副本的分配信息等等。

kafka为什么支持高吞吐?

1.producter方面进行批量发送,减少IO的次数

2.producter方面进行数据压缩,通过压缩减少信息的大小

数据的存储

kafka_Broker消息文件的结构.png 其中Broker采取的是顺序写的方法,以此来增加写入的效率。

kafka_Broker如何找到消息.png Broker寻找消息时使用二分法进行检索

Broker的零拷贝.png Broker的零拷贝可以保证数据的快速写入

kafka的重启操作

若对一个机器进行重启操作,首先会对Broker进行关闭的操作,如果其上面有leader,则将这个leader转交给其他的副本。而当机器重启后,必然出现数据的滞后,这个Broker就会开始追赶数据,当数据追赶上后,我们就会切回leader,此操作叫做perfer leader。也正是因为如此,重启时,只能允许一台机器进行重启。

kafka的替换、扩容、缩容

替换:相比于重启,替换需要追赶的数据要更加的多,重启只需要追赶重启的时间所产生的数据差,而替换则是将数据所有的进行更换。

扩容:将分片分配到新的机器上,将数据从0开始进行拷贝。

缩容:将要缩容的节点上的分片分配到剩余节点,分配过去的节点要从头开始拷贝。

kafka存在的问题

1.运维成本高

2.对于负载不均衡的场景,处理方法复杂

3.没有自己的缓存,完全依赖于page cache

4.controller和coordinator和broker处于一个进程中,大量的IO使得性能下降