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

中间件——Kafka

两个系统各自都有各自要去做的事,所以只能将消息放到一个中间平台(中间件)

Kafka

分布式流媒体平台
在这里插入图片描述
程序发消息,程序接收消息
在这里插入图片描述
Producer:Producer即生产者,消息的产生者,是消息的入口。
Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……
Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
Message:每一条发送的消息主体。
Consumer:消费者,即消息的消费方,是消息的出口。
Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
同一个组下,订阅的主题只能有一个消费者收到消息(一对一)
放到不同 的组下,就能实现一对多
Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。
Kafka对于zookeeper是清以来,保存kafka相关节点数据,管理节点。安装Kafka前需先安装zookeeper

1.Kafka生产者和消费者详解

Kafka设计与原理详解

生产者

在这里插入图片描述

消费者

在这里插入图片描述
在这里插入图片描述
谁增加while 让它一直处于监听状态

2.分区机制

加你个主题划分为多个分区(Partition)
可以处理更多的消息,不受单服务器限制,可以不受限的处理更多数据。
消息发送时都被发送到一个topic,其本质就是一个目录,而topic由是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:
在这里插入图片描述
我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值
Kafka需要维持的元数据只有一个–消费消息在Partition中的offset值(偏移量-连续自增的数值),Consumer每消费一个消息,offset就会加1。其实消息的状态完全是由Consumer控制的,Consumer可以跟踪和重设这个offset值,这样的话Consumer就可以读取任意位置的消息。
把消息日志以Partition的形式存放有多重考虑,第一,方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了**;第二就是可以提高并发**,因为可以以Partition为单位读写了。

3.Kafka高可用机制

集群

在这里插入图片描述

备份

有了备份机制后,Kafka允许集群中的节点挂掉后而不影响整个集群工作。一个备份数量为n的集群允许n-1个节点失败。在所有备份节点中,有一个节点作为lead节点,这个节点保存了其它备份节点列表,并维持各个备份间的状体同步。
在这里插入图片描述
Kafka 提供了一种基于副本(Replication)的备份机制,以确保数据的高可用性和容错能力。以下是 Kafka 备份机制的详细说明:

  • 1.副本(Replicas)与分区(Partitions)
    在 Kafka 中,主题(Topic)被划分为多个分区(Partition),每个分区都有多个副本。Leader 副本负责处理所有对该分区的读写请求,而Follower 副本则从 Leader 副本同步数据。这样,即使某个 Broker(即 Leader 副本所在节点)发生故障,其他 Broker 上的 Follower 副本可以迅速晋升为新的 Leader,继续提供服务。

  • 2.副本分配与复制
    副本分配:Kafka 使用 ZooKeeper 管理元数据,包括分区与副本的分配信息。在创建主题时,可以指定每个分区的副本数(通常称为副本因子)。Kafka 会根据 Broker 配置和可用性,将分区的副本均匀地分布到不同的 Broker 上,以实现负载均衡和容错。

数据复制:Producer 发送消息到 Leader 副本。Leader 副本将消息写入其本地日志后,立即将消息发送给所有 Follower 副本。Follower 副本接收到消息后,将其写入本地日志。这种同步复制或异步复制(取决于配置)机制确保了数据在集群中的复制。

  • 3.ISR(In-Sync Replicas)与副本同步
    ISR:Kafka 维护了一个名为 ISR(In-Sync Replicas)的集合,包含所有与 Leader 副本保持同步的 Follower 副本。只有 I**SR 中的副本被认为是可以安全地晋升为 Leader 的候选者。**当 Follower 副本由于网络延迟、Broker 故障等原因与 Leader 副本失去同步时,会被暂时移出 ISR。

副本同步:Kafka 通过心跳机制监控 Follower 副本与 Leader 副本的同步状态。Follower 副本定期向 Leader 副本发送心跳,报告其已复制的消息偏移量。Leader 副本根据心跳信息判断 Follower 副本是否处于同步状态,并据此更新 ISR 集合。

**4. Leader 选举与故障恢复
Leader 选举:当 Leader 副本所在的 Broker 发生故障时,ZooKeeper 会检测到并触发 Leader 选举。从 I
SR 集合中选择一个 Follower 副本晋升为新的 Leader。**其余 Follower 副本随后将与新的 Leader 建立连接并开始同步。

故障恢复:一旦新的 Leader 副本被选举出来,Producer 和 Consumer 可以无缝地切换到新的 Leader 进行读写操作。对于未完成同步的 Follower 副本,它们将在恢复连接后从新的 Leader 处拉取缺失的数据,直至重新加入 ISR。

4.消息可靠性

在消息系统中,保证消息在生产和消费过程中的可靠性是十分重要的,在实际消息传递过程中,可能会出现如下三中情况:

  • 一个消息发送失败
  • 一个消息被发送多次
  • 最理想的情况:exactly-once ,一个消息发送成功且仅发送了一次

有许多系统声称它们实现了exactly-once,但是它们其实忽略了生产者或消费者在生产和消费过程中有可能失败的情况。比如虽然一个Producer成功发送一个消息,但是消息在发送途中丢失,或者成功发送到broker,也被consumer成功取走,但是这个consumer在处理取过来的消息时失败了。
(1)从Producer端看:Kafka是这么处理的,当一个消息被发送后,Producer会等待broker成功接收到消息的反馈(可通过参数控制等待时间),如果消息在途中丢失或是其中一个broker挂掉,Producer会重新发送(我们知道Kafka有备份机制,可以通过参数控制是否等待所有备份节点都收到消息)。
(2)从Consumer端看:前面讲到过partition,broker端记录了partition中的一个offset值,这个值指向Consumer下一个即将消费message。当Consumer收到了消息,但却在处理过程中挂掉,此时Consumer可以通过这个offset值重新找到上一个消息再进行处理。Consumer还有权限控制这个offset值,对持久化到broker端的消息做任意处理。

5.生产者详解

发送类型

在这里插入图片描述
在这里插入图片描述
异步时响应回调函数。
消息发送失败时会抛出异常,这是可以拿到异常,用于记录或做出补偿。

6.消费者详解

在这里插入图片描述
在这里插入图片描述
只有在一个分区,才能保证消息有序。

手动提示偏移量

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
同步提交尽可能会造成方法堵塞。在这里插入图片描述
在这里插入图片描述
如果异步提交成功则会一直在while(true)监听中,如果出现异常才会捕获异常,捕获完异常后才会执行finally中的同步提交操作

7.Spring集成Kafka

在这里插入图片描述

在这里插入图片描述
异步,通过回调方式实现:

//发送消息
public void sendMessage(String message) {ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topicName, message);future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {@Overridepublic void onSuccess(SendResult<String, String> result) {System.out.println("Sent message=[" + message + "] with offset=[" + result.getRecordMetadata().offset() + "]");}@Overridepublic void onFailure(Throwable ex) {System.out.println("Unable to send message=[" + message + "] due to : " + ex.getMessage());}});
}
//接收消息
@KafkaListener(topics = "topicName", groupId = "foo")
public void listenGroupFoo(String message) {System.out.println("Received Message in group foo: " + message);
}

一个消费者可以监听多个主题:

@KafkaListener(topics = "topic1, topic2", groupId = "foo")

Spring也支持获取一个或多个消息头信息,通过在监听器上是哟个@Header注解:

@KafkaListener(topics = "topicName")
public void listenWithHeaders(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {System.out.println("Received Message: " + message" + "from partition: " + partition);
}

相关文章:

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…...

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;又成为调停者模式&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用&#xff0c;从而使其耦合…...

定个小目标之刷LeetCode热题(45)

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"有事…...

golang 实现负载均衡器-负载均衡原理介绍

go 实现负载均衡器 文章目录 go 实现负载均衡器代码实现介绍负载均衡的核心组件与工作流程核心组件工作流程 总结 算法详细描述&#xff1a;1. 轮询&#xff08;Round Robin&#xff09;2. 最少连接&#xff08;Least Connections&#xff09;3. IP散列&#xff08;IP Hash&…...

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…...

大模型预训练优化参数设置

文章目录 基于批次数据的训练学习率优化器稳定优化技术与传统神经网络的优化类似,通常使用批次梯度下降算法来进行模型参数的调优。同时,通过调整学习率以及优化器中的梯度修正策略,可以进一步提升训练的稳定性。为了防止模型对数据产生过度拟合,训练中还需要引入一系列正则…...

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中&#xff0c;我们学习了一些PHP extension for C的基本内容&#xff0c;下面结合一…...

【Python学习笔记】:Python爬取音频

【Python学习笔记】&#xff1a;Python爬取音频 背景前摇&#xff08;省流可以不看&#xff09;&#xff1a; 人工智能公司实习&#xff0c;好奇技术老师训练语音模型的过程&#xff0c;遂请教&#xff0c;得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…...

4 C 语言控制流与循环结构的深入解读

目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…...

vue排序

onEnd 函数示例&#xff0c;它假设 drag.value 是一个包含多个对象&#xff08;每个对象至少包含 orderNum 和 label 属性&#xff09;的数组&#xff0c;且您希望在拖动结束后更新所有元素的 orderNum 以反映新的顺序&#xff1a; function onEnd(e) { // 首先&#xff0c;确…...

agv叉车slam定位精度测试标准化流程

相对定位精度 条件&#xff1a;1.5m/s最高速度&#xff1b;基于普通直行任务 数据采集&#xff08;3个不同位置的直行任务&#xff0c;每个任务直行约10m&#xff0c;每个10次&#xff09; 测量每次走过的实际距离&#xff0c;与每次根据定位结果算得的相对距离&#xff0c;两…...

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…...

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 &#xff08;以下为错误示例&#xff09; 以上两者的…...

交叉编译aarch64的Qt5.12.2,附带Mysql插件编译

一、配置交叉编译工具链 1、交叉编译工具链目录 /opt/zlg/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu/bin/aarch64-rockchip-linux-gnu-g /opt/zlg/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linu…...

好用的Ubuntu下的工具合集[持续增加]

1. 终端工具 UBUNTU下有哪些好用的终端软件? - 知乎 (zhihu.com) sudo apt install terminator...

Xcode 16 beta3 真机调试找不到 Apple Watch 的尝试解决

很多小伙伴们想用 Xcode 在 Apple Watch 真机上调试运行 App 时却发现&#xff1a;在 Xcode 设备管理器中压根找不到对应的 Apple Watch 设备。 大家是否已将 Apple Watch 和 Mac 都重启一万多遍了&#xff0c;还是束手无策。 Apple Watch not showing in XCodeApple Watch wo…...

Three.JS 使用RGBELoader和CubeTextureLoader 添加环境贴图

导入RGBELoader模块&#xff1a; import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"; 使用 addRGBEMappingk(environment, background,url) {rgbeLoader new RGBELoader();rgbeLoader.loadAsync(url).then((texture) > {//贴图模式 经纬…...

k8s logstash多管道配置

背景 采用的是标准的ELKfilebeat架构 ES版本&#xff1a;7.17.15 logstash版本&#xff1a;7.17.15 filebeat版本&#xff1a; 7.17.15 helm版本&#xff1a;7.17.3&#xff0c;官方地址&#xff1a;elastic/helm-charts 说一下为什么会想到使用多管道的原因 我们刚开始…...

【CMU博士论文】结构化推理增强大语言模型(Part 0)

问题 &#xff1a;语言生成和推理领域的快速发展得益于围绕大型语言模型的用户友好库的普及。这些解决方案通常依赖于Seq2Seq范式&#xff0c;将所有问题视为文本到文本的转换。尽管这种方法方便&#xff0c;但在实际部署中存在局限性&#xff1a;处理复杂问题时的脆弱性、缺乏…...

Odoo创建一个自定义UI视图

Odoo能够为给定的模型生成默认视图。在实践中&#xff0c;默认视图对于业务应用程序来说是绝对不可接受的。相反&#xff0c;我们至少应该以合乎逻辑的方式组织各个字段。 视图在带有Actions操作和Menus菜单的 XML 文件中定义。它们是模型的 ir.ui.view 实例。 列表视图 列表视…...

Day16_集合与迭代器

Day16-集合 Day16 集合与迭代器1.1 集合的概念 集合继承图1.2 Collection接口1、添加元素2、删除元素3、查询与获取元素不过当我们实际使用都是使用的他的子类Arraylist&#xff01;&#xff01;&#xff01; 1.3 API演示1、演示添加2、演示删除3、演示查询与获取元素 2 Iterat…...

html2canvas + jspdf 纯前端HTML导出PDF的实现与问题

前言 这几天接到一个需求&#xff0c;富文本编辑器的内容不仅要展示出来&#xff0c;还要实现展示的内容导出pdf文件。一开始导出pdf的功能是由后端来做的&#xff0c;然后发现对于宽度太大的图片&#xff0c;导出的pdf文件里部分图片内容被遮盖了&#xff0c;但在前端是正常显…...

【JVM】JVM调优练习-随笔

JVM实战笔记-随笔 前言字节码如何查看字节码文件jclasslibJavapArthasArthurs监控面板Arthus查看字节码信息 内存调优内存溢出的常见场景解决内存溢出发现问题Top命令VisualVMArthas使用案例 Prometheus Grafana案例 堆内存情况对比内存泄漏的原因:代码中的内存泄漏并发请求问…...

如何解决 CentOS 7 官方 yum 仓库无法使用

一、背景介绍 编译基于 CentOS 7.6.1810 镜像的 Dockerfile 过程中,执行 yum install 指令时,遇到了错误:Could not resolve host: mirrorlist.centos.org; Unknown error。 二、原因分析 官方停止维护 CentOS 7。该系统内置的 yum.repo 所使用的域名 mirrorlist.centos.o…...

分布式唯一id的7种方案

背景 为什么需要使用分布式唯一id&#xff1f; 如果我们的系统是单体的&#xff0c;数据库是单库&#xff0c;那无所谓&#xff0c;怎么搞都行。 但是如果系统是多系统&#xff0c;如果id是和业务相关&#xff0c;由各个系统生成的情况下&#xff0c;那每个主机生成的主键id就…...

嵌入式物联网在医疗行业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在医疗行业中的应用——案例分析引言1. 智能病房监控1.1 实时患者监控系统 2. 智能医疗设备管理2.1 设备使用跟踪与维护 3. 智能药物管理3.1 药物分配与跟踪 4. 智能远程医疗4.1 远程患者监控与诊断 总结 嵌入式物联网在医疗行业中的应…...

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1&#xff1a;什么是内存&#xff1f; 序2&#xff1a;地址是怎么产生的&#xff1f; 一、指针是什么 1、指针变量的创建及其意义&#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…...

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言&#xff08;ERNIE Bot&#xff09;是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍&#xff1a; 一、产品背景与技术基础 技术背景&#xff1a;百度…...

AI绘画入门实践|Midjourney 的模型版本

模型分类 Midjourney 的模型主要分为2大类&#xff1a; 默认模型&#xff1a;目前包括&#xff1a;V1, V2, V3, V4, V5.0, V5.1, V5.2, V6 NIJI模型&#xff1a;目前包括&#xff1a;NIJI V4, NIJI V5, NIJI V6 模型切换 你在服务器输入框中输入 /settings&#xff1a; 回车后…...

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及&#xff0c;Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一&#xff0c;不仅在金融和供应链管理等领域展示了其巨大的潜力&#xff0c;也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…...

涞水住房和城乡建设委员会网站/seo网站推广批发

前言&#xff1a;要秋招了&#xff0c;复习一下应对秋招&#xff0c;纠结该先看啥&#xff0c;最后决定先学习《Java高并发编程详解》&#xff0c;此博客为看书所写的笔记&#xff0c;因为是笔记&#xff0c;所以会只记比较重要的东西&#xff0c;不适合初学者。 参考&#xf…...

做网站这个工作怎么样/seo是什么技术

需求描述 在表单中&#xff0c;可能部分表单项需封装成自定义组件&#xff0c;如何在表单提交时&#xff0c;能同步触发自定义组件的表单校验&#xff1f; 解决方案 将表单绑定的变量传入自定义组件中&#xff0c;在自定义组件中定义表单校验规则 完整代码范例 表单 内嵌自定义…...

自己弄网站怎么弄/seo优化排名软件

进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename&#xff1a;打开文件&…...

网站框架地图/百度竞价推广思路

背景 最近用爬虫爬网页需要用到lxml包中的etree模块。我的pycharm中已经内置了lxml包最新的4.2.4版&#xff0c;然而这个版本居然丢掉了etree模块。搜了网上各种解决方法&#xff0c;搞定了这个问题。 然后就开始使用了...

制作网站工具/网站一般怎么推广

719. 找出第 k 小的距离对 给定一个整数数组&#xff0c;返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。 示例 1: 输入&#xff1a; nums [1,3,1] k 1 输出&#xff1a;0 解释&#xff1a; 所有数对如下&#xff1a; (1,3) ->…...

做房地产网站广告销售/湖北荆门今日头条

抓取太过频繁屏蔽了它的N个IP段又换IP来抓&#xff0c;抓我的分页链接居然抓到负一百多页&#xff0c;我都不明白它怎么算出来的。好多我自己都不知道的链接&#xff0c;他都来抓&#xff0c;把链接的A部分拼凑到另外的链接的B部分&#xff0c;可真是够滑稽的&#xff0c;雅虎和…...