大聪明教你学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…

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…

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…

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

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

强化学习中的自我博弈(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认证…

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

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

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数据库。是当前最热门的…

uniapp(全端兼容) - 最新详细实现刻度尺组件效果,uni-app实现尺子打分及手指拖动刻度尺打分评分功能,可左右滑动刻度尺改变数值、带刻度尺滑块功能、

效果图 在uniapp微信小程序/手机h5网页网站/安卓app/苹果app/支付宝小程序/nvue等(全平台完美兼容)开发中,实现uniApp各端都兼容的 “刻度尺(横格尺 | 尺子)” 手势左右两侧拖动、手指滑动刻度尺功能,水平刻度尺,支持自定义尺子颜色、大小、刻度、滑动时的步进值、最大…

分享计算机msvcp100.dll,丢失或找不到的7个解决方法

msvcp100.dll是动态链接库文件对于执行使用 Microsoft Visual C 2010 编译器编译的应用程序至关重要。它包含了 C 标准库的实现&#xff0c;提供了应用程序运行时所需的核心功能&#xff0c;如输入/输出操作、字符串处理、数学运算和异常处理等。若系统中缺失或损坏此文件&…

【详细】一步一步实现一个BP神经网络-逐行代码解说

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ ​ 要如何使用代码实现一个BP神经网络呢&#xff1f; 下面跟随笔者&#xff0c;一步一步详细来实现&#xff0c;再对代码进行详细解说。 通过本文可以详细掌握怎么使用matlab来实现一个BP神经网络。 一、一步一步实…

# 消息中间件 RocketMQ 高级功能和源码分析(八)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;八&#xff09; 一、消息中间件 RocketMQ 源码分析&#xff1a;实时更新消息消费队列与索引文件流程说明 1、实时更新消息消费队列与索引文件 消息消费队文件、消息属性索引文件都是基于 CommitLog 文件构建的&#xff0…

点击旋转箭头样式

实现效果&#xff1a; html界面&#xff0c;主要通过isdown来控制箭头是上还是下 <el-popoverplacement"bottom"trigger"click":visible-arrow"false"v-model"isdown"popper-class"user-popover"><divslot"re…

热点观察 | 全球社交应用IAP收入持续上升,小游戏、短剧出海赛道火热!

2024年进度条即将过半&#xff0c;回顾上半年&#xff0c;“Sora横空出世”、“短剧出海”、“小游戏爆款不断"给了我们太多惊喜&#xff0c;虽说如今市场竞争激烈、行业日趋饱和&#xff0c;但新技术、新需求也在快速跟上。下面&#xff0c;我们就来盘一盘近期全球手游和…

【数据库】数据库脚本编写规范(Word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

Linux常用命令(15)—grepsed命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

常见调试器介绍

目录 常见调试器 1.1 ST-Link 1.2 DAPLink 1.3 JLink 常见调试器 市面上有很多的调试器&#xff0c;下面是大家比较常见的一些调试器&#xff0c; 比如&#xff1a;ST-Link、DAPLink、JLink、Ulink等 1.1 ST-Link ST-Link是一种用于STM8及STM32系列单片机的调试器和下载…