kafka消息队列的底层原理 | 青训营笔记

154 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记.

听过青训营老师讲的消息队列课程,本人对于kafka消息队列的底层原理做了一些总结和归纳:

先来看几个常见的案例:

案例一:

在购物直播间点击购买商品时的流程:
搜索直播间——> 点击商品(后台会新增一条点击的行为记录)——>点击行为记录

但是如果在记录存储的时候服务器出现问题,后台则会发生错误。

案例二:

客户有无数个商品想要买:
发起订单 ——> 处理订单 的请求量太大
该如何承载大量的请求?

案例三:(链路耗时长尾) 订单响应流程太长,操作太慢, 客户发起订单到商家的具体流程:

发起订单——>商家库存记录-1——>客户订单记录+1——>通知商家

处理速度太慢,无法承载大量订单。

总的来说服务器处理有以下四类常见问题:

1.发生系统崩溃,
2.处理服务能力有限
3.链路耗时长尾
4.日志如何处理。

面对这些问题,消息队列的应用就显得尤为重要:

1.针对问题一的解决:解耦

  所有行为记录可以存储到消息队列当中,这样如果服务器发生宕机,也会顺利发送到消息队列中

2.针对问题二解决:削峰

处理订单的流程当中每次只获取10个请求

3.针对问题三解决:异步

订单库存商家都不在一个链路上,可以异步修改

4.针对问题四解决:

log——>消息队列——>LogStash——>es——>Kibana

所以什么是消息队列?

指保存消息的一个容器,本质是一个队列,但是这个队列需要支持:高吞吐,高并发,高可用。

消息队列发展历程:

 tib ——> ibm mq、webSphere ——> MSMQ ——> jms(sun公司,只能够用在java api上)——> AMQP/RabbitMQ ——> KAFKA ——> RocketMQ ——> PUlsar(雅虎内部)

业界消息队列:

kafka:分布式的,分区的,多副本的日志提交服务(高吞吐环境下)。
RocketMQ:低延迟,强一致,高性能,高可靠,实时比较广泛
Pulsar:是下一代云原生分布式消息流平台,集消息,存储,轻量化函数式计算为一体,存算分离的架构设计
BMQ:和pulsar架构类似,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的卡夫卡集群。

本文详细介绍消息队列kafka:

使用场景:

1.离线的消息处理
2.日志信息
3.metric数据
4.搜索点赞评论收藏

如何使用kafka:

创建集群——>新增topic——>编写生产者逻辑——>编写消费者逻辑

kafka的架构:

cluster(集群)里面有多个topic,不同topic解决不同的问题,pattition(分区,可以并发处理)处理生产侧,Consumer处理消费侧.

partition内部有不同的消息,且每个消息由递增的offset,可以理解为唯一id,再partition内部严格递增。partition内部有严格递增。partion还有一个副本数,partition每个分片有多个Replica,以此来达到容灾的作用。

follower把leader数据从上拉下,并保持一样的状态。


 对于集群cluster来说,其上面还有一个zookeeper:负责存储集群的元信息。

一条消息队列的过程:

   producer——>broker机器——>consumer消费

producer与broker之间一发一收不能满足大量的业务需求:

方法:可以批量发送减少io次数,从而增强发送能力,带宽流量太大。
方法:通过压缩算法进行压缩再发送。

broker的存储:(切分)

会从partition到log存储Logsegment(.log .index .timeindex 其他文件)

broker磁盘结构:

磁头找到对应磁道找到对应的扇形区域,最后写入。,因为寻道成本较高,所以顺序写入比较好

broker如何找到消息:

发送request,broker会指定offset处的消息,按照时间窗口和信息大小窗口发送给consumer,寻找数据。

kafka提高吞吐和稳定性的功能总结:

Producer:批量发送,数据压缩
Broker:顺序写,消息索引,零拷贝
Consumer:Rebalance

kafka的缺点:

Broker不同分区有不同副本,对于每一个副本,数据都会存到该结点上,并通过数据复制的方式,最终达到集群。由此产生的问题:关闭broker1会选取broker2,但读写依旧进行,导致12数据不一致 ,需要重启的周期非常长(并且不能并发重启,两个分片在两台机器上是不一样的)

对于kafka集群来说,由于数据复制,必定带来事件成本,使得运维成本很高2.负载不均衡;

要将partiton3迁入Broker,会带来io升高的问题。

问题总结:

1.运维成本高

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

3.没有自己的缓存,完全依赖Page Cache

4.Controller和Coordinator和Broker在同一进程中,大量io会造成其性能下降