消息队列实现原理(以kafka为例)

消息队列原理 熟悉MQ原理,方便MQ选型 阅读详情

一. 概述:

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。使用较多的消息队列有Kafka、ActiveMQ、RabbitMQ、ZeroMQ、MetaMQ、RocketMQ。
消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景。
1、异步处理:用户注册后,需要发注册邮件和注册短信。
2、应用解耦:用户下单后,订单系统需要通知库存系统。
3、流量削锋:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。可以控制活动的人数,可以缓解短时间内高流量压垮应用。
4、日志采集:日志采集端将日志写入kafka队里,开启多个线程消费日志队列,做进一步处理。

二. kafka原理

Kafka 是一款分布式流处理框架,用于实时构建流处理应用。它有一个核心 的功能广为人知,即作为企业级的消息引擎被广泛使用。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展能力。下图是kafka的架构图:
在这里插入图片描述

1 基本术语

Producer:Producer即生产者,消息的产生者,是消息的入口。
Consumer:消费者,即消息的消费方,是消息的出口。
Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
Message:每一条发送的消息主体。

kafka cluster(集群):
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绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。比如检测broker是否存活等作用。

2、Leader 选举

在介绍 Leader 选举之前,让我们先来了解一下 ISR(in-sync replicas)列表。每个分区的 leader 会维护一个 ISR 列表,ISR 列表里面就是 follower 副本的 Borker 编号,只有跟得上 Leader 的 follower 副本才能加入到 ISR 里面,这个是通过 replica.lag.time.max.ms 参数配置的。只有 ISR 里的成员才有被选为 leader 的可能。
Leader 挂掉了,Kafka 会从 ISR 列表中选择第一个 follower 作为新的 Leader,因为这个分区拥有最新的已经 committed 的消息。通过这个可以保证已经 committed 的消息的数据可靠性。

3、kafka如何保证数据一致性?

这里介绍的数据一致性主要是说不论是老的 Leader 还是新选举的 Leader(原来的follower),Consumer 都能读到一样的数据。那么 Kafka 是如何实现的呢?
在这里插入图片描述
假设分区的副本为3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR 列表里面。虽然副本0已经写入了 Message4,但是 Consumer 只能读取到 Message2。因为所有的 ISR 都同步了 Message2,只有 High Water Mark 以上的消息才支持 Consumer 读取,而 High Water Mark 取决于 ISR 列表里面偏移量最小的分区,对应于上图的副本2,这个很类似于木桶原理。

这样做的原因是还没有被足够多副本复制的消息被认为是“不安全”的,如果 Leader 发生崩溃,另一个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏一致性。试想,一个消费者从当前 Leader(副本0) 读取并处理了 Message4,这个时候 Leader 挂掉了,选举了副本1为新的 Leader,这时候另一个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不一致性问题。

当然,引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms 参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。

上面说到一致性原理,那么在kafka如何将leader的数据同步到follow的呢?
Follower异步地从Leader复制数据,数据只要被Leader写入log就被认为已经commit,这种情况下,如果leader挂掉,会丢失数据,kafka使用ISR的方式很好的均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,而且Leader充分利用磁盘顺序读以及send file(zero copy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减少了Follower与Leader的消息量差。

4、Kafka中是怎么体现消息顺序性的?

kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。
整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1。

RocketMQ-核心篇(2)-核心概念 文章目录一、消息模型(Message Model)二、消息生产者(Producer)三、消息消费者(Consumer)四、主题(Topic)五、代理服务器(Broker Server)六、名字服务(Name Server)七、拉取式消费(Pull Consumer)八、推动式消费(Push Consumer)九、生产者组(Producer Group)十、消费者组(Consumer Group)十一、集群消费(Clustering)十二、广播消费(Broadcasting)十三、普通顺序消息(Normal 阅读详情

相关推荐

RabbitMQ定义的MQ多个consumer重复消费同一条消息

category: 数据一致性@title:RabbitMQ定义的MQ多个consumer重复消费同一条消息。

shengfq的技术博客专栏 3684

RabbitMq同一队列多个消费者问题

我感觉我们的目的是想用rabbitmq 实现发布订阅的模式,其实不用纠结于多个消费者怎么取消费同一个队列里面的消息,我的理解是,1、消息生产者 关心的是 1 消息 2 路由key 3 交换机 而队列与交换机的绑定是消费者应该关心的事。3、至于谁想订阅这个消息作为生产者可以不用管,消息订阅者按照生产者提供的协议去创建一个队列对接就是。2、基于这个,作为生产者,想发布一个消息,只需要提供消息类型 ,路由key规则,对应交换机。实现方式采用topic交换机-通配符路由。

weixin_45942583的博客 1万+

Kafka消息队列中关于消息的实现原理

一个业务Topic中保存了100条消息数据,消费者1从Topic中消费消息数据,同时会定期将消费数据的偏移量写入到kafka内部的Consumer_offset主题上,如果消费者1在消费到第50条消息数据时,异常宕机不可用,此时消费者2启动后,就可以通过消费者1写入到Consumer_offset主题中的消息偏移量,根据偏移量就可以计算出消费者是在那条消息消费时宕机的,紧接着从这条消息处开始消费,从而避免消息长期不被消费的问题。故而将其设置了50个分区。其实是有公式计算的,如下所示。

江晓龙的博客 1万+

RabbitMQ-小知识

RabbitMQ的使用

m0_64270160的博客 8936

保姆级教程:用CST 2023一步步复现一个1-8GHz Vivaldi天线(含参数优化与结果分析)

本文提供了一份详细的CST 2023教程,指导读者如何从零开始设计并优化1-8GHz Vivaldi天线。内容涵盖工程设置、参数化建模、仿真加速技巧以及性能优化策略,特别适合需要实现宽带天线设计的工程师和研究人员。通过实战案例,帮助用户掌握Vivaldi天线的核心设计要点和CST高级功能应用。

weixin_30800987的博客 618

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 779

Redis、Kafka 和 Pulsar 消息队列对比

导语 |市面上有非常多的消息中间件,rabbitMQ、kafka、rocketMQ、pulsar、 redis等等,多得令人眼花缭乱。它们到底有什么异同,你应该选哪个?本文尝试通过技术演...

230

康耐视 VisionPro CogImageFileTool(将获得的图像保存至文件或从文件中获取图像)工具

VisionPro CogImageFileTool(将获得的图像保存至文件或从文件中获取图像)工具

zhihuishuxia__的博客 2061

消息队列面试 - 如何保证消息队列的高可用?

面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识,高可用是必问的。上一讲提到,MQ 会导致系统可用性降低。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ 的那些缺点怎么来解决了。 要是你傻乎乎的就干用了一个 MQ,各种问题从来没考虑过,那你就杯具了,面试官对你的感觉就是,只会简单使用一些技术,没任何思考,马上对你的印象就不太好了。这...

YunWisdom 261

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 280

【系统架构设计师】论文:论虚拟现实技术的应用与发展

虚拟现实技术是当前科学研究的热点,同时也是国家大力支持发展的核心技术之一。所谓虚拟现实,就是通过计算机等虚拟手段来构造一个非常接近真实世界的虚拟环境,它主要体现在视觉、触觉、嗅觉等方面的逼真模拟来达到高度的沉浸性,也就是如我们通常所说的“身临其境”。

数据知道的博客 1万+

消息队列MQ/JMS/Kafka,你都了解吗?

点击关注公众号,利用碎片时间学习是不是平常听到说消息队列啊,JMS啊,MQ啊 、kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。1消息队列介绍首先举...

Java笔记虾 905

ESP32-S3模组上兼容SCCB总线与I2C总线的解决方案(1)

ESP32-S3模组上兼容SCCB总线与I2C总线的解决方案(1)

phmatthaus的专栏 773

消息队列(MQ)中的队列(Queue)是实现消息存储和传递的核心组件,不同的MQ产品在底层实现上会有差异

共性都采用了持久化机制来保证消息的可靠性,通过将消息存储在磁盘上,防止消息丢失。都支持多生产者和多消费者,能够实现消息的并发处理。差异RabbitMQ更注重消息的可靠性和灵活性,提供了丰富的交换机类型和消息路由规则;而Kafka更注重高吞吐量和分布式处理,采用了分区和副本机制来提高性能和可靠性。RabbitMQ的队列是一个独立的存储单元,而Kafka的主题是由多个分区组成的逻辑概念,分区是实际的存储单元。

[Blog][Domain] programb.blog.youkuaiyun.com 1841

YOLOv8轻量化模型瘦身术:深度解析与实战LAMP剪枝 YOLOv8(2021)

YOLOv8模型LAMP剪枝技术解析与实战 本文深入探讨了LAMP剪枝技术在YOLOv8目标检测模型中的应用。针对深度学习模型部署面临的资源限制问题,LAMP剪枝通过最小化L2失真和层自适应稀疏度分配,实现了高效模型压缩。相比传统幅度剪枝的"一刀切"方法,LAMP创新性地将剪枝建模为优化问题,定义LAMP分数来衡量权重重要性,自动确定各层最佳剪枝率。文章从理论基础出发,详细解析了LAMP的核心数学公式和算法流程,并提供了完整的YOLOv8移植实战指南,包括代码结构、剪枝步骤和微调策略。通

FJN110的博客 2422

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

基于FPGA的数字信号处理(17)--定点运算的实现实例(饱和Saturate与四舍五入Round)

孤独的单刀 2958

梳理消息队列 MQ/JMS/Kafka

是不是平常听到说消息队列啊,JMS啊,MQ啊 、kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。1消息队列介绍首先举个收快递的栗子,传统的收快递,快...

架构师小秘圈 196

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java消息队列入门详解

什么是消息队列? 消息队列的产生主要是为了解决系统间的异步解耦与确保最终一致性。在实际应用场景中,往往存在一些主流程操作和辅助流程操作,其中主流程需要快速响应用户请求,而辅助流程可能涉及复杂的处理逻辑或者依赖于外部服务。通过将这些辅助流程的消息放入消息队列,使得它们可以并行执行,并且不会阻塞主流程的运行,从而提高了系统的整体性能和用户体验。同时,消息队列支持至少一次的消息投递机制,保证了即使在...

weixin_41189501的博客 133

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

再过半小时,你就能明白kafka的工作原理了

为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息“为了回馈老客户,女朋友买一送一,活动仅限今天!”。买一送一还有这种好事,那我可不能错过!忍不住立马点了去。于是选了两个最新款,下单、支付一气呵成!满足的躺在床上,想着马上有女朋友了,竟然幸福的失眠了……   第二天正常上着班,突然接到快递小哥的电话:   小哥:“你是xx吗?你的女朋友到了,我现在在你楼下,你来拿一下吧!”。   我:“这……我在上班呢,可以晚上送过来吗?“。   小哥:“晚上可不行哦,晚上我也下班了呢!”。   于是两个

javase1086的博客 215

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Kafka消息队列

消息是在应用间传送的数据,其形式多样,既可以是简单的文本字符串,也可以是包含嵌入对象的复杂数据。消息队列是一种应用间的通信方式,具有独特的工作模式:消息发送后,发送者可立即获得返回,而消息的可靠传递由消息系统负责。消息发布者只需将消息发布到消息队列(MQ)中,无需关注谁来获取;消息使用者只需从 MQ 中获取消息,不必在意消息的发布者。这种方式使得发布者和使用者彼此解耦,无需知晓对方的存在。

YUNYINGXIA的博客 1767

消息队列之-Kafka原理讲解

一、入门 1.1 简介 一、入门 1.1 简介 Apache Kafka 是一个分布式流媒体平台 流媒体平台有三个关键功能 发布和订阅记录流,类似于消息队列或企业消息传递系统 以容错的持久方式存储记录流 记录发生时的处理流 Kafka 通常用于两大类应用: 构建可在系统或应用程序之间可靠获取数据的实时流数据管道 构建转换或相应数据流的实时流应用程序...

wanglei_storage的博客 8514

1、Kafka与消息队列核心原理详解

本文系统梳理了 Kafka 消息队列的核心原理,包括架构组成、数据存储、分区与副本机制、消息消费流程、offset 管理及高效查找策略。通过顺序写入、分段索引和消费者组机制,Kafka 实现了高吞吐、可扩展和高可用,广泛应用于日志收集、流式处理等分布式场景。

梦想飞舞的专栏 1420

【.NET】Kafka消息队列介绍,使用Confluent.Kafka集成Kafka消息队列

【.NET】Kafka消息队列介绍,使用Confluent.Kafka集成Kafka消息队列

技术分享博客,工作经验,技能学习分享(多做一些不会的,会有意向不到的收获,IT高手不可能永远只做会的) 2070

Kafka 消息队列

核心定义消息队列(Message Queue)是一种异步通信中间件,允许应用通过发送/接收消息解耦系统组件。采用生产者-消费者模型解耦系统。生产者发送消息到队列,消费者异步拉取处理,典型组件如 Kafka、RabbitMQ。其工作模型如下分布式协调服务,为分布式系统提供一致性数据管理节点监听和集群选举能力核心特性树形命名空间(类似文件系统路径,如数据节点ZNode(分持久节点PERSISTENT和临时节点EPHEMERAL监听机制Watch(实时感知节点变化)强一致性(基于Zab 协议保证数据一致)

2301_80839375的博客 1865
上一篇: 利用Redis设计常用系统(分布式锁)
下一篇: Arena内存池简介
okiwilldoit
博客等级 码龄17年 86粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值