会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 图解Kafka的核心概念,一看就明白!!

图解Kafka的核心概念,一看就明白!

时间:2025-11-04 23:22:01 来源:益强数据堂 作者:IT科技 阅读:612次

 

图片来自 Pexels

1、图解基础

Kafka 是核心一套流处理系统,可以让后端服务轻松的概念相互沟通,是看明微服务架构中常用的组件。

2、图解生产者消费者

生产者服务 Producer 向 Kafka 发送消息,核心消费者服务 Consumer 监听 Kafka 接收消息。概念

一个服务可以同时为生产者和消费者。看明

3、图解Topics 主题

Topic 是核心生产者发送消息的目标地址,是概念消费者的监听目标。

一个服务可以监听、看明发送多个 Topics。图解

Kafka 中有一个【consumer-group(消费者组)】的核心概念。

这是概念一组服务,扮演一个消费者。

如果是消费者组接收消息,Kafka 会把一条消息路由到组中的某一个服务。

这样有助于消息的负载均衡,也方便扩展消费者。

Topic 扮演一个消息的亿华云计算队列。首先,一条消息发送了。

然后,这条消息被记录和存储在这个队列中,不允许被修改。

接下来,消息会被发送给此 Topic 的消费者。

但是,这条消息并不会被删除,会继续保留在队列中。

继续发送消息。

像之前一样,这条消息会发送给消费者、不允许被改动、一直呆在队列中。(消息在队列中能呆多久,可以修改 Kafka 的配置)

4、Partitions 分区

上面 Topic 的描述中,把 Topic 看做了一个队列,实际上,一个 Topic 是由多个队列组成的,被称为【Partition(分区)】。

这样可以便于 Topic 的扩展。

生产者发送消息的时候,WordPress模板这条消息会被路由到此 Topic 中的某一个 Partition。

消费者监听的是所有分区并消耗所有人的事件。

生产者发送消息时,默认是面向 Topic 的,由 Topic 决定放在哪个 Partition,默认使用轮询策略。

也可以配置 Topic,让同类型的消息都在同一个 Partition。

例如,处理用户消息,可以让某一个用户所有消息都在一个 Partition。

例如,用户 1 发送了 3 条消息:A、B、C,默认情况下,这 3 条消息是在不同的 Partition 中(如 P1、P2、P3)。

在配置之后,可以确保用户 1 的所有消息都发到同一个分区中(如 P1)。

这个功能有什么用呢?这是为了提供消息的服务器托管【有序性】。

消息在不同的 Partition 是不能保证有序的,只有一个 Partition 内的消息是有序的。

5、架构

Kafka 是集群架构的,ZooKeeper是重要组件。

ZooKeeper 管理着所有的 Topic 和 Partition。

Topic 和 Partition 存储在 Node 物理节点中,ZooKeeper负责维护这些 Node。

例如,有 2 个 Topic,各自有 2 个 Partition。

这是逻辑上的形式,但在 Kafka 集群中的实际存储可能是这样的:

Topic A 的 Partition #1 有 3 份,分布在各个 Node 上。

这样可以增加 Kafka 的可靠性和系统弹性。

3 个 Partition #1 中,ZooKeeper 会指定一个 Leader,负责接收生产者发来的消息。

其他 2 个 Partition #1 会作为 Follower,Leader 接收到的消息会复制给 Follower。

这样,每个 Partition 都含有了全量消息数据。

即使某个 Node 节点出现了故障,也不用担心消息的损坏。

Topic A 和 Topic B 的所有 Partition 分布可能就是这样的:

感谢阅读,希望对你有所帮助!

编辑:陶家龙

出处:https://timothystepro.medium.com/visualizing-kafka-20bc384803e7

(责任编辑:人工智能)

推荐内容
  • 拯救者BIOS降级教程(降级BIOS,让拯救者重获新生)
  • windows 7下蓝牙无法使用可以连接但不能传输文件
  • ubuntu打开的正确方式(笑)在这个快节奏的时代。能够使用最快速度最低代价完成任务具有非常重要的意义,对于现代开发者来说,Linux是生活中必不可少且不可替代的工具,假如我们在开发少或学习中少一些遇到环境的坑,会节省很多时间,潜伏在各种Linux群中数年,发现大家都有手贱(操作失误,笑),因此在本文中给出终极解决方案: 直接使用Ubuntu Live CD 来完成系统的启动。那么最快的Linux安装办法又是什么呢?其实经过严谨的思考之后我个人觉得是不安装。我们可以准备从grub启动ubuntu操作系统把系统放到内存中,再预制出各种情况的环境包,也就是环境模块化,因为系统是在整个内存中所以速度非常非常快,需要模块化的内容并不多,比如说ssh vim tmux 为一组工具,开机后一个命令就可以激活工具包,不到几秒钟的时间即可完成,其他的如Chrome浏览器一类的都可以快速完成在内存上的安装。通过这种方式让环境更加灵活更加快速准备好开发环境。这是一个思路上的变化,从我需要什么就安装什么一起都准备好给你用->变成了只启动基础的系统然后我需要什么我就后加载什么。最后的准备在于容器,Docker 以及RKT与RunC的准备,在团队内可以秒级推送运行的环境。本文依然有它的缺点: 主要体现在两个方面假如默认驱动不好使会造成很多麻烦。对于内存小的开发机器还是做快照比较好。最少4G内存,我们推荐内存在8G以上最好是16G或者32G内存的机器上采用此方案。因为本方案整个操作系统都是加载到内存中的,硬盘速度即为内存的速度,我这里实测可以达到4.5Gb/s,所以你准备好屌丝逆袭(买不起SSD)秒杀高富帅了吗?ubuntu对于它的简单介绍可以参考这里。当然对于我本人而言选择Ubuntu主要原因仅仅是对他比较熟悉。并不限制使用什么发行版本。假如您要是选本方案搭建环境,并且选择其他发行版本请选择LiveCD尽量小一点的,假如能自己裁剪LiveCD就更好了,另外尽量选择64位架构。当然自己越熟悉越好。虽然Ubuntu有一点不自由,但是我个人觉得包的质量管理还是非常好的,的确适合开发者使用。Docker官方:https://www.docker.com/它对于我来说,几乎就像是水,假如没有他就没有今天的丰富多彩的运行方式,它可以让程序连同环境一起打包运行,使得部署备份等等非常方便,对于本次环境构建而言我们可以在个人的registry上备份自己的环境,只需要一小段时间就可以克隆回来。再加上现在各种永久免费的国内加速服务这种环境部署就是程序员天堂。更多细节请关注这里。在本文中我们使用单文件版本的Docker文件,方便可控。无任何累赘。本人不喜脚本安装。RunC && RKT这两种产品是libcontainer的代表。相对于Docker来说,它是一个容器只需要一个进程,对于Docker来说,他需要一个守护进程。在本文中(本博主)不评价任何产品的好坏,只说什么时候适合用什么。当然在我们这里利用了它启动方便,挂载方便的特性让我们的工作更方便更方便更方便!由于现在RunC还没有发布1.0版本文档几乎没有,因此我这里会给出我的详细研究结果。至于RKT还是大家自己摸索,文档已经很全了。CoreOS作为专门运行容器的操作系统,稳定性可不属性都是前所未有,当然我们的容器可以跑在这个上面本文中会提及两个系统的兼容性方案。Ubuntu适合程序开发的情况。启动速度可能在1分钟左右(有点慢)。但是有图形界面,有定制基础环境的方案。CoreOS适合跑程序,启动速度在10秒以下适合释放更多内存来跑临时业务,做测试的时候实用此方案。从Grub开始什么是Grub它可以装在硬盘上帮助你启动操作系统,几乎所有操作系统都可以,当然也包含本次的方案内容。安装方式有很多种。而且必须得根据自己的情况来安装。因为每个人电脑上的操作系统情况都不一样,有的已经有系统了。有的不想给自己装引导。可能先放到u盘上引导都有可能。因此这里不做安装方法上的更多描述可以自己根据情况到搜索引擎上搜索。Grub 的安装我之前是安装了windows,所以我直接安装了EasyBCD然后安装NeoGRUB来实现的。具体操作步骤如下:下载安装EasyBCD如图所示安装重启电脑之后选择Grub启动项可以进入一个类似输入命令的界面即可确定完成安装。Ubuntu 启动配置启动准备假如想要准备启动Ubuntu那么有三个关键要素,ubuntu-14.04.2-desktop-amd64.isoimage中casper/vmlinuz.efiimage中casper/initrd.lz这三个文件作为启动的必要文件请放到分区中容易找到的地方。推荐做法:给自己的硬盘上开个EXT4 分区,然后把三个文件丢到里面去。启动参数调试工作中我们讲求流程,当然我们也需要一定的路程,我们不可能一次调整就成功把ISO启动起来。因此我们先加一个调试流程。root (hd0,1)kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8initrd (hd0,1)/casper/initrd.lz你需要看清楚把文件放到了第几块硬盘上,第几块分区上。组成参数为(hd0,1)(我的是0号硬盘第二个分区)。假如你实在分不清可以参考这里。root (hd0,1) 设置GRUB的root设备kernel 命令套格式,变化参数 vmlinuz.efi 和 ubuntu-14.04.2-desktop-amd64.iso 要与你放到硬盘上的位置对应,可以使用Tab自动补全非常实用。initrd 依然是套格式找到对应硬盘傻姑娘的initrd.lz的位置。假如出现错误了按↑会出现刚才的命令,多加修改直到成功启动。启动参数放到硬盘中假如是NeoGrub配置文件路径C:/NST/menu.lst,其他的请参考说明文档,一般都会有的。配置文件写法:timeout 3default 0title Ubunturoot (hd0,1)kernel (hd0,1)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.2-desktop-amd64.iso ro quiet splash locate=en_US.UTF-8initrd (hd0,1)/casper/initrd.lz3秒等待自动选择第一项,名称ubuntu 别的剩下的就是刚才调试内容的命令了。完成刚需配置刚醒需求配置是指在容器之外的刚醒需求配置,比如说编辑器,SSH等等工具箱。配置方法: APT。修改安装源:sed -i ‘s/archive.ubuntu.com/mirrors.aliyun.com/g’ /etc/apt/sources.list && apt-get update安装你需要的软件包:apt-get install -y vim screen tmux ssh-server等等调试你的环境看看是否好使,然后复制文件夹/var/cache/apt/archives中所有deb文件即为您刚才所有的安装包。复制到一个可以持久化的文件夹中等待使用。回调环境: 每当您重新启动之后这些安装包即消失,想恢复,进入到上一步中复制到的文件夹中执行如下命令dpkg -i *即可安装预先准备好的软件灵活使用,此步骤为发挥组合拳威力的一步。当您反复定制凝练您的安装包之后,会根据个人情况选择不同的目录来初始化您的环境,其结果是,又小又轻,非常可靠。再也不怕手贱导致环境崩坏,再加上外部的git服务保证工作内容的安全性基本上可以肯定的说:我们的环境与硬件与工作耦合度降低不少.对于APT无法安装的内容,比如说JDK 与定制版本的Eclipse您可以通过下载完之后持久化保存到硬盘中,写一个脚本解压后放到硬盘中至于环境直接写入到profile中即可。使用此方法之后假如您使用IDE真的会有一个非常非常大的速度提升,我打开Eclipse C/C++ 5秒钟即可。容器安装配置一般情况下我们安装Docker都是通过网上下载脚本安装,但是这种情况下我们推荐使用直接下载单文件版本的来完成安装安装脚本如下:curl -sSL -O https://get.daocloud.io/docker/builds/Linux/x86_64/docker-latestchmod +x docker-latestmv docker-latest /usr/bin/dockerdocker -d &在第三行中复制docker程序到任何Path下的文件夹内备用。在配置上,还是要吧/var/lib/docker放到可持久化的软连接下面。比如说按照下面的操作:rm -rf /var/lib/dockerln -s /isodevice/docker /var/lib/docekr按照这种方法操作可以让docker image 持久化保存在硬盘中。重启也能找回来。这里注意,假如您之前就实践了CoreOS 171.3 版本上的Docker它使用的是1.6版本他的存储文件格式与1.7的不同因此不通用。我就踩到这个坑了。接下来的操作就与Docker一样了。注意:这个安装包: cgroup-lite_1.9_all.deb 一定要装,默认的光盘中就差这一个依赖,在下面的安装包中有要不就apt安装保存下来都可以。材料准备我在百度云盘中准备了三个文件,第一个是docker 1.7.1 第二个准别了vim screen ssh-server tmux CGroup的安装包。最后一个把我常用的Docker images 打包放出来了。其实在准备这个方案花最多时间就是在于精简依赖,最后发现只需要一个CGroup安装包。总结在本段文档中,我们给出了一个全新的使用Linux操作系统的思路不安装。并且做了一定的前期准备工作。启动了Linux操作系统做到本步骤假如您是新手就可以开始Linux的学习旅程了,假如您是需要此方案工作已经可以展开一般性质的工作了。最后我真的拆掉我的三爽垃圾ssd(越用越慢)直接上内存。方案合理要素:root权限过大。有时导致无法挽回的误操作。现在的电脑内存不是很贵。大部分Linux电脑内存都在闲置。Linux操作系统假如每次执行的任务假如比较单一(一台物理机只给一个人用)真的不会很大。给重新启动计算机赋予了新的意义。真正超过SSD的速度,成本更低。(实测启动Eclipse C/C++ 仅需要5s)
  • windows 7启动蓝屏0X0000007B代码的解决方法
  • 轻松掌握Windows10操作——以电脑ws10使用教程为主题(逐步学习ws10操作,提高电脑使用效率)
  • 在过去的几个星期,(几乎)每次都有消息 Ubuntu 15.04在启动时检测到系统程序错误 跑出来“欢迎”我。那时我是直接忽略掉它的,但是这种情况到了某个时刻,它就让人觉得非常烦人了!检测到系统程序错误(System program problem detected)你想立即报告这个问题吗?我肯定地知道假如你是一个Ubuntu用户,你可能曾经也遇到过这个恼人的弹窗。在本文中,我们将探讨在Ubuntu 14.04和15.04中遇到”检测到系统程序错误(system program problem detected)”时 应该怎么办。怎么解决Ubuntu中”检测到系统程序错误”的错误那么这个通知到底是关于什么的?大体上讲,它是在告知你,你的系统的一部分崩溃了。可别因为“崩溃”这个词而恐慌。这不是一个严重的问题,你的系统还是完完全全可用的。只是在之前的某个时刻某个程序崩溃了,而Ubuntu想让你决定要不要把这个问题报告给开发者,这样他们就能够修复这个问题。那么,我们点了“报告错误”的按钮后,它以后就不再显示了?不,不是的!即使你点了“报告错误”按钮,最后你还是会被一个如下的弹窗再次“欢迎”一下:对不起,Ubuntu发生了一个内部错误是个Apport(LCTT 译注:Apport是Ubuntu中错误信息的收集报告系统,详见Ubuntu Wiki中的Apport篇),它将会进一步的打开网页浏览器,然后你可以通过登录或创建Launchpad帐户来填写一份漏洞(Bug)报告文件。你看,这是一个复杂的过程,它要花整整四步来完成。但是我想帮助开发者,让他们知道这个漏洞啊 !你这样想的确非常地周到体贴,而且这样做也是正确的。但是这样做的话,存在两个问题。第一,存在非常高的概率,这个漏洞已经被报告过了;第二,即使你报告了个这次崩溃,也无法保证你不会再看到它。那么,你的意思就是说别报告这次崩溃了?对,也不对。假如你想的话,在你第一次看到它的时候报告它。你可以在上面图片显示的“显示细节(Show Details)”中,查看崩溃的程序。但是假如你总是看到它,或者你不想报告漏洞(Bug),那么我建议你还是一次性摆脱这个问题吧。修复Ubuntu中“检测到系统程序错误”的错误这些错误报告被存放在Ubuntu中目录/var/crash中。假如你翻看这个目录的话,应该可以看到有一些以crash结尾的文件。我的建议是删除这些错误报告。打开一个终端,执行下面的命令:sudo rm /var/crash/*这个操作会删除所有在/var/crash目录下的所有内容。这样你就不会再被这些报告以前程序错误的弹窗所扰。但是假如又有一个程序崩溃了,你就会再次看到“检测到系统程序错误”的错误。你可以再次删除这些报告文件,或者你可以禁用Apport来彻底地摆脱这个错误弹窗。彻底地摆脱Ubuntu中的系统错误弹窗假如你这样做,系统中任何程序崩溃时,系统都不会再通知你。假如你想问问我的看法的话,我会说,这不是一件坏事,除非你愿意填写错误报告。假如你不想填写错误报告,那么这些错误通知存不存在都不会有什么区别。要禁止Apport,并且彻底地摆脱Ubuntu系统中的程序崩溃报告,打开一个终端,输入以下命令:gksu gedit /etc/default/apport这个文件的内容是:# 设置0表示禁用Apportw,或者1开启它。# 你可以用下面的命令暂时关闭它:# sudo service apport start force_start=1enabled=1把enabled=1改为enabled=0。保存并关闭文件。完成之后你就再也不会看到弹窗报告错误了。很显然,假如我们想重新开启错误报告功能,只要再打开这个文件,把enabled设置为1就可以了。你的有效吗?我希望这篇教程能够帮助你修复Ubuntu 14.04和Ubuntu 15.04中检测到系统程序错误的问题。假如这个小窍门帮你摆脱了这个烦人的问题,请让我知道。