分布式消息队列 -- kafka基础知识相关

分布式消息队列--Kafka kafka基本原理与使用 阅读详情

 Kafkas是什么?     

      Kafka是一个分布式消息队列, 也是一个开源消息系统,由Scala语言写成。kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外 kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是consumer都依赖于zookeeper集群保存一些mate信息,来保证系统可用性。在通常的流式计算中,kafka 一般用来缓存数据,而Storm或者Spark Streaming通过消费kafka的数据进行计算。

Kafka架构分析图:

(1)Producer:消息生产者,就是向kafka broker发消息的客户端。
(2)Consumer:消息消费者,向kafka broker取消息的客户端。
(3)Topic:可以理解为一个队列。

(4)ConsumerGroup(CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic 的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partition只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
(5)Broker:一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
(6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition 间)的顺序。
(7)Offset: kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka

Kafka生产过程分析:

(1)写入方式: producer采用推(push)模式将消息发布到broker,每条消息都被追加 (append)到分区(partition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。

(2)分区(Partition):消息发送时都被发送到一个topic,其本质就是一个目录,而 topic是由一些 Partition Logs(分区日志)组成, 其组织结构如下图所示:

每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。

(3)分区的原因:
a、方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了。
b、可以提高并发,因为可以以Partition为单位读写了。

(4)分区的原则:

a、指定了partition,则直接使用。

  1. 未指定partition但指定key,通过对key的value进行hash出一个partition。
  2. partition和key都未指定,使用轮询选出一个partition。

(5)副本(Replication):

同一个partition可能会有多个replication(对应server.properties配置中的default.replication.factor=N)。没有replication的情况下,一旦broker宕机,其上所有patition的数据都不可被消费,同时producer 也不能再将数据存于其上的 patition。引入replication之后,同一个partition可能会有多个replication,而这时需要在这些replication之间选出一个leader,producer和consumer只与这个leader 交互,其它replication作为follower从leader中复制数据。

(6)写入流程:

producer写入消息流程如下:

a、producer先从zookeeper的"/brokers/.../state"节点找到该partition的leader。
b、producer将消息发送给该leader。
c、leader将消息写入本地log。
d、followers从leader pull消息,写入本地log后向leader发送ACK。

e、leader收到所有ISR中的replication的ACK后,增加HW(high watermark,最后commit的offset)并向producer发送ACK。

(7)Broker保存消息

a、存储方式

物理上把topic分成一个或多个partition(对应server.properties中的 num.partitions=3配置),每个partition物理上对应一个文件夹(该文件夹存储该 partition 的所有消息和索引文件)。

b、存储策略

   无论消息是否被消费,kafka都会保留所有消息。有两种策略可以删除旧数据基于时间: log.retention.hours=168

基于大小: log.retention.bytes=1073741824
需要注意的是,因为kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以删除过期文件与提高kafka性能无关。

Kafka生产过程分析:

kafka提供了两套consumer API:高级Consumer API和低级Consumer API。

(1)高级API

优点:

高级API写起来简单。
不需要自行去管理offset,系统通过zookeeper自行管理。
不需要管理分区,副本等情况,系统自动管理。
消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据(默认设置1分钟更新一下zookeeper中存的offset)可以使用group来区分对同一个topic的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响)。

缺点:

     不能自行控制offset(对于某些特殊需求来说)。
不能细化控制如分区、副本、zk 等。

(2)低级API

优点:

      能够让开发者自己控制offset,想从哪里读取就从哪里读取。
自行控制连接分区,对分区自定义进行负载均衡。
对zookeeper的依赖性降低(如:offset 不一定非要靠zk存储,自行存储 offset即可,比如存在文件或者内存中)。

   缺点:

     太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。

(3)消费者组

消费者是以consumer group 消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。在图中,有一个由三个消费者组成的group,有一个消费者读取主题中的两个分区,另外两个分别读取一个分区。某个消费者读取某个分区,也可以叫做某个消费者是某个分区的拥有者。
    在这种情况下,消费者可以通过水平扩展的方式同时读取大量的消息。另外,如果一个消费者失败了,那么其他的group 成员会自动负载均衡读取之前失败的消费者读取的分区。

(4)消费方式

consumer采用pull(拉)模式从broker中读取数据。push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。对于kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式—即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,可以在拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小)。

【分布式技术】消息队列Kafka 主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队列常应用于异步处理,流量削峰,应用解耦,消息通讯等场景。 阅读详情

相关推荐

Kafka分布式消息队列

查看topic:bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181删除topic:bin/kafka-topics.sh --delete --zookeeper 127.0.0.1:2181 --topic topicName。

优快云博客技术,java高级工程师,业务层架构师,高级管理认证,毕业设计可以联系我 1630

Kafka 之 Kafka配置的一些参数解释

kafka配置详解

qq_40967969的博客 4329

消息队列kafka的面试问题汇总

1.为什么要使用消息队列MQ? kafka的作用:解耦,异步,削峰(解决高峰期瘫痪) 2.架构中引入MQ之后可能存在的问题? 系统的可用性降低了,因为一旦MQ遇到故障,整个系统就歇菜了 系统的复杂性变高,因为多加了一个环节 一致性问题 3.消息队列的比较 activeMQ:吞吐量万级,但社区维护慢 RabbitMQ:吞吐量万级,社区好性能可以,有后台管理界面,但是erlang语言开发,源码不好解读...

XDSXHDYY的博客 2029

Zookeeper集群+Kafka集群+ELK

目录一.Zookeeper 概述1.Zookeeper定义2.Zookeeper工作机制3.Zookeeper特点4.Zookeeper数据结构5.Zookeeper应用场景6.Zookeeper选举机制二.部署Zookeeper集群1.环境准备2.安装准备2.安装Zookeeper3.启动 Zookeeper 一.Zookeeper 概述 1.Zookeeper定义 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 2.Zookeeper工作机制 Zookeeper

下雨天的放羊娃的博客 1750

【STM32H7实战】SDMMC总线优化与FatFs文件系统高效读写技巧

本文详细介绍了STM32H7中SDMMC总线优化与FatFs文件系统高效读写技巧,包括时钟配置、DMA传输、缓存策略等关键优化点。通过实测数据对比,展示了从2.7MB/s提升至11.8MB/s读取速度的优化效果,适用于需要高性能SD卡读写的嵌入式开发场景。

e6f7g8h9i的博客 483

[金仓数据库V8R6]更换授权

上传授权,使用mv license_xxx_0.dat /home/kingbase/KingbaseES/license.dat替换每个授权,并使用ls -l license.dat确保替换前后属主和权限不变。根据步骤1的数据目录位置,执行/home/kingbase/KingbaseES/Server/bin/sys_ctl -D /home/kingbase/KingbaseES/data reload使新的授权文件生效。该参数意义为授权剩余有效天数,查询结果为新授权中有效期间的天数即为替换成功。

l04050924的博客 3705

Java大厂面试:从Spring Cloud到分布式缓存的技术深挖

小张,今天的表现不算太差,基础知识还需补强。回去等通知吧!

Elevenmao的博客 566

LeGo-LOAM源码篇:源码分析(3)

mapOptmization.cpp,主要内容包括回环检测、scan-to-map位姿优化、因子图。

slamml 1382

深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。 消息队列在电商系统、消息通讯、日志收集等应用中扮演着关键作用,以阿里为例,其研发的消息队列(MQ)服务于阿里集团超过11年,在历次天猫双十一活动中支撑了万亿级的数据洪峰,为大规模交易提供了有力保障。 目前在生产环境,使用较多的消息队列有...

GitChat 1万+

银河飞腾FT-M6678 DSP开发初体验:从仿真器连接到第一个网络程序(CCS5.5+FT-EMU560实战)

本文详细介绍了银河飞腾FT-M6678 DSP开发环境的搭建过程,包括CCS5.5开发环境的配置、FT-EMU560仿真器的连接与设置,以及关键模块如网络驱动的国产化替换。通过实战案例,帮助开发者快速掌握国产DSP的开发流程,实现网络通信功能。

weixin_30919429的博客 553

微信小程序实现锚点效果 scroll-view的scroll-into-view属性

小程序中实现锚点效果,可以直接使用scroll-view的scroll-into-view属性就可以实现锚点效果,比较方便简单。那么需要用到scroll-view那些参数呢,下面具体讲讲:效果展示: wxml **注意:**viewid值是动态的,通过setData设置即可。js wxss......

FaxMiao的博客 5447

【Kafka】消息队列Kafka基础知识和实现思路总结

我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。参与消息传递的双方称为 生产者 和 消费者 ,生产者负责发送消息,消费者负责处理消息。(1)AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。

weixin_44823875的博客 1702

LPDDR5/5X BG mode,8B mode和16B mode

LPDDR5/5X 器件,协议上支持多个bank架构可静态配置;配置在MR3:模式说明协议要求速率要求BLBG模式每CH 4BG, 4BALPDDR5/5X>3200MbpsBL16 & 328B模式每CH 8BALPDDR5任何速率BL3216B模式每CH 16BALPDDR5/5X<=3200MbpsBL16 & 32。

hemlok的博客 8858

消息队列之Kafka

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

TTSuzuka的博客 4487

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 818

JavaFX 表视图

我们可以使用来自 JavaFX API 的 TableView,TableColumn 和 TableCell 类以表格形式表示数据。通过实现数据模型和应用单元工厂来填充表中的数据。表类可以按列排序数据,并在必要时调整列大小。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 404

Python之kafka消息队列操作入门

1 kafka简介 1.1 什么是kafka kafka是一个分布式、高吞吐量、高扩展性的消息队列系统。kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了一个开源项目。主要应用在日志收集系统和消息系统,相信大家之前也听说过其他的消息队列中间件,比如RabbitMQ、AcitveMQ,其实kafka就是这么一个东西,也可以叫做KafkaMQ。总之,K...

ZONGXP的博客 7697

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Kafka消息队列

消息队列(Message Queue,MQ)是一种异步通信机制,用于应用程序之间或组件之间传递消息。它通过队列的形式暂存消息,允许生产者(发送消息的一方)和消费者(接收消息的一方)解耦,从而实现异步处理、流量削峰、系统扩展等功能。消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。

2401_88768957的博客 1561

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

kafka消息队列

消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ中而不用管谁来取,消息使用者只管从MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

2401_84242106的博客 1124

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用 Kafka 实现 Python 分布式消息队列

Kafka 是由 LinkedIn 开发并开源的一个分布式流处理平台,它最初设计用于处理日志数据,后来逐渐扩展到更广泛的场景。Kafka 的核心概念包括主题(Topic)、分区(Partition)和消费者组(Consumer Group)。主题是消息的分类,每个主题可以有多个分区,而分区则是消息存储的基本单位。消费者组允许多个消费者同时消费同一主题的消息。通过上述步骤,你已经成功地在 Python 中使用 Kafka 实现了一个简单的分布式消息队列。

2501_91230437的博客 583

详述消息队列kafka

kafka是最初由Linkedin公司开发,是一个分布式、支持分区的、多副本的,给予zookeeper协调的分布式消息系统,它的最大特性就是可以实时的处理大量数据以满足各种需求场景:比如给予Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等 等,用scala语言编写。Linkedin于2010年贡献给了Apache基金会并称为顶级开源项目。Kafka的设计哲学源于发布-订阅模型,但其创新性地引入了分布式存储和分区化处理。

weixin_55605689的博客 1238

Kafka 消息队列

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

2301_80839375的博客 1865

Kafka——分布式的消息队列

Kafka 第一章 是什么一 Kafka简介二 概念理解第二章 安装一 集群安装二 使用命令第三章Kafka整合flume整合步骤 第一章 是什么 一 Kafka简介 Kafka是一个分布式的消息队列系统(Message Queue)。 官网:https://kafka.apache.org/ Kafka维护主题为的消息源。 我们将调用将消息发布给Kafka主题生产者的流程。 我们将调...

时间静止 3198
上一篇: redisson与aop解决接口幂等性
下一篇: GitLab设置全局密码添加ssh-key
splendor.s
博客等级 码龄10年 91粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值