Kafka消息队列使用及原理

news2024/10/7 12:24:45

消息队列作用:异步、削峰、解耦

1、kafka简介

Apache Kafka 是一个分布式的流平台,有三个关键的功能:

  1. 能够发布(写入)和订阅(读取)事件流
  2. 持续可靠的存储事件流
  3. 在事件发生时回顾性的处理事件流

事件流: 数据源随着时间变化产生的一系列的动作或者时间被捕获后,形成事件流

应用场景 🎑

  1. 服务解耦

    微服务场景,服务以来耦合严重场景

  2. 流量削峰

    潮汐性较大的场景

  3. 实时处理

    行为分析、日志采集、异常报警

  4. 异步、广播、排队

    直播课堂、商城等

业务案例 🌵

服务解耦

用户下单购买商品,购买流程,需要先查看库存是否有货,如果有则快递派送,可以利用消息队列进行服务解耦,下的订单发送进消息队列可以使下单这个事件闭环,可以提升下单这个事件的用户体验,配送服务的消费者去订单的队列里消费这个订单的时候,再去进行配送处理即可

流量削峰

用户行为埋点日志上报,用户在网页上触发的行为非常频繁,100W用户同时进行点击,会形成100W qps的log流,后端存储需要应对100w qps的流量冲击,没有用户点击的时候,流量会降低,这样可以引入消息队列,前端上报服务不会因为写库而阻塞,写库的时候可以分批有序写入。消息队列的存在提升了整个系统架构的

2、Kafka 架构及基本概念

基本概念 🎯

  • topic:消息主题,逻辑概念,代表一个消息队列
  • partition:消息分区,一个主题可以创建多个分区,一个分区划分为多个==segment==,每个segment对应一个物理文件
  • broker:服务代理节点,kafka集群中一台服务器就是一个 broker,支持水平扩展,承载分区的分布
  • producer:生产者,负责将客户端产生的消息发送到kafka中
  • consumer:消费者,负责从kafka中拉取消息进行业务逻辑处理,consumer group是消费者的逻辑集合,不同消费逻辑需要不同的groupid
  • replica:副本,对分区数据的冗余备份,为集群提供高可用能力
  • leader/follower:领导副本/普通副本,领导副本负责承接消息的读写,普通副本负责同步leader的消息,是leader的备份

架构简介🚧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXJDchPo-1673344693322)(/Users/zsh/Library/Application Support/typora-user-images/image-20230110175322527.png)]

  • 如图所示,为一套三个broker的集群
  • zookeeper作为分布式一致性服务,kafka通过其进行元数据管理
  • topic1有三个分区,每个分区有3个副本,其中broker0/1/2上各有一个分区副本的leader
  • topic2 有三个分区,每个分区有3个副本,其中broker0/1/2上各有一个分区副本的leader
  • producer-0 向topic1中生产消息,有consumer-group-0 的三个消费者消费,三个消费者消费的数据不重复
  • producer-1 向topic2中生产消息,有consumer-group-1 的一个消费者消费

image-20230110175415978

生产者在生产数据的过程 中,是随机将消息写入到一个topic的每一个partition中,每一个partition都存在一个有序的记录序列,如果有新增日志,会按顺序添加至末尾,分配一个ID号,叫偏移量[offset],这个ID在整个partition中具有唯一性。

其他概念📚

image-20230110175524285

  • AR:Assigned Replicas 的缩写,是每个partition下所有副本(replicas)的统称,AR列表不会变化,除非增加分区
  • ISR:In-Sync Replicas 的缩写,是指副本同步队列,ISR是AR中的一个子集,follower 落后 leader的时间小于 replica.lag.time.max.ms(默认10s)这个参数时,则认为此副本与leader是同步的,可以进入ISR,每个partition都有自己的ISR列表,ISR是动态变化的
  • LEO:LogEndOffset 的缩写,表示每个partition的log最后一条Message的位置
  • HW:HighWatermark的缩写,是指consumer能够看到的此partition的位置。取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置
  • LogStartOffset:表示一个partition的起始位置offset
  • ConsumerOffset:表示partition的某个消费者的位置
  • Lag:消费者能够消费的最大位置和消费者当前消费者位置的差值,用来表示消费迟滞消息数(延迟),Lag=HW-ConsumerOffset

3、核心原理解析

核心原理💥

image-20230104115847139

  1. 强劲的吞如能力,每秒处理百万级数据
  2. 无限制的横向扩展,支持热扩展
  3. 可用性&数据一致性

高吞吐⭐️

  • 磁盘顺序读写

    写数据是通过不断追加的方式到本地磁盘末尾的,比磁盘随机读写方式性能提升很高

  • 页缓存(os cache)

    写数据的时候直接写入 os cache,有操作系统异步的把数据刷入磁盘里,很大的提升写性能

  • 零拷贝(zero-copy)

    直接读取内核缓存区的数据发送到网络。没有在用户空间发送拷贝操作,节省了开销,提升了读性能

  • 分区并发

    每个topic划分多个partition,每个p中数据有序,同一个consumer group 中不同的consumer 拉取不同p中的数据,增加partition提升增加数据拉取并发能力

  • 稀疏索引

    分区中的数据会分段存储在 segment中,默认每4kb新增一个索引,通过二分查找确定数据在文件中的位置,在通过磁盘顺序读找到信息

  • 批量&压缩

    Producer 和 consumer 通过 batch 的方式读写数据,且支持lz4、snappy、gzip等多种压缩算法,节省大量的网络和磁盘开销

可扩展性⭐️

​ kafka的topic 由多个partition组成,每个partition中的数据有序且不同,而每个partition是分散在多个broker上的,这样单个topic承载数据的能力,可以通过扩partition的方式来进行扩展,而当集群资源达到上限是,又可以通过扩展broker的方式来扩展集群资源,这样实现了kafka的可扩展性

可用性&一致性⭐️

CAP理论:一个分布式系统最多只能满足**一致性(Consistency)、可用性(Avaliability)、分区容错性(Partition tolerance)**这三项中的两项

  • 一致性

    生产者将数据写入kafka topic的不同分区里,每个分区有多个副本,其中读写操作都是由leader来承担,满足了数据一致性

  • 可用性

    在kafka的副本机制,每个分区会允许存在多个副本,follower 副本对象leader副本同步数据,当主副本挂掉时重新选举备份副本成为leader提供读写,满足了可用性

  • 分区容错性

    由于follower副本异步同步数据,所以kafka不保证分区容错性,但是ISR机制可以尽可能减小分区容错的问题

4、实战应用&排查技巧

kafka 核心配置参数详解✳️

配置项配置意义
broker.idbroker的唯一标识符,如果不配置则自动生成,一定要保证集群中必须唯一
portbroker server 端口
log.dir日志数据存放的目录,默认/tmp/kafka-logs
zookeeper.connectZookeeper 主机地址,如果zookeeper是集群则以逗号隔开,如 172.6.14.61:2181,172.6.14.62:2182,172.6.14.63:2181
listeners监听列表,broker对外提供服务时绑定的ip和端口。多个已逗号隔开,如果监听器名称不是一个安全的协议,listener.security.protocol.map也必须设置
advertised.listeners给客户端用的发布至zookeeper的监听,broler会上送此地址到zookeeper,zookeeper会将此地址提供给消费者,消费者根据此地址获取消息。如果和上面的listeners不同则以此为准
delete.topic.enable是否可以删除topic,如果关闭此配置则通过管理工具删除topic则不生效。默认false
log.retention.hours
log.retention.minutes
log.retention.ms
日志删除之前保留的时间,支持不同时间单位
num.network.threadsbroker用来处理网络请求的线程数,默认3
message.max.byteskafka可以接受的消息最大尺寸,默认1MB,生产环境一般10MB
num.partition创建topic的默认分区数目
auto.create.topics.enable是否自动创建topic,默认true

kafka shell 常用命令✡️

  • 创建topic
    bin/kafka-topic.sh --create --zookeeper x.x.x.x:2181 --replication-factor 1 --partition 1 --topic xxx

  • 查看topic列表
    bin/kafka-topic.sh --zookeeper x.x.x.x:2181 --list

  • 查看指定topic信息

    bin/kafka-topic.sh --zookeeper x.x.x.x:2181 --describe --topic xxx

  • 控制台向topic生产数据
    bin/kafka-console-producer.sh --broker-list x.x.x.x:9092 --topic xxx

  • 控制台消费topic数据
    bin/kafka-console-consumer.sh --broker-list x.x.x.x:9092 --topic

  • 删除指定topic
    bin/kafka-topic.sh --delete --zookeeper x.x.x.x:2181 --topic xxx

管理工具 kafka manager(CMAK)🛠

  • 管理多个集群
  • 轻松检查集群状态(主题、消费者、偏移量、代理、副本分布、分区分布)
  • 运行首选副本选举
  • 生成分区分配,并带有选择要使用的代理的选项
  • 运行分区重新分配(基于生成的分配)
  • 创建一个带有可选主题配置的主题(0.8.1.1配置与0.8.2+不同)
  • 删除主题(仅支持0.8.2+,并记住在代理配置中设置delete.topic.enable=true)
  • 主题列表现在指示标记为删除的主题(仅支持0.8.2+)
  • 为多个主题批量生成分区分配,并可选择要使用的代理
  • 批量运行多个主题的分区重新分配
  • 将分区添加到现有主题
  • 更新现有主题的配置
  • 可以选择为代理级别和主题级别指标启动JMX轮询
  • 可选择过滤掉 zookeeper 中没有 ids/owners/ & offsets/ 目录的消费者

生产环境使用流程及建议 💡

  1. 评估业务架构,峰值体量,合理规划机器资源。可以按单实际物理机 10w/s 实际使用规划,例如 30w/s 的总峰值体量,可以规划3台物理机(万兆网卡、40c、256g)
  2. 规划业务侧topic,分区数(建议不超过48个分区是最佳的),副本数(一般默认3个就可以),注意分区数影响并发能力和消费能力的上限,副本数影响高可用性
  3. 开发消费者逻辑,明确 consumer group
  4. 压测,调整消费并行度,通过在kafka manager 中观测指定topic,指定consemer group 的lag趋势来判断消费延迟情况,生产到达峰值情况下lag的值持续不地震,表示消费能力满足要求
  5. 在生产环境运行期间,对数据消费又强时效性需求的,建议配置lag告警,流量水位告警
  6. 注意:当出现持续提升消费者并行度,依然无法解决延迟问题的时候,是由于消费者服务,单线程对于单分区的消费能力过弱,可考虑review消费者逻辑,在数据解析、网络交互等模块进行优化,如果均达到理想性能,则可通过增大分区数,来提升消费能力上限。topic的分区可以在线热扩展

kafka 和 Rocket MQ选型比较 🆚

特性可靠性性能实时性顺序性分布式事务消息查询消息回溯
kafak不保证较高较高不保证不支持不支持支持
RocketMQ保证较高保证支持支持支持

总结

​ kafka更擅长处理流量较大,吞吐需要较高的场景,由于异步刷新,所以消息是无法保证强可靠性的,对于一些偏业务交互的能力支持也偏弱,比较适合大数据处理,性能优先的场景

​ RocketMQ 是支持同步刷盘、同步复制,可靠性较高,适当牺牲性能,比较适合业务侧应用的数据处理,对于数据可靠性有保障,支持分布式事务,可以适合业务优先的场景

kafka 不适合的场景⭕️

  1. kafka不适合作为数据库来进行使用

    kafka虽然提供了ACID的保证,也可以长期存储数据,但是对于检索能力的支持比较差,无法提供有好的数据访问机制

  2. kafka不适合处理大型数据

    基于kafka 的IO特性,kafka不是为大型消息而设计的,10k的消息大小为最佳

  3. kafka无法独立提供一套实时系统,更多的事作为消息中间件,和其他框架搭配使用

    kafka 自身设计没有提供丰富的面向业务的函数库,对于消息的处理还是需要以来合适的消费者的选型和处理逻辑的准确性,所以更多的是作为中间件搭配使用

  4. 强时序性消息流需要谨慎选择kafka

    kafka 是单分区保持强顺序性,但是分区数超过1时,消费的顺序是无法保证的,所以需要在顺序性和扩展性上做选择,需要选择合适的场景使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IB生物笔记:Structure and function of organelles

国际学校生物老师解读IB生物,感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物,分子生物,遗传学,生态学,物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

C++模板类

目录 前言 类模板 模板类继承 前言 随着c发展,有一部分代码就会出现这样的情况:实现的内容相同,但是参数不同。模板类就是为解决这类情况来的,是一种泛型编码。即与数据类型无关的通用程序设计技术。 模板类本身不占空间&…

C语言模块化

🌞欢迎来到C语言的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误,…

MySQL的行锁总结

文章目录前言一、行锁的介绍二、行锁的使用三、使用行锁所带来的问题四、死锁和死锁检测前言 上篇文章已经学习了MySQL的全局锁和表锁,今天这篇文章我们对行锁进行以下学习 一、行锁的介绍 行锁就是针对数据表中行记录的锁,比如事务A更新了一行&#x…

切面AOP

1.2 AOP体系与概念 简单地去理解,其实AOP要做三类事: 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。 在什么时候切入,是业务代码执行前还是执行后。 切入后做什么事,比如做权限校验、日志记录等。 因…

ES索引切分

提示:对于一些日志类的数据,我们常用到es作为存储,数据量过大时,可能会用到索引切分,这里可以参考 ES索引切分前言方案一:ES索引切分验证(policy策略)配置ilm策略 (max_d…

照片如何修复清晰度?这些修复方法值得你收藏

我们都知道以前的拍照技术落后,拍摄出来的照片像素都比较低,从而导致照片有些模糊不清,再加上我们保存不当,很多旧照片都变得模糊破损,因此很多人为了不让这些旧照片消失,都会选择找人来修复这些旧照片&…

爬虫 大规模数据 采集心得和示例

本篇主要介绍网站数据很是大的采集心得数据库1. 什么样的数据才能称为数据量大:编程我以为这个可能会由于每一个人的理解不太同样,给出的定义 也不相同。我认为定义一个采集网站的数据大小,不单单要看这个网站包括的数据量的大小,…

MySQL高级【锁】

1:锁的概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数据库必…

基于java springmvc+mybatis酒水商城管理系统设计和实现

基于java springmvcmybatis酒水商城管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

5.7、TCP 可靠传输的实现

1、TCP基于以字节为单位的滑动窗口来实现可靠传输 TCP 基于以字节为单位的滑动窗口\color{red}以字节为单位的滑动窗口以字节为单位的滑动窗口来实现可靠传输 如下所示,假定数据传输只在一个方向进行 这是发送方待发送字节的序号 假设发送方收到了来自一个接收方的…

RHCE第六天之DNS域名解析服务器详解

文章目录一、 域名解析服务器介绍二、DNS域名解析的过程三、搭建DNS服务器的详细配置四、实验练习一、 域名解析服务器介绍 DNS(Domain Name System) 是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够…

Node转换Excel成JSON

目前想使用Cocos Creator做一个文字游戏,类似于我的人生重开模拟器。 那么其中最重要的一点就是关于数据的存储了。在我的人生重开模拟器中大部分事件和天赋的数据是存储在excel表格当中的,当然如果要使用Cocos Creator,因为我不准备布置服务…

JDBC核心技术_第8章:数据库连接池

目录8.1 JDBC数据库连接池的必要性8.2 数据库连接池技术8.3 多种开源的数据库连接池8.3.1 C3P0数据库连接池8.3.2 DBCP数据库连接池8.3.3 Druid(德鲁伊)数据库连接池8.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模…

【蓝桥杯系列】2020省赛真题之回文日期

⭐️前面的话⭐️ 本篇文章介绍来蓝桥杯真题之回文日期的题解,展示语言java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由未见花闻原创&#xff0c…

ArcGIS基础实验操作100例--实验81创建点群最小边界几何

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验81 创建点群最小边界几何 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

MySQL是怎么保证高可用的?

在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL 要提供高可用能力…

Python中zipfile压缩包模块的使用

本文主要介绍了Python中zipfile压缩包模块的使用,zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具,本文做一个简单的总结。 简介 ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创建、读取、写入、添加及列出 …

如何通过QA质量管理提高软件质量?

1、构建了质量检查系统 为了保证软件开发质量,一般来说QA检查单按照检查阶段划分为:需求分析、系统设计、系统实现、系统测试、交付验收、系统运维。 QA质量管理:CoCode项目管理 QA质量管理——QA检查单​ 为了进一步提高检查效果&…

【笔记:第4课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间:2023年1月10日22:41:26 如题,学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p4&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 正文 操作系统:POSIX 标准。 LLVM有…