大聪明教你学Java | 深入浅出聊 Kafka

news2024/11/27 15:49:26

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~

在之前的博客中,大聪明给各位小伙伴分享了一下如何在 Win10 环境下搭建 Kafka,相信各位小伙伴都有了属于自己的一套 Kafka 环境。今天咱们书接上文,大聪明继续和大家深入浅出的聊一聊 Kafka。

🔊 传送门:大聪明教你学kafka | Windows10系统下kafka安装及使用

假设你在工作中维护了两个服务,分别是服务A和服务B,B服务每秒只能处理100个消息,但A服务却每秒发出200个消息。在这种情况下,B服务是顶不住这么大压力的,分分钟就被堆积如山的消息给压垮了。那么问题就来了,有没有办法让B服务在不被压垮的同时还能处理掉A服务发来的消息呢?办法当然是有的,俗话说:没有什么是加一层中间层不能解决的,如果有,那就再加一层。 要引入的中间层正是我们今天要聊的消息队列Kafka。
在这里插入图片描述

什么是消息队列

那么什么是消息队列呢?为了保护B服务,我们很容易想到可以在B服务的内存中加入一个队列,说白了它其实是个链表,链表的每个节点就是一个消息,每个节点有一个序号,我们叫它 offset,通过这个 offset 就可以记录消息的位置。
在这里插入图片描述
B服务根据自己的处理能力,链表里的消息能处理多少就处理多少,并且在消费的过程中不断更新已处理消息的offset值。
在这里插入图片描述

但这就引发了一个问题,B服务来不及处理的消息会堆积在内存里,如果某个时间点B服务更新重启,这些消息就都丢了。例如上图一样,如果此时B服务重启了,那么内存中的“消息3”就彻底消失不见了。为了解决这个办法,我们可以将队列挪出来变成一个单独的进程,这样就算我们重启了B服务也不会影响到了队列里的消息。也就变成了这样👇
在这里插入图片描述
这样一个简陋的队列进程其实就是所谓的消息队列。而像服务A这样负责发数据到消息队列的角色就是生产者Producer,像服务B这样处理消息的角色就是消费者Consumer。但这个消息队列属实过于简陋,高性能、高扩展性、高可用,它是一个都不沾边。那么我们就要对这个简陋的消息队列做一个小小的优化。

做一个小小的优化

高性能

由于服务B的性能较差,消息队列里会不断堆积数据,为了提升性能,我们可以扩展更多的消费者,这样消费速度就上去了。相对的,我们就可以增加更多生产者,提升消息队列的吞吐量。
在这里插入图片描述
随着生产者和消费者都变多,我们会发现他们会同时争抢同一个消息队列,抢不到的一方就得等待,这不纯纯浪费时间嘛,那么我们就要做进一步的改善了。首先是对消息进行分类,每一类是一个 topic 然后根据 topic 新增队列的数量,生产者将数据按 topic 投递到不同的队列中。消费者则根据需要订阅不同的 topic 这样就大大降低了 topic 队列的压力。
在这里插入图片描述
但单个 topic 的消息可能还是过多,我们可以将单个队列拆成好几段,每段就是一个 Partition 分区,每个消费者负责一个 Partition ,这样就大大降低了争抢,提升了消息队列的性能。
在这里插入图片描述

高扩展性

随着 Partition 多,如果 Partition 都在同一台服务器上的话,就会导致单个服务器的CPU和内存过高,影响整体系统性能。那么我们可以申请更多的服务器,将 Partition 分散部署在多台服务器上,这每一台服务器就代表一个 broker,我们可以通过增加 broker 缓解机器CPU过高带来的性能问题。
在这里插入图片描述

高可用

看到这,可能有些小伙伴会提出新的疑问:如果其中一个 Partition 所在的 broker 挂了,那 broker 里所有 Partition 的消息都没了,那这高可用还从何谈起 ❓❓
针对于这个问题的解决方案就更简单了。每一位女神的手机里都有那么几个被当作备胎的沸羊羊,那么我们也可以通过这样的方法来解决这个问题。我们可以给 Partition 多加几个副本,他们统称为 replicas,将他们分为 leader 和 follower。
在这里插入图片描述
leader 负责应付生产者和消费者的读写请求,而 follower 只管同步 leader 的消息。
在这里插入图片描述
将 leader 和 follower 分散到不同的 broker 上,这样 leader 所在的 broker 挂了也不会影响到 follower 所在的 broker,并且还能从 flower 中选取出一个新的 leader Partition 顶上(是不是有点像 Redis 的哨兵模式😉)。这样就保证了消息队列的高可用。

持久化和过期策略

刚刚提到的是几个 broke 挂掉的情况,那假设所有 broke 都挂了,那岂不是数据全丢了?为了解决这个问题,我们不能光把数据放内存里,还要持久化到磁盘中,这样哪怕全部 broke 都挂了,数据也不会全部丢失,在我们重启服务后也能从磁盘里读出数据继续工作。但问题又来了,磁盘总是有限的,一直往磁盘里写数据迟早有写满的一天。所以我们还可以给数据加上保留策略,也就是所谓的 Retention Policy,比如磁盘数据超过一定大小或消息放置超过一定时间就会被清理掉。

Consumer Group

到这里其实还有个问题,按现在的消费方式,每次新增的消费者只能跟着最新的offerset接着消费。如果我想让新增的消费者从某个 offerset 开始消费呢?于是引入了消费者组的概念,也就是 Consumer Group,不同消费者组维护自己的消费进度,互不打搅。
在这里插入图片描述

Zookeeper

相信各位聪明的小伙伴也发现了,我们刚刚讲到的组件实在是太多了,而且每个组件都有自己的数据和状态,所以还需要有个组件去统一维护这些组件的状态信息。于是我们引入了 Zookeeper 组件,他会定期和 broker 通信,获取整个 Kafka 集群的状态,以此判断某些 broker 是不是挂掉了,某些消费组消费到哪了。
在这里插入图片描述

什么是 Kafka

上面我们铺垫了这么多,当初那个简陋的消息队列摇身一变成了一个高性能、高扩展性、高可用、支持持久化的超强消息队列。没错,他就是我们常说的消息队列 —— Kafka。Kafka 是架构中常见的中间件之一,在博客开头讲到的场景中引入 Kafka,可以对流量削峰填谷。我们经常还能在秒杀活动、大数据和日志的异构同步中看到他的身影。

相信各位小伙伴看完以后就会对 Kafka 有了一个更深的理解,如果你觉得这篇博客对你有帮助,别忘了三连哦~

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西

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

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

相关文章

2024年6月23日 十二生肖 今日运势

小运播报:2024年6月23日,星期日,农历五月十八 (甲辰年庚午月戊午日),法定节假日。今天国际奥林匹克日,坚不可摧的意志,披荆斩棘的豪情,永远值得拥有! 红榜生…

YOLOv8改进 | SPPF | 双通道特征处理的池化结构——SPPFCSPC【全网独家】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容,内含各种Head检测头、损失函数Loss、…

LLM主流架构和模型

本文参考自https://github.com/HqWu-HITCS/Awesome-Chinese-LLM?tabreadme-ov-file和Huggingface中的ModelCard(https://huggingface.co/) LLM主要类别架构 LLM本身基于transformer架构。自2017年,attention is all you need诞生起&#x…

P1223 排队接水

题目描述 有 𝑛 个人在一个水龙头前排队接水,假如每个人接水的时间为 𝑇𝑖,请编程找出这 𝑛 个人排队的一种顺序,使得 𝑛个人的平均等待时间最小。 输入格式 第一行为一个整数 &a…

C++ | Leetcode C++题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution { public:int majorityElement(vector<int>& nums) {int candidate -1;int count 0;for (int num : nums) {if (num candidate)count;else if (--count < 0) {candidate num;count 1;}}return candidate;…

根据状态转移写状态机-二段式

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 描述 题目描述&#xff1a; 如图所示为两种状态机中的一种&#xff0c;请根据状态转移图写出代码&#xff0c;状态转移线上的0/0等表示的意思是过程中data/flag的值。 要求&#xff1a; 1、 必须使用对应类型的状…

Django 条件判断模板标签

1&#xff0c;条件判断模板标签 1. 2 {% if %} 标签 {% if variable %}<!-- 如果 variable 为 True&#xff0c;则渲染此处内容 --> {% endif %} 1. 3 {% if %} 与 {% else %} 组合 {% if variable %}<!-- 如果 variable 为 True&#xff0c;则渲染此处内容 -->…

Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言 近年来&#xff0c;人工智能领域取得了令人瞩目的进步&#xff0c;其核心是图形处理单元&#xff08;GPU&#xff09;和并行计算平台的强大组合。 大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而&#xff0c;训练这些模型需要大量的数据…

外卖APP开发详解:从同城O2O系统源码开始

近期&#xff0c;从事软件开发的小伙伴们都在讨论外卖APP&#xff0c;热度非常之高&#xff0c;所以小编今天将与大家一同探讨同城O2O系统源码、外卖APP开发。 一、外卖APP开发的前期准备 了解目标用户的需求&#xff0c;分析竞争对手的优劣势&#xff0c;明确自身的市场定位。…

算法金 | 统计学的回归和机器学习中的回归有什么差别?

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 统计学中的回归 目标&#xff1a; 主要用于解释和推断自变量&#xff08;independent variables&#xff09;和因变量&#xff08;de…

免杀笔记 ---> C语言

这次的更新可能有点慢&#xff0c;因为这段时间也比较忙&#xff0c;加上C语言还得和汇编结合&#xff0c;导致小编一个知识点总是得反复揣摩&#xff08;太菜了&#xff09;&#xff0c;所以免杀的更新篇幅长度可能会达到两个月和三个月&#xff0c;但是小编能保证&#xff0c…

中国科学院西北生态环境资源研究院联合多单位在《PNAS》发文:气候变暖对多年冻土区地上与地下生物量分布的影响

文章简介 论文名称&#xff1a;Changes in above-versus belowground biomass distribution in permafrost regions in response to climate warming&#xff08;气候变暖对多年冻土区地上与地下生物量分布的影响&#xff09; 第一作者及单位&#xff1a;贠汉伯&#xff08;研…

Hadoop archive

Index of /dist/hadoop/commonhttps://archive.apache.org/dist/hadoop/common/

【Git】--Part3--远程操作 配置 标签管理

1. 远程仓库 Git 是分布式版本控制系统&#xff0c;同⼀个 Git 仓库&#xff0c;可以分布到不同的机器上。怎么分布呢&#xff1f; 最早&#xff0c;肯定只有⼀台机器有⼀个原始版本库&#xff0c;此后&#xff0c;别的机器可以 “克隆” 这个原始版本库&#xff0c;⽽且每台机…

css grid实现九宫格布局

常见的九宫格布局可以使用flex布局实现&#xff0c;但是flex布局有个致命的缺陷&#xff0c;比如3行3列的布局&#xff0c;当第不足3个元素的时候&#xff0c;元素依然是平局平铺的&#xff0c;这样就不满足九宫格的效果&#xff0c;这种情况&#xff0c;使用grid布局可以轻松搞…

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell Jenkins弱口令 默认用户一般为jenkins/jenkins 使用admin/admin123登陆成功 Jenkins反弹shell 格式为 println"命令".execute().text 在/tmp目录中生成shell.sh文件&#xff0c;并向其中写入反弹shell的语句 new…

猫头虎分享已解决Bug || Null Pointer Exception: `java.lang.NullPointerException`

猫头虎分享已解决Bug || Null Pointer Exception: java.lang.NullPointerException &#x1f63a;&#x1f42f; 关于猫头虎 大家好&#xff0c;我是猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程…

10分钟入门Vue3

前言&#xff1a;你的阅读速度够快&#xff0c;10 分钟能看完这篇文章。文章整体比较粗浅&#xff08;入门级&#xff09;&#xff0c;如需深入了解细枝末节&#xff0c;请移步官网。 1. Vue3 和 Vue2 的区别 双向数据绑定原理&#xff1a; Vue2使用的是Object.definePropert…

6/22 第四周 python操作word

学习到了word有四个段落&#xff0c;都可以通过python来操作。 并且课程的体系&#xff0c;只是一个启蒙&#xff0c;需要在公司的项目中熟悉&#xff0c;从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

java—类反射机制

简述 反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff08;如成员变量&#xff0c;构造器&#xff0c;成员方法等&#xff09;&#xff0c;并能操作对象的属性及方法。反射机制在设计模式和框架底层都能用到。 类一旦加载&#xff0c;在堆中会产生…