消息队列的 6 种经典使用场景和 Kafka 架构设计原理详细解析

今天来聊一聊 Kafka 消息队列的使用场景和核心架构实现原理,帮助你全面了解 Kafka 其内部工作原理和设计理念。。

Apache Kafka 是一个高吞吐量、分布式的流处理平台,广泛应用于实时数据管道和流处理应用中。

Kafka 以其高性能、低延迟、扩展性和可靠性,成为了大数据生态系统中的重要组件。

1.消息队列有什么作用

消息队列是一种进程间通信或者同一个进程中不同线程间的通信方式,主要解决异步处理、应用耦合、流量消峰、负载均衡等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

kafka 本质也是一个消息队列,如下图,上游系统将消息发送到消息中间件,下游系统从消息中间件中获取消息消费。

马楼:“上游系统为什么不直接发消息给下游系统,搞个中间商干啥?”

这就要从消息队列的主要作用说起了。

异步处理

消息队列可以实现异步通信,使得发送消息的组件不需要等待接收消息的组件处理完毕,从而提高系统的响应速度和处理效率。

如下图所示,阿斗被邀请去休闲养生 SPA 享受,服务包含泡脚、按摩、吃水果、看电视。

SPA 系统只需要验证啊斗的会员卡有钱就也可以服务了,串行化执行的每个步骤的话,体验太差。可以同时进行,快乐加倍。泡脚、按摩的同时可以同时吃水果看电视,大大提升体验。

图片

应用解耦

如下图所示,采用了消息中间件之后,订单系统将下单消息发送到 MQ 存储,然后各个下游系统从 MQ 中获取消息并执行对应的业务逻辑。

这种异步的方式,减少了服务之间的耦合程度,不然的话,维护订单系统的马楼要哭死,下单后调用多个下游系统,有的系统通过接口调用还必须要求重试机制不能丢失。

有了消息队列后,利用 MQ 本身提供的高可用保证数据不丢失,另外不管你是王启年还是范闲,我就放到消息队列中,你们自己从 MQ 拿,不用再去联系每个系统的维护人员。

图片

流量削峰

在流量高峰期,消息队列可以充当缓冲区,平滑高峰流量,避免系统因瞬时高负载而崩溃。

比如某个接口平时的流量也就 100TPS,特殊时刻会暴增,达到 4000 TPS,一般来说,MySQL 每秒可以处理 2000 个请求,每秒 4000 个请求,可能直接把 MySQL 搞崩溃。

你可以通过消息队列来进行流量削峰,防止把 MySQL 干爆,引入 MQ 后,先将请求存到 MQ 中,MySQL 慢慢处理请求。

图片

负载均衡

Kafka 的 Topic 可以分成多个 Partition,每个 Paritition 类似于一个队列,单个 Paritition 可以保证数据有序。

Kafka 具有优秀的分区分配算法——StickyAssignor,把生产者的消息发送到不同 Paritition,保证 Paritition 的分配尽量地均衡。这样,整个集群的分区尽量地均衡,各个 Broker 和 Consumer 的处理不至于出现太大的倾斜。

同一个 Consumer Group 下的 Consumer 并发消费 Paritition,需要注意的是,如果 Consumer Group 下的 Consumer 个数超过 Partition 数量,那么会出现空闲 Consumer。

图片

顺序保证

每个 Kafka 主题(Topic)可以分为多个分区(Partition)。每个分区都是一个有序的、不可变的消息队列。

生产者(Producer)将消息发送到分区时,Kafka 按消息的发送顺序将其追加到分区的末尾。

消费者(Consumer)读取分区中的消息时,也是按照消息的存储顺序逐条读取。

因此,在同一个分区内,消息的顺序是严格保证的。这对于某些业务场景来说非常重要,特别是需要保证消息顺序性的应用,例如金融交易、订单处理等。

针对消息有序的业务需求,还分为全局有序和局部有序。

  • 全局有序:一个 Topic 下的所有消息都需要按照生产顺序消费。

  • 局部有序:一个 Topic 下的消息,只需要满足同一业务字段的要按照生产顺序消费。例如:Topic 消息是订单的流水表,包含订单 orderId,业务要求同一个 orderId 的消息需要按照生产顺序进行消费。

全局有序

Kafka 的一个 Topic 可分为多个 Partition,Producer 发送消息的时候,kafka 会使用负载均衡策略将消息发送到其中一个 Partition,会导致顺序是乱的。

要保证全局有序,那么一个 Topic 只能存在一个 Partition。而且对应的 Consumer 也要使用单线程或者保证消费顺序的线程模型。

局部有序

要满足局部有序,只需要在发消息的时候指定 Partition Key,Kafka 对其进行 Hash 计算,根据计算结果决定放入哪个 Partition。这样 Partition Key 相同的消息会放在同一个 Partition,从而保证有序。

此时,Partition 的数量仍然可以设置多个,提升 Topic 的整体吞吐量。

容错性

Kafka 提供了消息持久化、重试机制和确认机制,确保消息不会丢失或重复处理,增强系统的容错能力。

2. Kafka 核心组件

终于到今天的主角登场,直接上图。

图片

Kafka 的核心架构由以下几个主要组件组成:

  1. Producer(生产者):发送消息的一方,负责发布消息到 Kafka 主题(Topic)。

  2. Consumer(消费者):接受消息的一方,订阅主题并处理消息。

  3. Broker(代理):服务代理节点,Kafka 集群中的一台服务器就是一个 broker,可以水平无限扩展,同一个 Topic 的消息可以分布在多个 broker 中。

  4. Topic(主题):Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。

  5. Partition(分区):主题的物理分片,提高了并行处理能力。

  6. Replica(副本):副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络一场,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。

  7. ZooKeeper:管理 Kafka 集群的元数据和分布式协调。

3. Topic 和 Partition

来看下什么是 Topic 和 Partition。

3.1 主题(Topic)

Topic 是 Kafka 中数据的逻辑分类单元,可以理解成一个队列。Broker 是所有队列部署的机器,Producer 将消息发送到特定的 Topic,而 Consumer 则从特定的 Topic 中消费消息。

图片

3.2 分区(Partition)

为了提高并行处理能力和扩展性,Kafka 将一个 Topic 分为多个 Partition。

每个 Partition 是一个有序的消息队列,消息在 Partition 内部是有序的,但在不同的 Partition 之间没有顺序保证。

Producer 可以并行地将消息发送到不同的 Partition,Consumer 也可以并行地消费不同的 Partition,从而提升整体处理能力。

图片

3.3 副本(Replica)

每个 Partition 可以有多个副本(Replica),分布在不同的 Broker 上。

Kafka 会为分区的多个副本选举一个作为主副本(Leader),主副本对外提供读写服务,从副本(Follower)实时同步 Leader 的数据。

Kafka 通过副本机制实现高可用性,当一个 Broker 故障时,可以通过副本保证数据不丢失,并继续提供服务。

如下图所示,黄色表示 leader,灰色表示 follower。Topic 分了三个 Patition,副本数是 2。

图片

4. Consumer 和 ConsumerGroup

Kafka 有消费组的概念,每个消费者只能消费所分配到的分区的消息,每一个分区只能被一个消费组中的一个消费者所消费,所以同一个消费组中消费者的数量如果超过了分区的数量,将会出现有些消费者分配不到消费的分区。消费组与消费者关系如下图所示:

图片

5. 数据存储机制

Kafka 的数据存储机制采用了顺序写入磁盘的方式,通过这种方式来提高写入性能。

每个 Partition 的消息被存储在多个 Segment 文件中,每个 Segment 文件由一组连续的消息组成。Segment 文件通过索引和日志文件进行管理,索引文件记录了每条消息在日志文件中的偏移量。

Kafka 的存储机制具备以下几个特点:

  1. 顺序写入:Kafka 通过顺序写入来提高写入速度和磁盘利用率。

  2. Segment 文件:消息被分段存储,便于管理和清理。

  3. 索引机制:通过索引快速定位消息,提高读取效率。

  4. 日志清理策略:支持基于时间和大小的日志清理策略,确保存储空间的有效利用。

图片

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

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

相关文章

Android14 WMS-窗口绘制之relayoutWindow流程(二)-Server端

本文接着如下文章往下讲 Android14 WMS-窗口绘制之relayoutWindow流程(一)-Client端-CSDN博客 然后就到了Server端WMS的核心实现方法relayoutWindow里 WindowManagerService.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server…

任务3.5 清洗网址中的垃圾字符

本实战任务聚焦于数据清洗在Java编程中的应用,特别是清洗网址中的垃圾字符。数据清洗是确保数据质量的重要环节,它帮助开发者去除数据中的异常、错误或无关字符,从而提高数据分析的准确性和有效性。 任务背景:理解数据清洗的重要性…

刷代码随想录有感(93):贪心算法——无重叠区间(区间重叠问题:求区间重叠次数)

题干: 代码&#xff1a; class Solution { public:static bool cmp(vector<int>& a, vector<int>& b){return a[0] < b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), c…

vulnhub靶机实战_DC-2

下载 靶机下载链接汇总&#xff1a;https://download.vulnhub.com/使用搜索功能&#xff0c;搜索dc类型的靶机即可。本次实战使用的靶机是&#xff1a;DC-2下载链接&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 启动 下载完成后&#xff0c;打开VMware软件&#xf…

SendGrid发送邮件时如何调用API接口群发?

SendGrid发送邮件模板如何定制&#xff1f;邮件发送限制有哪些&#xff1f; SendGrid发送邮件是一种方便快捷的方式&#xff0c;可以在应用程序或网站中轻松地发送大量邮件。通过调用SendGrid的API接口&#xff0c;您可以实现群发邮件&#xff0c;无论是通知用户、发送营销邮件…

HDFS文件块损坏处理方案

1、问题概述 flume采集文本文件存储到hdfs中hive的ods层目录,并在hive中通过msck repair table刷新元数据,加载文本文件。报错如下: 2、问题分析 文件块BP-531411289-172.31.57.12-1539657748238出现了未知异常,导致namenode不能获取该文件块的信息,该文件块是由flume采…

小程序开发平台——搭建全功能小程序商城功能 前后端分离 带完整的安装代码包以及搭建教程

系统概述 随着电子商务的蓬勃发展&#xff0c;越来越多的企业和商家希望拥有自己的线上商城&#xff0c;以拓展销售渠道和提升用户体验。然而&#xff0c;传统的商城开发方式往往成本高、周期长&#xff0c;且难以满足快速变化的市场需求。因此&#xff0c;我们致力于打造一款…

成立不到一年,EDA“黑马”再获亿元级融资,国产自主黄金期加速到来

本土EDA厂商派兹互连 再获亿元级融资 电巢获悉&#xff0c;成都派兹互连电子技术有限公司(以下简称“派兹互连”)于近日完成超亿元产业方追加投资&#xff0c;本轮融资将用于研发投入、产品迭代及技术创新等方面。 同时我们了解到&#xff0c;派兹互连已与多家领先EDA/CAE产品…

干货分享:有哪些好用的绩效管理工具?

绩效管理在诸多企业中占据着举足轻重的地位&#xff0c;但同时也是一个令人头痛的问题。特别是在年终的绩效考评环节&#xff0c;它往往变得流于形式&#xff0c;成了一项例行公事。尽管每个人都被要求参与这一流程&#xff0c;但很少有人真正关心考核结果是否公正合理&#xf…

模拟实现priority_queue

文章目录 priority_queue简介priority_queue的实现Myless和Mygreaterpushpop常规接口 全部代码测试代码 总结 priority_queue简介 priority_queue是优先级队列。 什么是优先级队列&#xff1f; 优先级队列&#xff08;Priority Queue&#xff09;是一种数据结构&#xff0c;用于…

579页 | 工业数字孪生建模与应用(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 工业数字孪生建模与应用 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方…

节点间通路

题目链接 节点间通路 题目描述 注意点 图是有向图节点编号大于等于 0 小于 n图中可能存在自环和平行边 解答思路 初始想到的是使用广度优先遍历&#xff0c;从start开始&#xff0c;存储每个点所能到达的其他节点集合&#xff0c;直到到达target或者不能到达新的节点为止&…

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…

服务器数据恢复—raid5阵列磁盘坏道离线导致数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌x3850 X5服务器&#xff0c;服务器上有一组由5块硬盘组建的raid5阵列&#xff08;包含一块热备盘&#xff09;&#xff0c;安装linux操作系统&#xff0c;运行oracle数据库。 服务器故障&#xff1a; 服务器上raid5阵列中两块硬盘由于未…

Vue进阶之Vue无代码可视化项目(四)

Vue无代码可视化项目 左侧栏第一步LeftPanel.vueLayoutView.vuebase.css第二步LayoutView.vueLeftPanel.vue编排引擎smooth-dnd安装创建文件SmoothDndContainer.tsutils.tsSmoothDndDraggable.tsLeftPanel.vue左侧栏 第一步 创建LeftPanel LeftPanel.vue <script setup…

空间数据采集与组织、转换与处理;统计数据、GPS数据、矢量数据、栅格数据、遥感云平台数据、点云数据、多维数据获取及处理

你还在为找不到合适的数据而苦恼吗&#xff1f;你还在面对大量数据束手无策&#xff0c;不知如何处理吗&#xff1f;对于从事生产和科研的人员来说&#xff0c;空间数据的采集与管理是地理信息系统&#xff08;GIS&#xff09;和空间分析领域的关键环节。通过准确高效地采集和管…

层出不穷的大模型产品如何选

目录 1.概述 2.使用体验分享 2.1.功能情况 2.2.内容生成质量 2.3.隐私安全性 2.4.小结 3.独特优势和倾向选择 4.未来发展方向 4.1.技术创新 4.2.可持续可扩展性 4.3.用户体验 4.4.应用场景 4.5.政府赋能 4.6.小结 1.概述 目前市面上的大模型AIGC产品有很多&#…

代码随想录——二叉搜索树中的插入操作(Leetcode701)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第7章——连续性

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 7. 连续性(Continuity) 本章首先讨论连续性的直观概念&#xff0c;并介绍与早期数学中常见的函数不同的函数。解释了连续性的定义&#xff0c;并演示了如何使用它来证明函数在一点上连续&#xff0c;以及证…

支付宝推出AI毛发自测工具,上传照片即可自测脱发等级

根据国家卫健委此前公布的数据&#xff0c;我国超过2.5亿人有脱发困扰&#xff0c;平均每6人中就有1人脱发&#xff0c;且近些年来&#xff0c;脱发群体呈年轻化趋势。为了帮助应对“秃”如其来的脱发问题&#xff0c;今日&#xff0c;支付宝发布“AI毛发自测”工具&#xff0c…