当前位置: 首页 > news >正文

从软件架构设计角度理解Kafka

网上对于消息中间件的介绍文章比较多,这里我们不再赘述,我们换个思路来理解消息中间件,从软件开发架构的角度来看下消息中间件是如何诞生和演进的。

一、概述

在这里插入图片描述
上图中P代表 Provider,C代表Consumer,下同。P和C是一个典型的生产消费者模式,也可以理解为客户和服务端。如果P生产效率为200qps(200/秒),而C的消费效率只有100qps,长此以往必将造成数据的积压,积压到一定程序应用就有可能崩溃了。

解决方案也先简单,架构方案的万能公式,通过中间层解决(当然了也可以再添加一个C形成一个消费集群,但这里我们暂时不讨论这种方案),如果加一层不行就再加一层。当然了如果能一层解决的最好不要再二层是不,这次的中间层就是消息中间件:Kafka。
在这里插入图片描述

二、消息中间件的由来

紧接上图描述,上面这种性能不对等的问题出现的一定会比kafka要早,那么当时是如何解决的呢?所以此处先忘掉kafka吧,让我们从头来看下kafka是如何沉淀出来的。
在这里插入图片描述
性能不对等,可以选择在C端加入一个中间管道-队列(Queue),即数据(消息Msg)先到达C端的队列中先缓冲一下,然后再传给消息程序正式处理(此处的数据在下文中就用消息来代替),这样就解决了Msg积压的问题也能保证所有的Msg全能被C消费。

看似性能不对等的问题解决了,但引入了另一个问题,就是Queue和C同属于同一个进程,如果C崩溃了话,未来得及消息的消息就全部丢失了,如下图所示:
在这里插入图片描述

三、消息中间件的设计演进

1、 Msg丢失问题

如何解决呢,方案也很简单,把Queue独立到单独进程中就可以了:
在这里插入图片描述
非常好,没啥问题了,消息不对等,数据丢失问题全解决了。回头看下初具消息中间件的样子了,但有一个问题就是在分布式生产环境下,上面的设计对于高性能、高可用、高扩展是一点没有提呀,如果Queue进程突然崩了,那这设计也真够糊弄人的。所以接下来还要考虑可用和稳定的问题

2、 高性能解决方案

这个问题很好理解呀,原来Queue的两端各是一个P和C,那么多增加几个就行了。
在这里插入图片描述
现在再看下,Queue现在可以同时连接多个P和C了,只要假设Queue足够NB,那么这个系统理论上就很无敌了,不过呢假设就是假设,先不说Queue性能有多好,就是无限的增加P之间的资源争抢也够Queue喝一壶的了,本来P1就要发1条消息,好吧还要等P2的10000条发完才能发,哭死了。如下图所示,好吗,白设计一圈了又回到了最原始的状态的。
在这里插入图片描述
分析上图,不就是Queue被争抢吗,那么多增加几个Queue不就行了,但这里的增加不是增加多个节点,而是把P1和P2发送的消息分离开,因为多增加节点还是解决不了问题,所以就有了下面的设计:

Topic设计

在这里插入图片描述
好吧,这样一区分,P1和P2的消息就分离开了,相互之间不再相互影响了,这里有了消息中间件的另一个概念:Topic:用于给不同类型消息定义一个标签。同样的P这边处理了,C端也存在资源争抢的问题呀,如下图:
在这里插入图片描述

Partition 设计

虽然P端的消息通过Topic隔离开了,但如果某个Topic消息过多,还是会产生同样的问题,现在上述的隔离方案又不能用了,怎么办呢?没啥好办法,还得隔离:
在这里插入图片描述
单队列再拆分吧,数据多了就分开放置,即采用Partition,这里就有了另一个概念。非常好,数据存储问题解决了。然后让C与Partition对应:
在这里插入图片描述
这样C也不会争抢资源了。至此,可以解决了大部分性能问题,但还是存在问题,即某个Patition中的消息过多,还是会存在C端性能问题

Consumer Group设计

既然有性能问题,那么就多加几个吧。
在这里插入图片描述
针对每个Patition对应一个消费组,每个组会从指定的队列位置消费消息,指定的位置在消息中间件中称为offset。

至此,好像性能问题没啥了,通过各种护展和分组解决的七七八八了,那么解决其它问题了哈。

3、高可用解决方案

上面我们对Queue的设计全是单机进行的,时间一长肯定会引发单点问题,这个是不可接受的。
在这里插入图片描述

Broker

解决吧,即然是单点,那就多加几个节点了。
在这里插入图片描述
如上图,我们把不同的Prtition放布到不同的节点上,这样可以减少一些单点问题。至少当机器A宕机了,只丢失了Partition1和Partition2的数据,还保留了一部分。没办法还得解决呀:

Replicas

增加副本吧,给机器A和B分别增加副本,使其数据保持一致,这样当机器A坏了,机器C顶上就行了,如果机器A和C同时坏了呢?那就增加了机器D,这样1主2副本同时坏的可能性不大了吧。
在这里插入图片描述
那么问题又来了,当机器A坏了,机器C咋顶上,谁来切换?总不能每次出问题了穿衣下地、打车去公司切吧,真要这样黄花菜都冻冰了。估计程序员也会凉凉了。所以还是自动吧。

Leader和Follower

怎么个自动法呢,好办,我们把主和副本机器分别标注一下角色,主称为Leader, 从称为Followr,然后呢再指定一个管理者Manager,然后让Manager与L和F互相通信,实时监控,这时当Leaer坏了,Manager就指定一个Follower为新的Leader,这样就成了一个自动切换程序了,程序员们也可以晚点凉凉了。
在这里插入图片描述
上面需要注意Leader和Follower不能位于同一个主机上呀,如果位于同一个机器上,那么Manager也无能为力了,所以要放在不一样的机器上。

我们已经做的很好了,但老天不做美,停机了,整个IDC机房都停电了。这回切也没用了,一锅端了
哎,还得解决呀。

manger 这种自动选举机制可集成zk这样的软件来处理。

4、 高扩展解决方案

如上,如果停机这东西无法处理,那么扯啥呢。解决吧,不就是丢数据吗,kafka数据在运行时数据是存放在内存中的。
在这里插入图片描述

那么存磁盘吧。
在这里插入图片描述
不错,当时存磁盘,来电了后重启服务从磁盘重新加载就行了。至于能不能全部恢复,那么就不再处理了吧(实际上可以做到0数据丢失)。到这差不多了。
可是,但可以是磁盘毕竟空间有限,你这成天往里存一会就爆了,内存是同样的道理

过期策略

没用的数据就删除了吧。
在这里插入图片描述
定几个超时策略吧,FIFO还是FILO自己按场景选择吧。

EN,差不多了,基本可用了吧。

四、 小结

一套组合拳下来,一个简单的队列,就完成了现在的MQ消息中间件了。起个名吧就中Kafka。
在这里插入图片描述

您学废了吗?

相关文章:

从软件架构设计角度理解Kafka

网上对于消息中间件的介绍文章比较多,这里我们不再赘述,我们换个思路来理解消息中间件,从软件开发架构的角度来看下消息中间件是如何诞生和演进的。 一、概述 上图中P代表 Provider,C代表Consumer,下同。P和C是一个典型…...

什么是中断?

1.什么是中断 2.中断的重要性 3.中断的上下半部 4.中断处理流程 中断的原则 5.ARM处理器程序运行过程 6.程序被被中断时,怎么保护现场 1.什么是中断 中断是指在 CPU 正常运行期间, 由外部或内部事件引起的一种机制。 当中断发生时,…...

后端(实例)08

设计一个前端在数据库调取数据的表格&#xff0c;并完成基础点击增删改查的功能&#xff1a; 1.首先写一个前端样式&#xff08;空壳&#xff09; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here&l…...

【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机

TIM定时器输出比较 一、输出比较简介1、OC&#xff08;Output Compare&#xff09;输出比较2、PWM简介3、输出比较通道(高级)4、输出比较通道(通用)5、输出比较模式6、PWM基本结构配置步骤&#xff1a;程序代码&#xff1a;PWM驱动LED呼吸灯 7、参数计算8、舵机简介程序代码&am…...

如何使用ssm实现线上旅游体验系统+vue

TOC ssm691线上旅游体验系统vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提升&#xff0…...

探索JMeterTools:一个Python驱动的JMeter脚本生成器

JMeterTools 简介 JMeterTools 是一个由 Python 编写的开源项目&#xff0c;旨在帮助测试人员快速生成 JMeter 测试脚本。通过简单的 Python API&#xff0c;用户可以方便地定义测试计划、线程组、HTTP 请求等&#xff0c;可以结合接口自动化测试项目&#xff0c;将接口自动化…...

【React】组件通信

1. 组件通信 组件间的数据传递 1.1 父传子 步骤&#xff1a; 父组件传递数据——在子组件标签上绑定属性子组件接收数据——子组件通过props参数接收数据 function Son(props) {return <div>{props.value}</div> }function App() {const value 父组件传给子…...

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

目录 1.数组类 2.运算符重载 2.1加号运算符 2.1.1成员函数实现 2.1.2全局函数实现 2.1.3加号重载 2.2左移运算符 2.3递增运算符 2.4指针运算符 2.5赋值运算符 1.数组类 //默认构造函数 MyArray::MyArray() {m_Size 0;m_Capacity 100;pAddress new int[m_Capacity]…...

echarts地图的简单使用

echarts地图的简单使用 文章说明核心源码效果展示源码下载 文章说明 主要介绍echarts地图组件的简单使用&#xff0c;记录为文章&#xff0c;供后续查阅使用 目前只是简单的示例&#xff0c;然后还存在着一些小bug&#xff0c;主要是首个Legend的点击会导致颜色全部不展示的问题…...

Qt 项目优化实践方向

目录 1. 使用智能指针2. 避免在全局或静态作用域中使用裸指针3. 利用Qt的对象树进行资源管理4. 延迟加载和按需加载资源5. 合理使用Qt的资源文件&#xff08;qrc&#xff09;6. 监控和调试内存使用7. 优化数据结构8. 减少不必要的资源复制9. 使用缓存机制10. 遵循RAII原则 以下…...

常见的15个:自然语言处理(NLP)实战项目

自然语言处理&#xff08;NLP&#xff09;实战项目涵盖了从基础到高级的多个领域&#xff0c;以下是一些常见的NLP实战项目&#xff0c;每个项目都附带了简要的描述和可能用到的技术栈&#xff1a; 1. 文本分类&#xff08;Text Classification&#xff09; 描述: 将文本数据…...

CKKS同态加密通用函数近似方法和openFHE实现

摘要 同态加密可以直接在密文上进行运算&#xff0c;尤其是CKKS&#xff0c;可以直接在实数的密文上进行运算。服务器可以利用强大的计算能力&#xff0c;在不泄露用户隐私的情况下&#xff0c;为用户提供便捷的外包运算服务。然而&#xff0c;CKKS只能进行算术运算&#xff0…...

Webpack 5的新特性:Asset Modules与Dynamic Import

文章目录 Asset ModulesAsset Modules 类型配置示例分析 Dynamic Import动态导入语法配置示例分析 实际案例分析Asset Modules 实际案例Dynamic Import 实际案例 性能优化Asset Modules 性能优化Dynamic Import 性能优化 详细代码分析Asset Modules 代码分析Dynamic Import 代码…...

解释python requests包的timeout

解释python requests包的timeout 哈哈哈。。。。垃圾python又来了 1 问题 你能看懂下面两个timeout的含义就不用看下面的内容了。 requests.get(http://example.com, timeout(2, 5)) requests.get(http://127.0.0.1:5000/api,timeout1)官网解释&#xff01;&#xff01;&am…...

蒙语学习快速方法,速记蒙语单词怎么学习更高效!

要高效学习蒙古语和速记单词&#xff0c;首先要掌握基础知识&#xff0c;如字母表和发音规则。接着&#xff0c;专注于学习日常用语和基础词汇&#xff0c;并运用记忆技巧如联想、发音和构词法来帮助记忆。利用专门的学习软件&#xff0c;如“蒙语学习通”&#xff0c;可以提供…...

Vue3组件通信13种方法

在 Vue3 中,组件之间的通信是构建应用程序的关键 1. 父组件向子组件传递数据 (Props)「父组件:」「子组件:」 2. 子组件向父组件传递数据 (Emit)「父组件:」「子组件:」 3. 兄弟组件通信 (Mitt)「发送事件的组件:」「接收事件的组件:」 4. 透传 Attributes ($attrs)「父组件:」…...

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…...

代码随想录算法训练营第三七天| 动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换

今日任务 动态规划&#xff1a;完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换 518.零钱兑换II 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount …...

[报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface

一、报错详情 requests.exceptions.ConnectTimeout:(MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /ybelkada/fonts/resolve/main/Arial.TTF (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnec…...

B-树(不是B减树)原理剖析(1)

目录 B树的主要特性&#xff1a; B树的操作&#xff1a; B树的优点&#xff1a; 为什么要发明出B-树&#xff1f; B树的概念和原理剖析 原理图讲解(部分讲解在图中) 初始化结点&#xff1a; 处理数据数量计算(了解) 底层代码实现(加深理解) 前些日子我们学了AVl树&…...

告别Vivado依赖!手把手教你用Modelsim独立仿真Vivado IP核(附PLL报错解决方案)

深度解析&#xff1a;如何高效利用Modelsim独立仿真Vivado IP核 在FPGA开发领域&#xff0c;仿真环节往往成为项目进度的瓶颈。许多工程师习惯性地依赖Vivado自带的仿真环境&#xff0c;却忽视了专业仿真工具Modelsim的强大性能。本文将带您突破这一局限&#xff0c;掌握脱离Vi…...

【Nanobot】README09_LEVEL4 添加新聊天渠道

【Nanobot】README09_LEVEL4 添加新聊天渠道 源码地址&#xff1a;https://github.com/HKUDS/nanobot &#x1f3af; 目标 指导如何为 nanobot 添加新的聊天渠道&#xff08;如 Signal、Matrix、Line 等&#xff09;。 &#x1f4cb; 添加新 Channel 的步骤 步骤 1&#xff1…...

3步搞定Windows安卓应用安装:告别模拟器的全新体验

3步搞定Windows安卓应用安装&#xff1a;告别模拟器的全新体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行手机应用&#xff0c;却…...

Glovebox:本地开发环境编排工具,解决混合环境管理与服务依赖难题

1. 项目概述&#xff1a;一个被低估的本地开发利器如果你是一名开发者&#xff0c;尤其是经常在本地搭建各种服务、测试不同技术栈的工程师&#xff0c;那么你一定对“环境配置”这件事深恶痛绝。每次新开一个项目&#xff0c;都要重复安装依赖、配置数据库、设置网络端口、处理…...

脑信号→自然语言转化失败率骤降62%?NotebookLM v2.3神经对齐模块深度拆解,仅限首批内测开发者知晓

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM脑机接口研究 NotebookLM 是 Google 推出的基于用户自有文档进行语义理解与推理的实验性 AI 工具&#xff0c;虽其官方定位并非直接面向脑机接口&#xff08;BCI&#xff09;领域&#xff0c;但其底…...

别再为MATLAB+Amesim联合仿真装环境发愁了!保姆级VS2019+2022a+2021.1安装避坑指南

MATLABAmesim联合仿真环境搭建全攻略&#xff1a;从零避坑到一次成功 当第一次接触MATLAB与Amesim联合仿真时&#xff0c;许多工程师和研究生都会在环境搭建阶段遭遇各种"玄学问题"——明明按照教程操作&#xff0c;却总是卡在某个环节无法继续。本文将分享一套经过…...

别再手动画图表了!用这套Figma可视化组件库7.0,5分钟搞定大屏设计稿

别再手动画图表了&#xff01;用这套Figma可视化组件库7.0&#xff0c;5分钟搞定大屏设计稿 凌晨3点的设计工作室里&#xff0c;咖啡杯已经空了第三轮。李然盯着屏幕上那个反复修改了7次却始终不够"科技感"的柱状图&#xff0c;突然意识到——设计师的时间不该浪费在…...

Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python 开发者五分钟接入 Taotoken 调用 GPT 与 Claude 模型 对于需要在项目中集成大语言模型的 Python 开发者而言&#xff0c;逐…...

2026实测:能耗管控场景下的AI工具数据分析能力横向对比,实在Agent如何通过ISSUT打破数据孤岛?

【摘要】 步入2026年&#xff0c;全球能源结构转型进入深水区。随着数据中心耗电量突破1000太瓦时&#xff08;TWh&#xff09;以及工业领域对“双碳”目标的刚性对标&#xff0c;能耗管控场景已成为企业运营的战略核心。然而&#xff0c;企业在推进自动化能效管理时&#xff0…...

终极指南:5步掌握番茄小说下载器的完整使用方案

终极指南&#xff1a;5步掌握番茄小说下载器的完整使用方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代&#xff0c;我们常常面临一个共同的问题&#xff1…...