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

前言

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

在之前的博客中,大聪明给各位小伙伴分享了一下如何在 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.mzph.cn/news/857858.shtml

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

相关文章

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…

华为终于要“三分天下”

在被苹果iOS、谷歌安卓长期统治的手机操作系统市场中&#xff0c;一个新操作系统要想杀出来需要多久&#xff1f;华为给出的答案是五年。 6月21日&#xff0c;华为迎来了其过去五年来最扬眉吐气的一次开发者大会。大会首日&#xff0c;HarmonyOS NEXT鸿蒙星河版正式开启开发者…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

Idea安装插件刷Leetcode

一、下载插件 idea版本2022以下两个插件都可以用来刷Leetcode 二、登录Leetcode 获取token 登录 三、配置 配置1 配置2 Code FileName C$!velocityTool.leftPadZeros($!{question.frontendQuestionId},4)$!velocityTool.replace(${question.title}," ","&qu…

通过这10个SQL优化手段,让你的SQL提升10倍效率

涉及到SQL优化时&#xff0c;有许多策略和技术可以帮助我们提升查询性能和数据库效率。下面将对10个SQL优化手段详细的说明一下&#xff0c;提供代码。 1.使用索引 在数据库中正确使用索引可以显著提升查询性能。索引可以加速数据的查找和过滤操作。 -- 创建索引 CREATE IND…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

MSPM0G3507 ——GPIO例程讲解2——simultaneous_interrupts

主函数&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();/* Enable Interrupt for both GPIOA and GPIOB ports */NVIC_EnableIRQ(GPIO_SWITCHES_GPIOA_INT_IRQN); //启用SWITCHES——A的中断 NVIC_EnableIRQ(GPIO_S…

Java中的Lambda表达式:从入门到精通

Java中的Lambda表达式&#xff1a;从入门到精通 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Lambda表达式是Java 8引入的一项重要特性&#xff0c;它为Jav…

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using HuffmanTree TreeNode *;结构体包含三个成员&#xff1a; data 是一个 ElemType 类型的变量&#xff0c;用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针&#xf…

2024.06.20【读书笔记】丨生物信息学与功能基因组学(第十六章 真核生物基因组 第四部分)【AI测试版】

《生物信息学与功能基因组学》第十六章读书笔记(第四部分) 真核基因组的比较分析 真核生物基因组的比较分析有助于揭示不同物种间的进化关系和生物学特性。通过比较不同物种的基因组序列,可以发现保守的基因区域和快速进化的基因家族。 基因组水平转移 基因组水平转移是…

MATLAB句柄简记

文章目录 MATLAB句柄函数句柄的简单操作函数 MATLAB句柄 MATLAB平台对于函数调用分为直接调用和间接调用。直接调用即调用子函数。   子函数只能被与它所在M文件同名的主函数或者在M文件内的其他函数调用。一个文件只能有一个主函数。   使用函数句柄可以避免上述问题。句柄…

docker镜像基本操作

文章目录 前言1. 列出本地镜像2. 搜索 Docker Hub 上的镜像3. 拉取镜像4. 删除镜像5. 删除多个镜像6. 强制删除镜像7. 导出镜像8. 导入镜像9. 标记镜像10. 构建镜像11. 检查镜像12. 镜像历史 前言 Docker 镜像是只读模板&#xff0c;用于创建 Docker 容器。以下是一些常用的 D…

(014)Mirror 问题

文章目录 场景里面的无法检测到碰撞、刚体的同步组件异常等&#xff1f;在服务端调用 NetworkServer.Spawn之后&#xff0c;出现了客户端看不到物体情况&#xff1f; 场景里面的无法检测到碰撞、刚体的同步组件异常等&#xff1f; 如果场景是通过 Additive 的方式加载的&#…

强化学习中的自我博弈(self-play)

自我博弈&#xff08;Self-Play&#xff09;[1]是应用于智能体于智能体之间处于对抗关系的训练方法&#xff0c;这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升&#xff0c;使得整个对抗系统…

CBA认证-业务架构师认证的尚方宝剑

CBA业务架构师认证是一种由业务架构师公会&#xff08;Business Architecture Guild&#xff09;授予的专业认证&#xff0c;全称为Certified Business Architect&#xff0c;简称CBA。以下是关于CBA业务架构师认证的主要信息和特点&#xff1a; 认证目的&#xff1a; CBA认证…

for循环 - while循环 - 习题解析

1389. 数据分析 问题描述 某军事单位采用特殊加密方法传递信息。传递一个整数n&#xff08;10位以内&#xff09;&#xff0c;其长度代表第一个数字信息&#xff0c;将n的偶数位相加得到第二个数字信息。要求编写程序从n中获取这两个数字信息。 解题思路 读取输入&#xff1a…

基于淘宝商城用户购物行为数据分析系统

摘 要 在电商行业高速发展的今天&#xff0c;用户购物行为数据量呈指数型增长&#xff0c;传统的数据处理架构已经无法满足于现如今的数据处理需求。针对于这样的需求本课题设计了一种基于淘宝的用户购物行为分析系统&#xff0c;旨在通过对大量数据进行分析处理进而深入研究用…

MybatisPlus 调用 原生SQL

方式一 DemoMapper.java Mapper public interface DemoMapper extends BaseMapper<TableConfig> {Update("${sql}")int createTable(Param("sql") String sql); }测试代码 SpringBootTest class DemoMapperTest {Resourceprivate DemoMapper demo…

Portainer.io安装并配置Docker远程访问及CA证书

Portainer.io安装并配置Docker远程访问及CA证书 文章目录 Portainer.io安装并配置Docker远程访问及CA证书一.安装 Portainer.io2.启动容器 二.docker API远程访问并配置CA安全认证1.配置安全(密钥)访问2.补全CA证书信息3.生成server-key.pem4.创建服务端签名请求证书文件5.创建…

Redis的安装及详解

1.Redis介绍&#xff1f; 1.1 Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server,远程字典服务器&#xff09;是一个开源免费的&#xff0c;用C语言编写的一个高性能的分布式内存数据库&#xff0c;基于内存运行并支持持久化的NoSQL数据库。是当前最热门的…