01.Kafka简介与基本概念介绍

1 Kafka 简介

        Kafka 是最初由 Linkedin公司开发,是一个分布式、支持分区(partition)的、多副本(replica)的,基于 Zookeeper 协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于 hadoop 的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,Kafka 使用 scala 语言编写,Linkedin 于2010年贡献给了 Apache 基金会并成为顶级开源项目。

        Kafka 设计之初被用于消息队列,自 2011 年由 LinkedIn 开源以来,Kafka 迅速从分布式的基于发布/订阅模式的消息队列(MessageQueue)消息队列演变为成熟的事件流处理平台。

1.1 Kafka的使用场景

  • 日志收集:公司可以用 Kafka 收集各种服务的 log,通过 kafka 以统一接口服务的方式开放给各种 consumer,例如 hadoop、Hbase、ElasticSearch 等。比如如下的日志平台架构
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka 经常被用来记录 web 用户或者 app 用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  • 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。

2 Kafka 基本概念

        kafka是一个分布式的,分区的消息(官方称之为 commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。

        可以这样来说,Kafka 借鉴了JMS 规范的思想,但是确并没有完全遵循 JMS 规范。

        我们来看一下基础的消息(Message)相关术语:

名称

解释

Broker

消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群。

Topic

Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic。

Producer

消息生产者,向Broker发送消息的客户端。

Consumer

消息消费者,从Broker读取消息的客户端。

ConsumerGroup

每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息。

Partition

物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的。

        因此,从一个较高的层面上来看,producer 通过网络发送消息到 Kafka 集群,然后再由 Consumer 来进行消费,如下图的 Kafka 集群架构:

        一个典型的Kafka集群中包含若干 Producer,若干 Broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干 Consumer Group,以及一个Zookeeper集群。Kafka 通过Zookeeper 管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer 使用 push 模式将消息发布到 Broker,Consumer 使用pull模式从broker订阅并消费消息。

        服务端(Brokers)和客户端(Producer、Consumer)之间通信通过TCP协议来完成。

2.1 Kafka的优点

解耦

消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

冗余(副本)

有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

扩展性

因为消息队列解耦了处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。

灵活性&峰值处理能力

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见,如果为能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

顺序保证

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。

缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。

异步通信

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

2.2 Kafka的相关术语以及之间的关系:

2.2.1 Kafka 相关术语

术语

说明

Broker

Kafka 集群包含一个或多个服务器,每个服务器节点称为 Broker

Broker 存储 Topic 的数据。如果某 Topic 有N个partition,集群有 N个broker,那么每个broker存储该topic的一个partition。

如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。

如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)。

类似于数据库的表名。

Partition

topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1

Producer

生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。

Consumer

消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。

Consumer Group

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

Leader

每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。

Follower

Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。

2.1.2 Topics与Partition

        Topic 在逻辑上可以被认为是一个 queue,每条消息都必须指定它的 Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得 Kafka 的吞吐率可以线性提高,物理上把 Topic分成一个或多个 Partition,每个 Partition 在物理上对应一个文件夹,该文件夹下存储这个 Partition 的所有消息和索引文件。创建一个 Topic 时,同时可以指定分区数目,分区数越多,其吞吐量也越大,但是需要的资源也越多,同时也会导致更高的不可用性,Kafka 在接收到生产者发送的消息之后,会根据均衡策略将消息存储到不同的分区中。因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。

        如果一个 Topic 的副本数为 3,那么 Kafka 将在集群中为每个 partition 创建 3 个相同的副本,只不过各个 Follower Partition 从 Leader Partition 同步数据的进度不同。集群中的每个 Broker 存储一个或多个 partition。多个 Producer 和 Consumer 可同时生产和消费数据。

        对于传统的 message queue而言,一般会删除已经被消费的消息,而 Kafka 集群会保留所有的消息,无论其被消费与否。当然,因为磁盘限制,不可能永久保留所有数据(实际上也没必要),因此Kafka提供两种策略删除旧数据。一是基于时间,二是基于Partition文件大小

        Kafka 以主题为单位进行归类。主题为逻辑上的概念。Partition 也可以理解为逻辑上的概念。

  • 一个 Partition 只能属于单个 Topic,一个 Partition  下可以有多个Topic ,Partition 里有不同的消息,类似于一个追加的日志文件。
  • Topic 与 Partition  一对多。
  • 分区的目的:分散磁盘IO。
2.1.3 Producer消息路由

        Producer 发送消息到 broker 时,会根据 Paritition 机制选择将其存储到哪一个 Partition。如果 Partition 机制设置合理,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。

2.1.4 消费者与消费者组 Consumer Group:

        同一 Partion 的一条消息只能被同一个Consumer Group内的一个Consumer消费,但多个Consumer Group可同时消费这一消息。

2.1.5 消息中间件模型

        点对点(P2P,Point-to-Point)模式和发布/订阅(Pub/Sub)模式。

  • 点对点是基于队列的,消息生产者发送消息到消息队列,消费者从队列中接收消息。
  • 发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(Topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者从主题中订阅消息。
  • Kafka同时支持两种消息投递模式,而这得益于消费者与消费者组模型的契合。
  • 消费者都隶属于同一个消费组,相当于点对点模型。
  • 消费者都隶属于不同的消费者组,相当于发布/定于模式应用。
2.1.6 线程安全
  • Kafka 的 Producer 是线程安全的。
  • Kafka 的 Consumer 不是线程安全的。

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

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

相关文章

Spring AOP详解,简单Demo

目录 一、Spring AOP 是什么? 二、学习AOP 有什么作用? 三、AOP 的组成 四、 Spring AOP 简单demo 一、Spring AOP 是什么? Spring AOP(Aspect-Oriented Programming in Spring)是Spring框架中的一个重要组件&…

【13】编写shell-备份mysql数据

【13】编写shell-备份mysql数据 # !/bin/bash#****************************************************** # Author : 秋天枫叶35 # Last modified : 2024-04-25 # Filename : dbbackup-sql.sh # Description : 备份mysql数据库sql语句 #***********************…

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下: 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段:…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解,分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

LT6911GX HDMI2.1 至四端口 MIPI/LVDS,带音频 龙迅方案

1. 描述LT6911GX 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。HDCP RX作为HDCP中继器的上游,可以与其他芯片的HDCP TX配合使用,实现中继器功能。对于 HDMI2.1 输入,LT6911GX 可配置为 3/4 通道。自适应均衡功能使其适合…

学习C语言的指针

有一阵没更新了,因为最近比较繁忙,所以更新比较慢,还在慢慢学习 话不多说,开始今天的内容,聊一聊C语言指针。 很多小伙伴可能会被指针这个名字吓到,觉得很难,实际上确实有点难,但是…

关于谷歌浏览器对于https的证书不通过校验的无法跳转的问题

谷歌浏览器对于https的证书问题会出现如下提示: 解决方法: 直接在页面输入 thisisunsafe 就能跳转了.

SpringCloud系列(21)--更换Ribbon的负载均衡模式

前言:在上一篇文章中我们介绍了关于Ribbon的知识点已经如果去应用Ribbon,而本章节内容则是关于如何去切换Ribbon的负载均衡模式。 以下是上篇文章的部分内容,可以再看下熟悉下,方便后续理解 Ribbon工作架构图 Ribbon的负载均衡模式…

Linux基本指令(3)

目录 时间相关的指令: 1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加好后接数个标记,其中常用的标记列表如下: 2.在设定时间方面: 3.时间戳: Cal指令: find指令&a…

机器学习:驱动现代交通运输革命的AI智慧引擎

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

C#中的扩展方法

C#中的扩展方法是一种非常实用的语言特性,它允许我们在不修改原有类定义的情况下,为其添加新的方法。这种机制极大地增强了代码的灵活性和可维护性,特别是在处理第三方库或无法直接修改源码的类时尤为有用。下面,我将详细阐述C#扩…

22 - Hadoop HA 高可用集群搭建、手动模式、自动模式以及HA模式集群

目录 1、HA 概述 2、HDFS-HA 集群搭建 2.1、HDFS-HA 核心问题 3、HDFS-HA 手动模式 3.1、环境准备 3.2、规划集群 3.3、配置 HDFS-HA 集群 3.4、启动 HDFS-HA 集群 4、HDFS-HA 自动模式 4.1、HDFS-HA 自动故障转移工作机制 4.2、HDFS-HA 自动故障转移的集群规划 4.…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速,很快又要到一年一度的五一劳动节啦,今年五天假,做好准备了吗?今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…

中科数安 | 电脑文件落地透明加密软件系统

#电脑文件加密软件# 中科数安的文件落地透明加密软件系统是一种先进的信息安全解决方案,旨在保护企业内部的敏感数据免受内外部威胁。 PC地址:www.weaem.com 该系统的特点和功能主要包括: 透明加密技术:系统自动对指定类型或目录…

Web 服务器解析漏洞 原理以及修复方法

漏洞名称 :Web服务器解析漏洞 漏洞描述: 服务器相关中间件存在一些解析漏洞,攻击者可通过上传一定格式的文件,被服务器的中间件进行了解析,这样就对系统造成一定危害。常见的服务器解析漏洞涉及的中间件有IIS&#x…

机器学习——构建决策树

第1关:返回分类次数最多的分类名称 import operatordef majorityCnt(classList):classCount {}for i in classList:if i not in classCount:classCount[i] 0classCount[i] 1sortedClassCount sorted(classCount.items(), keyoperator.itemgetter(1), reverseTr…

webpack前端性能优化- HappyPack多线程打包-打包速度提升n倍

HappyPack 由于运行在 Node.js 之上的 webpack 是单线程模型的,我们需要 webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力 HappyPack 插件就能实现多线程打包,它把任务分解给多个子进程去并发的执行,子进程处理完后再把…

Linux通过命令查看系统时间

Linux通过命令查看系统时间 查看Linux系统的时间查看Linux系统的时区 查看Linux系统的时间 查看时间和日期 date设置时间和日期 例1:将系统日期设定成2024年11月11日的命令 命令 : date -s 11/11/2024例2:将系统时间设定成下午2点12分12秒…

Spring Boot应用部署 - War包部署

WAR包部署 将Spring Boot应用部署为WAR包并部署到外部Tomcat服务器上,需要进行一些特定的配置和步骤。以下是详细说明: 1. 修改打包方式 在项目的构建工具配置文件中(通常是pom.xml for Maven),将打包方式改为war。…

Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.3 创建OpenSBI虚拟化环境

1.概述 上一章节我们已经添加了几个外设,这一章节我们打算为移植OpenSBI做环境准备,顺便修复一些BUG。什么是OpenSBI呢?OpenSBI 是RISC-V的一段BL2程序,他负责加载跳转BL3(U-boot)程序,它提供了许多开源的IP driver,方便用户快速移植,同时也提供了三种模式,具体我会…