kafka学习--第一章 kafka的基本架构与角色

一、kafka的基础架构

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

   kafka的具体架构如图:

  学习kafka的架构前,我们需要了解图中的每个角色:

  (1)consumer group 消费者组:这是kafka消息队列特有的角色,它是一堆消费组组合成的。消费者组中的每个消费者负责消费不同分区的数据,一个分区只能一个消费者消费,它们互不影响。

  (2)broker:一台kafka服务器就是一个broker,一个broker可以有多个topic。

  (3)topic:可以看做是一个队列。

  (4)partition:为了实现扩展性,一个非常大的topic可以有分成多个partition,它们可以分布在多个broker上。

  了解完角色后,我们就可以来分析它的架构图了:

  (1)kafka为了方便扩展和提高吞吐量,引入了一个partition角色,实际上就是为了对一个大队列进行分区操作。

  (2)同样的,在为了配合kafka中的分区设计,也给了消费者端提供了一个消费者组的概念,组内的每个消费者并行消费信息。

  (3)为了提供可用性,kafka给每个分区partition增加了若干个副本,这些副本采用了leader与flower的机制进行工作。

二、kafka生产者以及队列topic

  1.partition分区的原则

  在kafka提供的API中,生存者发送消息时需要传递三个参数:

  (1)String value 要发送的消息。

  (2)String key    kafka自定义的分区。

  (3)Integer partition  用户指定的分区。

  kafaka的分区原则就和这三个参数有关,大致如下:

  (1)如果传递时指定了partition的值,那么kafka会往指定的分区发送数据。

  (2)如果没有指定partition的值,但是传递了key,kafka会自动生成一个partition值,它是将key的hash值与topic的partition值进行取余,得到的值就是kafka生成的partition的值。

  (3)如果partition和key都没有进行传递,kafka则会随机生成一个key,是一个整数,以后每次生成都是在这个整数上加一。

  2.数据的可靠性

  kafka是一个非常强大的消息队列,它能够保存数据的可靠性。简单的来说它能够保证不会丢数据。那么它是如何完成的呢,如图:

  

  在生产者端可以看到,kafka是有一个失败重试的机制,当消息发送失败时会再次尝试发送,那么生产者是如何判定消息发送失败了呢。

  为了实现数据的可靠性,kafka引入了一个对象:ack。生产者发送消息后,会收到kafka发送的这个ack对象,如果在一定时间后生产者还没有收到ack,那么生产者会尝试再次发送消息。

  对于ack还有一个问题,就是在什么时候发送ack给生产者。因为我们在前面介绍了,kafka中每个partition是有个多个副本的,这些副本的leader接收数据,follwer则进行同步数据,因此ack是在同步完成后发送ack,还是leader接收后进行发送ack呢。

  在kafka中采用的是所有的follwer都同步完成后再发送ack,这样虽然会照成网络的延迟,但是网络延迟对于kafka来说影响较小。

  3.副本的集合ISR

  ISR是和leader保持同步的follwer集合。当ISR中所有follwer同步完成后,leader给生产者ack。如果有那个follwer长时间没有进行数据同步,那么ISR会踢掉这个follwer。

三、消费者

  1.kafka的消费方式

  kafka采用的是pull(拉)模式进行消费数据,也就是消费者能读取多少数据则拉多少数据进行消费。但是pull模式有一个缺点:如果队列中没有数据,消费者会一直去拉取数据。为了解决这个问题,kafka设置了空数据检测机制。

  2.分区分配策略

  在kafka中发送的消息指定的不是单个消费者,而是整个消费者组,因此每个消费者消费的分区也是有规则的:

  a.轮询规则 roundrobin

  轮询分配的方式非常简单,将每个分区通过轮询的方式分配给消费者

  b.范围规则 range

  指定消费者消费指定范围的分区。

原文地址:https://www.cnblogs.com/daijiting/p/12234467.html

时间: 2024-11-07 04:09:17

kafka学习--第一章 kafka的基本架构与角色的相关文章

web学习第一章

web学习第一章 我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻的是WEB应用程序的工作原理,因为老师为了解释这个画来很多遍图,我当时想的是:为什么还有人没懂?我都听困了. 直到老师说要抽人起来画图,我一下就回过神来了,于是乎老师抽人开始了,我看见同学一个个的被抽上去画,我发现我有些东西怎么没看见过,在他们画的同时我就在下面学,错一个,我就记一个. 今天老师还是继续

C++ Primer快速学习 第一章 入门

很多人说C++Primer不适合于入门,本系列入门文章向大家证明了:这是一个谎言. 第一章 入门 本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表 达式.语句和函数. 1.1. 编写简单的 C++ 程序 每个 C++ 程序都包含一个或多个 函数 ,而且必须有一个命名为 main.函数 由执行函数功能的语句序列组成.操作系统通过调用 main 函数来执行程序, main 函数则执行组成自己的语句并返回一个值给操作系统. 下面是一个简单的 main 函数,它不执行任何功能,只是

Java基础知识二次学习-- 第一章 java基础

基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一章  JAVA简介 时间:2017年4月24日10:23:32 章节:01章_02节 内容:jdk的配置与安装 完成情况:已经完成,cmd中javac提示出相关命令 时间:2017年4月24日10:30:39 章节:01章_04节 内容:输出HelloWorld 完成情况: 已经完成 javac先将

学习第一章 Android系统的编译和移植实例后的心得体会

说起来,去年在岳老师的带领下就接触了嵌入式系统的编译和移植.而现在我们又开始接触Android系统的编译和移植.第一章主要介绍安卓系统的编译和移植技术.其实安卓和嵌入式非常相似. 安卓 移植涉及的主要过程大致分为六步:1.下载安卓linux内核. 2.安装交叉工具链.3.移植安卓linux内核支持EZ6410平台.4.安装安卓SDK.4.获得安卓根文件系统.5.设置系统环境,完成安卓正常启动.虽然步骤不多,但是涉及了很多东西.在开始内核移植之前,先完成工具链的搭建.在移植过程中会发现硬件差异.差

读《大型网站技术架构:核心原理与案例分析》第一章:大型网站架构演化

写在前面 从开始写代码到现在,已经做了好几个项目了,BS和CS的都有,一直都以一个码农自居.但,作为一个进步的程序员,都有一个成为架构师的理想.于是,在平时的工作中,也积极的去看各种书籍,看园子里面的精品文章.希望,在这条追逐梦想的道路上,能够留下点点滴滴,也算是对知识的一种巩固,一些分享. 读书感受   快下班的时候,看了该书的第一章.算是对网站的架构演化有了一些认识. (1)初始网站的架构:一台服务器,应用程序,数据库,文件都在一台服务器上面.LMAP足矣. (2) 二级网站的架构:应用服务

kafka学习总结之kafka简介

kafka是一个分布式,基于subscribe-publish的消息系统 特性:高吞吐量.低延迟.可扩展性.持久性(消息持久化到本地磁盘).可靠性.容错性(n个副本,允许n-1个节点失败).高并发(支持数千个客户端同时读写) 设计思想: (1)       Consumer group:多个consumer可以组成一个group(group-id区分),每个消息只能被组中的一个consumer消费,同时消费一个消息的consumer一定不在同一组: (2)       消息状态:kafka中,消

Ruby学习-第一章

第一章 字符串,数字,类和对象 为了证明Ruby真的好用,hello world也能写的如此简洁: puts 'hello world' 1.输入/输出 print('Enter your name') name=gets() puts("Hello #{name}") 注:Ruby是区分大小写的 2.String类 puts("Hello #{name}")中的变量 name是内嵌在整个String里的,通过 #{ } 包裹进行内嵌求值,并用双引号"&q

Netty In Action中文版 学习第一章的重点知识

第一章 大多数都是一些名词,SSL/TLS和Starttls支持,回调,聚合,分散,这些我也不是很明白,也百度了一下这些基础概念,大家也可以去看看实际的内容以及相关的代码,由于本人也是新手对这些词也理解不深刻不在此细说. 下面是一个jar文件搜索的比较好的网址拿出来分享给大家 http://www.findjar.com/index.x?query=xlstojson jar包的搜索地 下面就是工具,作为新人大多数都说用Eclipse就够了,我由于想看开源的源码所以选择了MyEclipse 10

python 学习第一章(python基础编程第二版)

第一章:基础知识 1.双斜线:实现整除的操作符 >>>1//2 0 就算是浮点数,双斜线也会执行整除 >>>1.0//2.0 0.0 2.幂(乘方)运算符:双星 >>>2**3 8 tip:可以用函数pow代替运算符,pow(2,3) 3.十六进制和八进制 十六进制:前面加0x,第一个是数字0 >>>0xAF 175 八进制:在3.0以上版本的python中加0o,首数字是0,第二个是字母o >>>0o10 8 4.