消息队列_消息队列:kafka

概念

kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域。

要理解kafka首先要有分布式的概念,要有消息队列的概念。分布式系统最大的优势就是解耦和削峰,这种情况下,A系统生成了一个消息,B系统异步获取,那么就需要一个存放消息的消息队列(MQ)。

相比较传统的消息队列,消息被消费确认后会删除,而kafka有持久化功能,B系统消费完,C系统还可以再次消费。kafka默认消息保存168小时,即7天,可配置。

kafka的核心概念有:broker、topic、partition、leader、follower、ISR、acks、offset、lEO和HW,下面分别理解一下。

broker、topic、partition

  • Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker。

  • 一个broker服务上可以有多个topic,topic是kafka消息队列的一个逻辑概念,partition是具体的物理概念,比如topic=first,partition=0,消息实际存储在broker的first-0目录下。

  • partition分区的优势:高并发的情况下,可以动态扩展,生产者往多个分区发生消息,能提高并发量。

  • 生产者发送给kafka的消息是个ProducerRecord对象,ProducerRecord提供了6种构造器,如下:

06cf616a484e1963c65b10b992ec4a60.png

不管使用哪一种构造器,最终实现如下:

public ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value, Iterable headers) {
if (topic == null) {
throw new IllegalArgumentException("Topic cannot be null.");
} else if (timestamp != null && timestamp < 0L) {
throw new IllegalArgumentException(String.format("Invalid timestamp: %d. Timestamp should always be non-negative or null.", timestamp));
} else if (partition != null && partition < 0) {
throw new IllegalArgumentException(String.format("Invalid partition: %d. Partition number should always be non-negative or null.", partition));
} else {
this.topic = topic;
this.partition = partition;
this.key = key;
this.value = value;
this.timestamp = timestamp;
this.headers = new RecordHeaders(headers);
}
}

其中,topic必须指定,partition的值有以下参数确定:

1)指定partition值,消息直接放入指定的分区;

2)既没有partition也没有key,采用round-robin算法,随机生成一个整数,与topic的partition数取余得到partition值,后续在这个整数上自增;

3)没有指定partition但有key,将key的hash值与topic的Partition数进行取余得到partition值;

4)既有partition又有key,以partition为准,key失效。

leader、follower

每一个broker都有一个leader和多个follower,leader和ollower不能在同一个节点上,否则服务故障,主从都会失效。

73a7982f0954027ff6b11cb506bd569f.pngproducer可靠性保障和ISR

思考:producer向kafka发送消息,如何保障消息的可靠性?

有两种方案:

1)为了保障消息不丢失,至少要半数以follower上同步完成,broker发确认。

半数以上同步完成,有且只有一个follower才有可能获得半数以上投票,这样就不会存在选出来多个leader了,而且这半数以上的follower都完成了同步,能保证参与选举的follower(自己本身也是候选人)都满足成为leader的资格。

比如有7个follower,半数以上即4个follower同步完成,全部投选1号为leader,leader唯一可确定。如果选举是2,2,的结果,则没有任何一个follower有资格成为leader。

2)等待所有follower全部同步完成发确认,此时可以随便选举一个follower作为leader。

第一种方案,n个副本挂掉了,需要2n+1个副本才能恢复数据;

第二种方案,n个副本挂掉了,只需要n+1个副本就能恢复数据;

优选第二种方案:第一种方案当n+1个同步完成,n个挂掉,需要2n+1个副本,而每个partition的数据量都很大,会造成数据冗余。

但是第二种方案存在万一某个follower迟迟无法同步完成,会造成严重延迟,为了解决这个问题,kafka维护了一个动态follower集合——ISR:

ISR初始集合是所有follower,如果某个follower故障,在指定时间内无法同步,会被踢出ISR,这样只要保证ISR中的剩余follower同步完成就可以发送确认。

replica.lag.time.ms参数用来指定超时的时间阀值。

acks

acks用来指定broker什么时候发收到消息的确认:

  • 0:producer不等待broker的ack,broker一收到消息还没写入就返回,一旦broker故障,消息会丢失,适用日志记录,对消息丢失容忍度比较高的场景;

  • 1:producer等待broker的ack,broker的leader写入成功返回ack,如果follower同步成功之前leader挂掉,消息会丢失。

  • -1:producer等待broker的ack,broker的leader和所有follower都写入成功后发ack,但是此时leader挂掉了,没有发送ack,producer超时没收到ack,就会重发消息,造成消息重复。

文件存储和offset

kafka的存储消息有两个文件,.log和.indexoffset指定消费者要消费消息的位置,如下图,根据offset=3先定位.index文件,找到3对应的索引值,然后根据索引值756找到.log中对应的具体消息:

9d94e09e0574c057dda5ba0683a7cda1.png

思考:offset是保存在哪里?

kafka0.9版本之前是保存在zookeeper上,0.9之后保存在kafka内置的一个topic上。

LEO和HW

LEO:log end offset;

HW:high watermark,HW是所有follower中最小的LEO。

这两个概念主要用于follower同步中,每个follower都有自己的LEO,因为每个follower同步有快有慢,所有出现了HW,类似木桶的最短板,如下图:

19b524493d588775622448968de114ab.png

比如说leader挂掉了,下图中的follower3成为leader,那follower1和follower2需要同步数据,各自从HW位截断,从HW=10开始同步,最终一致,leader和follower都是13;

假设follower2成为leader,follower1和follower3从从HW=10截断,发现和follower2已经一致,此时不需要额外同步,最终一致,leader和follower都是10。

a515b830d6ae95d2471f43d07b9c21de.png

LEO之前的消息是完全一致的,而HW之后的数据不一致,所以kafka设计上HW之后数据对于消费者是不可见的。

follower故障被踢出之后,重新连接是从HW开始同步数据。

HW只能保证数据一致性,不能保证重复或者丢失,重复或者丢失由acks来定。

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

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

相关文章

kopernio显示无效程序_陆风路虎外观设计专利无效案一锤定音,最高法:陆风X7专利无效...

点击上方“华商报”可快速关注哦&#xff01;持续5年多的路虎、陆风外观设计专利有效性之争终于尘埃落定&#xff1a;华商报记者日前从代理律师处获悉&#xff0c;最高人民法院近日驳回了江铃控股有限公司的再审请求&#xff0c;这意味着&#xff0c;陆风X7的外观专利无效。陆风…

掩膜区域内像素值_MRI ADC值是怎么来的?咱们来手算一下

首发公众号“医影杂记”ADC&#xff08;Apparent diffusion coefficient&#xff09;&#xff0c;表观弥散系数&#xff0c;用于描述DWI序列中不同方向的分子扩散运动的速度和范围&#xff0c;是MRI DWI&#xff08;Diffusion-weighted imaging, 弥散加权成像&#xff09;中最常…

计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果。下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法。1、在“开始”选项卡中单击“编辑”组中的“替换”按钮&#xff0c;打开“查找和替换”对话框&#xff0c;切换到“替换”选项卡…

composer 依赖包版本冲突_composer快速入门教程

php中文网最新课程每日17点准时技术干货分享Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库&#xff0c;Composer 会帮你安装这些依赖的库文件&#xff0c;有了它&#xff0c;我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目…

极品飞车ol服务器维护,《极品飞车OL》配件升级常见问题介绍

今天九游和大家讲解《极品飞车OL》配件升级常见问题介绍极品飞车OL游戏中&#xff0c;玩家们是需要不断使用配件加强自己的车辆来提升能力值。那么关于配件升级玩家们整体的有什么问题呢&#xff1f;下面小编也为大家带来了相关的介绍。感兴趣的玩家快来看看吧。《极品飞车OL》…

linq判断集合中相同元素个数_JavaSe集合的概念以及集合框架介绍

###集合今天任务1.概念1.1 集合的概念1.2 集合的框架结果介绍1.3 集合和数组的对比 2.Collection接口2.1 Collections中常用的方法 3.泛型3.1 什么是泛型3.2 泛型的声明3.3 说明3.4 泛型使用时的注意事项3.5 受限泛型3.6 泛型应用在集合上 4.Iterator迭代器4.1 迭代器的工作原理…

华为手机获取状态栏高度是错误的_你的华为手机状态栏有HD图标吗?这又代表着什么?看完你就懂了...

平时比较细心的朋友应该都发现了&#xff0c;华为手机的状态栏(信号栏)有个"HD"图标。有些朋友看到这个图标&#xff0c;可能会担心自己手机是不是出问题了&#xff1f;会不会对手机有什么影响&#xff1f;能不能把它关闭&#xff1f;下面就给大家解惑。1. "HD&…

ext.ajax.request跨域,跨域Ajax访问header中 x-requested-with丢失

前端调用后端接口&#xff0c;本域情况下&#xff0c;ajax方式调用&#xff0c;request header中包含x-requested-with信息。跨域情况下&#xff0c;request header中不再包含x-requested-with。说明&#xff1a;1.前端ajax封装的jquery的$.ajax方法。2.后端header相关设置已允…

bread是可数还是不可数_可数名词不可数名词分不清?出题老师告诉你方法

我是瓶子老师。我有10多年初中英语教学经验&#xff0c;参与过中考一模、二模命题&#xff0c;同时我也是《学生双语报》的撰稿人&#xff0c;为本市超过5万名中考生出过中考模拟试题。在初中英语的学习过程中&#xff0c;我们会讲到可数名词和不可数名词。很多同学总是记不住哪…

nginx指定配置文件启动_【第1717期】Nginx入门指南

前言Nginx有在部署早读课网站的时候用到&#xff0c;平时用的不多&#xff0c;又是一个可以顺便了解的知识点。那个李晓云&#xff0c;这篇是你想了解的吗&#xff1f;今日早读文章由慕小白翻译分享。正文从这开始&#xff5e;&#xff5e;这份指南是对nginx的基本介绍&#xf…

bash: pcre-config: 未找到命令..._Docker 常用操作命令

文章首发于微信公众号《程序员果果》 地址&#xff1a;https://mp.weixin.qq.com/s/S9VkzSJx_JOY8zDiC_nuEg1. 启动容器docker run IMAGE [COMMAND] [ARG...]IMAGE 是指启动容器所使用的操作系统镜像[COMMAND] [ARG...] 指的是容器启动后运行的命令及其参数2. 启动交互式容器#…

es 全量同步mysql_使用canal将mysql同步到es中

因为自己项目中需要用到mysql数据同步到es中&#xff0c;查找了相关资料最后决定用canal来做&#xff0c;所以便有了本文&#xff0c;下面一起来看如何使用canal吧canal教程根据 https://github.com/alibaba/canal 上的原理解释&#xff0c;我们知道 canal 会模拟 mysql slave …

一个列中多行求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识(1)...

蒹葭苍苍&#xff0c;白露为霜。所谓伊人&#xff0c;在水一方。溯洄从之&#xff0c;道阻且长。溯游从之&#xff0c;宛在水中央。蒹葭萋萋&#xff0c;白露未晞。所谓伊人&#xff0c;在水之湄。溯洄从之&#xff0c;道阻且跻。溯游从之&#xff0c;宛在水中坻。蒹葭采采&…

实时监控后台数据 vue_实时数据监控,快速掌握B站爆款视频热度走向

飞瓜数据B站版的数据监控功能提供对B站UP主监控功能&#xff0c;实时掌握UP主视频热度走向和投放效果。通过监控输入B站视频链接&#xff0c;设定24/48时长开始对其监控。监控开始后在监控报告中查看对应视频的数据曲线变化或者等待监控结束直接观察整个的曲线走势。实现分钟打…

帧同步_帧同步和状态同步该怎么选(上)

这是一篇拖延了2年多的文章…2017年10月份开始写的&#xff0c;直到这次过年才写完。。。前言随着王者荣耀的崛起&#xff0c;使用帧同步&#xff08;Lockstep&#xff09;的游戏也越来越多&#xff0c;关于帧同步和状态同步的讨论争论也有不少&#xff0c;那么到底该选哪种同步…

实现连麦_直播课程系统如何实现互动连麦效果?

比起录播课&#xff0c;直播课师生能够更好地互动&#xff0c;因此很多老师利用直播课程系统进行直播教学。直播课程系统的连麦互动往往能让直播课充满生机。在直播教学中使用连麦互动功能&#xff0c;老师可以随时提问学生&#xff0c;学生也可以就不懂的问题询问老师&#xf…

c++ 二次开发 良田高拍仪_在网页中调用摄像头实现拍照上传 - 高拍仪二次开发...

来源于 https://blog.csdn.net/weixin_40659738/article/details/78252562在网页中调用摄像头实现拍照上传高拍仪二次开发在一些公共部门的办事处&#xff0c;比如银行、护照办理中心、税务等&#xff0c;我们可能会注意到办公桌上摆着这样一台机器。办公人员用它拍摄各种证件…

复频域求零输入响应_第十四章 动态电路的复频域分析 习题答案

第十四章 动态电路的复频域分析一、选择题1&#xff0e; 图13—1所示电感元件的电压、电流关系的运算形式是 B 。A &#xff0e;)0()()(-L L L Li s sLI s U &#xff1b;B &#xff0e;)0()()(--L L L Li s sLI s U &#xff1b;C &#xff0e;si s sLI s U L L L )0()()(- 2&…

cancase vector_基于Vector总线设备的CAN总线测试方法概述

3.3采样点位置测试测试设备&#xff1a;CANoe、CANStressDR。测试系统架构中需将CANScope旁路处理。测试设备正确接线后(CANStressDR串接在回路中)&#xff0c;CANoe发送报文&#xff0c;CANStressDR采用位干扰的方式进行干扰&#xff0c;具体是采用CANStressDR从后往前逐位干扰…

源码mysql5.7安装过程_mysql5.7 源码安装步骤

操作系统&#xff1a;centos 7说明&#xff1a;以下都是root用户操作的。一、数据库安装1、查看系统是否有旧版的mysql# rpm -qa |egrep -i mysql|mariadb如果有的话请先卸载&#xff0c;卸载命令&#xff1a;# rpm -ev 软件包名称2、查看老版本mysql相关的安装目录&#xff1a…