消息队列可以用于处理怎样的场景?
1.系统崩溃
2.服务处理能力有限
3.链路耗时长尾(将订单加入队列后反应的时间过于长)
4.日志如何处理
什么是消息队列
消息队列指保存消息的一个容器,本质是一个队列。但其具有高并发,高吞吐,高可用的特点
消息队列之kafka
kafka使用方法:创建集群 --> 新增topic --> 编写生产者逻辑 --> 编写消费逻辑
topic:用于存储不同的业务场景中的数据
cluster:kafka的物理集群,每个集群可以新建不同的topic、
partion:topic中的不同分片,使得topic可以并发的处理消息,以此提高topic的吞吐量
offset:消息在partion中的相对位置信息,就相当于唯一键,并且在partion中是严格递增的
Replica:分片的副本,分布于不同的机器上,可以用于容灾,其中存在leader和follower,leader与follower相似,当leader挂掉了follower可以直接顶替上去
如上为kafka副本分布图^
每个broker代表kafka的一个节点,所有节点构成一个集群,其中topic1被分为了两个切片,中间的broker扮演Controller的身份,其负责对副本和broker进行分配
除了集群,kafka中还存在ZooKeeper,其用于存储集群中的元数据,比如副本的分配信息等等。
kafka为什么支持高吞吐?
1.producter方面进行批量发送,减少IO的次数
2.producter方面进行数据压缩,通过压缩减少信息的大小
数据的存储
其中Broker采取的是顺序写的方法,以此来增加写入的效率。
Broker寻找消息时使用二分法进行检索
Broker的零拷贝可以保证数据的快速写入
kafka的重启操作
若对一个机器进行重启操作,首先会对Broker进行关闭的操作,如果其上面有leader,则将这个leader转交给其他的副本。而当机器重启后,必然出现数据的滞后,这个Broker就会开始追赶数据,当数据追赶上后,我们就会切回leader,此操作叫做perfer leader。也正是因为如此,重启时,只能允许一台机器进行重启。
kafka的替换、扩容、缩容
替换:相比于重启,替换需要追赶的数据要更加的多,重启只需要追赶重启的时间所产生的数据差,而替换则是将数据所有的进行更换。
扩容:将分片分配到新的机器上,将数据从0开始进行拷贝。
缩容:将要缩容的节点上的分片分配到剩余节点,分配过去的节点要从头开始拷贝。
kafka存在的问题
1.运维成本高
2.对于负载不均衡的场景,处理方法复杂
3.没有自己的缓存,完全依赖于page cache
4.controller和coordinator和broker处于一个进程中,大量的IO使得性能下降