返回顶部
首页 > 资讯 > 数据库 >怎样认识 Kafka
  • 849
分享到

怎样认识 Kafka

2024-04-02 19:04:59 849人浏览 独家记忆
摘要

本篇文章为大家展示了怎样认识 kafka,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天我们来聊聊 Kafka ,主要是带你重新认识一下 Kafka,聊一下 &n

本篇文章为大家展示了怎样认识 kafka,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

今天我们来聊聊 Kafka ,主要是带你重新认识一下 Kafka,聊一下  Kafka 中比较重要的概念和问题。

我们现在经常提到 Kafka 的时候就已经默认它是一个非常优秀的消息队列了,我们也会经常拿它给 RocketMQRabbitMQ 对比。我觉得  Kafka 相比其他消息队列主要的优势如下:

  1. 极致的性能 :基于 Scala 和 Java 语言开发,设计中大量使用了批量处理和异步的思想,最高可以每秒处理千万级别的消息。

  2. 生态系统兼容性无可匹敌 :Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域。

实际上在早期的时候 Kafka 并不是一个合格的消息队列,早期的 Kafka  在消息队列领域就像是一个衣衫褴褛的孩子一样,功能不完备并且有一些小问题比如丢失消息、不保证消息可靠性等等。当然,这也和 LinkedIn 最早开发 Kafka  用于处理海量的日志有很大关系,哈哈哈,人家本来最开始就不是为了作为消息队列滴,谁知道后面误打误撞在消息队列领域占据了一席之地。

随着后续的发展,这些短板都被 Kafka 逐步修复完善。所以**,Kafka 作为消息队列不可靠这个说法已经过时!**

初识 Kafka

先来看一下官网对其的介绍,应该是最权威和实时的了。是英文也没有关系,我已经将比较重要的信息都为你提取出来了。

怎样认识 Kafka

从官方介绍中我们可以得到以下信息:

Kafka 是一个分布式流式处理平台。这到底是什么意思呢?

流平台具有三个关键功能:

  1. 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。

  2. 容错的持久方式存储记录消息流:Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险·。

  3. 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。

Kafka 主要有两大应用场景:

  1. 消息队列 :建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。

  2. 数据处理: 构建实时的流数据处理程序来转换或处理数据流。

关于 Kafka 几个非常重要的概念:

  1. Kafka 将记录流(流数据)存储在 topic 中。

  2. 每个记录由一个键、一个值、一个时间戳组成。

Kafka 消息模型

“题外话:早期的 JMS 和 AMQP 属于消息服务领域权威组织所做的相关的标准,我在 JavaGuide的  《消息队列其实很简单》这篇文章中介绍过。但是,这些标准的进化跟不上消息队列的演进速度,这些标准实际上已经属于废弃状态。所以,可能存在的情况是:不同的消息队列都有自己的一套消息模型。

”队列模型:早期的消息模型

怎样认识 Kafka

使用队列(Queue)作为消息通信载体,满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。  比如:我们生产者发送 100 条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)

队列模型存在的问题

假如我们存在这样一种情况:我们需要将生产者产生的消息分发给多个消费者,并且每个消费者都能接收到完成的消息内容。

这种情况,队列模型就不好解决了。很多比较杠精的人就说:我们可以为每个消费者创建一个单独的队列,让生产者发送多份。这是一种非常愚蠢的做法,浪费资源不说,还违背了使用消息队列的目的。

发布-订阅模型:Kafka 消息模型

怎样认识 Kafka

发布-订阅模型主要是为了解决队列模型存在的问题。

发布订阅模型(Pub-Sub) 使用主题(Topic)  作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。

在发布 - 订阅模型中,如果只有一个订阅者,那它和队列模型就基本是一样的了。所以说,发布 - 订阅模型在功能层面上是可以兼容队列模型的。

Kafka 采用的就是发布 - 订阅模型。 如下图所示:

“RocketMQ 的消息模型和 Kafka 基本是完全一样的。唯一的区别是 RocketMQ 中没有队列这个概念,与之对应的是  Partion(分区)。

”Kafka 重要概念解读

Kafka 将生产者发布的消息发送到 Topic(主题) 中,需要这些消息的消费者可以订阅这些  Topic(主题),如下图所示:

怎样认识 Kafka

Kafka Topic Partition

上面这张图也为我们引出了,Kafka 比较重要的几个概念:

  1. Producer(生产者) : 产生消息的一方。

  2. Consumer(消费者) : 消费消息的一方。

  3. Broker(代理) : 可以看作是一个独立的 Kafka 实例。多个 Kafka Broker 组成一个 Kafka Cluster。

同时,你一定也注意到每个 Broker 中又包含了 Topic 以及 Partion 这两个重要的概念:

  • Topic(主题) : Producer 将消息发送到特定的主题,Consumer 通过订阅特定的 Topic(主题) 来消费消息。

  • Partion(分区) : Partion 属于 Topic 的一部分。一个 Topic 可以有多个 Partion ,并且同一 Topic 下的  Partion 可以分布在不同的 Broker 上,这也就表明一个 Topic 可以横跨多个 Broker 。这正如我上面所画的图一样。

“划重点:Kafka 中的 Partion(分区) 实际上可以对应成为消息队列中的队列。这样是不是更好理解一点?”

另外,还有一点我觉得比较重要的是  Kafka 为分区(Partion)引入了多副本(Replica)机制。分区(Partion)中的多个副本之间会有一个叫做 leader 的家伙,其他副本称为  follower。我们发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。

“生产者和消费者只与 leader 副本交互。你可以理解为其他副本只是 leader 副本的拷贝,它们的存在只是为了保证消息存储的安全性。当 leader  副本发生故障时会从 follower 中选举出一个 leader,但是 follower 中如果有和 leader 同步程度达不到要求的参加不了 leader  的竞选。

”Kafka 的多分区(Partition)以及多副本(Replica)机制有什么好处呢?

  1. Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上,  这样便能提供比较好的并发能力(负载均衡)。

  2. Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。

Zookeeper 在 Kafka 中的作用

“要想搞懂 ZooKeeper 在 Kafka 中的作用 一定要自己搭建一个 Kafka 环境然后自己进  zookeeper 去看一下有哪些文件夹和 Kafka 有关,每个节点又保存了什么信息。 一定不要光看不实践,这样学来的也终会忘记!”

后面的文章中会介绍如何搭建  Kafka 环境,你且不要急,看了后续文章 3 分钟就能搭建一个 Kafka 环境。

“这部分内容参考和借鉴了这篇文章:https://www.jianshu.com/p/a036405f989c 。”

下图就是我的本地 Zookeeper  ,它成功和我本地的 Kafka 关联上(以下文件夹结构借助 idea 插件 Zookeeper tool 实现)。

怎样认识 Kafka

ZooKeeper 主要为 Kafka 提供元数据的管理的功能。

从图中我们可以看出,Zookeeper 主要为 Kafka 做了下面这些事情:

  1. Broker 注册 :在 Zookeeper 上会有一个专门用来进行 Broker 服务器列表记录的节点。每个 Broker 在启动时,都会到  Zookeeper 上进行注册,即到/brokers/ids 下创建属于自己的节点。每个 Broker 就会将自己的 IP  地址和端口等信息记录到该节点中去

  2. Topic 注册 :在 Kafka 中,同一个Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker  的对应关系也都是由 Zookeeper 在维护。比如我创建了一个名字为 my-topic 的主题并且它有两个分区,对应到 zookeeper  中会创建这些文件夹:/brokers/topics/my-topic/partions/0、/brokers/topics/my-topic/partions/1

  3. 负载均衡 :上面也说过了 Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker  上, 这样便能提供比较好的并发能力。对于同一个 Topic 的不同 Partition,Kafka 会尽力将这些 Partition 分布到不同的 Broker  服务器上。当生产者产生消息后也会尽量投递到不同 Broker 的 Partition 里面。当 Consumer 消费的时候,Zookeeper 可以根据当前的  Partition 数量以及 Consumer 数量来实现动态负载均衡。

  4. ......

Kafka 如何保证消息的消费顺序?

我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2  个消息对应的操作分别对应的数据库操作是:更改用户会员等级、根据会员等级计算订单价格。假如这两条消息的消费顺序不一样造成的最终结果就会截然不同。

我们知道 Kafka 中 Partition(分区)是真正保存消息的地方,我们发送的消息都被放在了这里。而我们的 Partition(分区) 又存在于  Topic(主题) 这个概念中,并且我们可以给特定 Topic 指定多个 Partition。

怎样认识 Kafka

Kafka Topic Partions Layout

每次添加消息到 Partition(分区) 的时候都会采用尾加法,如上图所示。Kafka 只能为我们保证 Partition(分区)  中的消息有序,而不能保证 Topic(主题) 中的 Partition(分区) 的有序。

“消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。Kafka  通过偏移量(offset)来保证消息在分区内的顺序性。”

所以,我们就有一种很简单的保证消息消费顺序的方法:1 个 Topic 只对应一个  Partion。这样当然可以解决问题,但是破坏了 Kafka 的设计初衷。

Kafka 中发送 1 条消息的时候,可以指定 topic, partition, key,data(数据) 4 个参数。如果你发送消息的时候指定了  partion 的话,所有消息都会被发送到指定的 partion。并且,同一个 key 的消息可以保证只发送到同一个  partition,这个我们可以采用表/对象的 id 来作为 key 。

总结一下,对于如何保证 Kafka 中消息消费的顺序,有了下面两种方法:

  1. 1 个 Topic 只对应一个 Partion。

  2. (推荐)发送消息的时候指定 key/partion。

当然不仅仅只有上面两种方法,上面两种方法是我觉得比较好理解的,

上述内容就是怎样认识 Kafka,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 怎样认识 Kafka

本文链接: https://lsjlt.com/news/69905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样认识 Kafka
    本篇文章为大家展示了怎样认识 Kafka,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天我们来聊聊 Kafka ,主要是带你重新认识一下 Kafka,聊一下 &n...
    99+
    2024-04-02
  • 怎样认识Python中的defaultdict
    怎样认识Python中的defaultdict,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。今天我们的主角是 defaultdict,同时也会介绍一下模仿方法&nbs...
    99+
    2023-06-04
  • 怎样全面的认识JVM技术
    今天就跟大家聊聊有关怎样全面的认识JVM技术,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JVM的概念JVM(Java虚拟机)是可运行Java代码的假想计算机。只要根据JVM规格描述...
    99+
    2023-06-17
  • windows系统怎样认识vista保护模式
    windows系统怎样认识vista保护模式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这个模式用我的理解即是在一个IE进程里不允许有不同“安全级别”的IE窗体。 在这里...
    99+
    2023-06-14
  • 怎样解析Kafka架构
    本篇文章给大家分享的是有关怎样解析Kafka架构,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Kafka是一个开源的、分布式的、可分区的、可复制的基于日志提交的发布订阅消息系统...
    99+
    2023-06-19
  • 怎样安装测试kafka
    本篇文章为大家展示了怎样安装测试kafka,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在server1和server2上安装kafkacd /tmptar -xzf kafka_2.12-2.4....
    99+
    2023-06-05
  • 怎样给Kafka新增分区
    目录给Kafka新增分区1、修改 topic 的分区2、迁移数据3、迁移4、验证Kafka分区原理机制分区结构分区优点分区策略根据分区策略实现消息的顺序消费默认分区策略源码总结给Ka...
    99+
    2022-12-27
    Kafka新增分区 Kafka分区 新增Kafka分区
  • 认识python
    1.python的起源 Python 的创始人为吉多·范罗苏姆(Guido van Rossum) 2.python的优缺点 优点 简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样...
    99+
    2023-01-30
    python
  • Kafka的体系架构是怎样的
    这期内容当中小编将会给大家带来有关Kafka的体系架构是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、什么是Kafka?数据工程中最具挑战性的部分之一是如何从不同点收集和传输大量数据到分布式系统...
    99+
    2023-06-02
  • C语言中几种常量的认识和理解是怎样的
    本篇文章为大家展示了C语言中几种常量的认识和理解是怎样的 ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、C语言常量是什么?常量是指在程序运行过程中其值不能被改变的量。 C语言中常量可分为直接常量...
    99+
    2023-06-22
  • mysql-1:认识mysql
    文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史:SQL语言分类 ...
    99+
    2023-10-06
    mysql 数据库
  • JAVASE---认识异常
    在Java中,将程序执行过程中发生的不正常行为称为异常。 算数异常 数组越界异常 空指针异常 java中不同类型的异常,都有与其对应的类来进行描述。 异常的体系结构 Throwable:是异常体系的顶层类,其派生出两个重要的子类, Er...
    99+
    2023-10-10
    java 算法 数据结构 git github idea
  • 认识 mysql 命令
    文章目录 1.简介2.选项3.子命令4.小结参考文献 1.简介 mysql 是 MySQL 的命令行客户端,用于连接到 MySQL 服务器并执行 SQL 语句。 它支持交互式和非交互式两种...
    99+
    2023-09-04
    mysql
  • 认识thinkphp框架
    https://www.thinkphp.cn/down.html 版本5.0.24 ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架 tp5 WEB部署目录(或者子目录)...
    99+
    2023-09-04
    php apache java
  • BP3认识首页
    对IE浏览器做了支持。对移动终端视口做了优化。现载入BP的css样式。最终载入BP和jquery的js文件。注意:把css文件放在head中,js文件放在body的最下面,jquery在BP上面。<!DOCTYPE html> ...
    99+
    2023-01-31
    首页
  • 【Java】认识String类
    文章目录 一、String类的重要性二、String类中的常用方法1.字符串构造2.String对象的比较3.字符串查找4.转换5.字符串替换6.字符串拆分7.字符串截取8.其他操作方法9.字符串的不可变性10.字符串修改 三、...
    99+
    2023-12-23
    java 开发语言
  • 【Java】认识异常
    文章目录 一、异常的概念和体系结构1.异常的概念2.异常的体系结构3.异常的分类 二、异常的处理1.防御式异常2.异常的抛出3.异常的捕捉 三、异常的处理流程四、自定义异常类 一、异常的概念和体系结构 1.异常的概念 ...
    99+
    2023-12-22
    java 开发语言
  • kafka安全认证与授权(SASL/PLAIN)
    技术储备 SASL 鉴权协议,主要用来保证客户端登录服务器的时候,传输的鉴权数据的安全性,SASL是对用户名和密码加解密用的 SSL 是一种间于传输层(比如TCP/IP)和应用层(比如HTTP)的...
    99+
    2023-09-05
    kafka 安全 java
  • kafka的知识点有哪些呢
    这篇文章给大家介绍kafka的知识点有哪些呢,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、kafka HA1.1 replication如图.1所示,同一个 partition 可能会有多个 replica(对应 ...
    99+
    2023-06-03
  • mysql怎样设置默认值
    这篇文章主要介绍mysql怎样设置默认值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql设置默认值的方法:用mysql建数据表设置默认值,代码为【stuSex varcha&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作