Kafka快速实战以及基本原理分析

发布时间:2024年01月18日

Kafka快速实战以及基本原理分析

1.Kafka介绍

Kafka官网

https://kafka.apache.org/

image-20240116094713372

ChatGPT对于Apache Kafka的介绍:

Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。

Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker(服务器)组成,这些broker可以在多个数据中心之间分布式部署,以提供高可用性和容错性。

Kafka的基本架构由生产者、消费者和主题(topic)组成。生产者可以将数据发布到指定的主题,而消费者可以订阅这些主题并消费其中的数据。同时,Kafka还支持数据流的处理和转换,可以在管道中通过Kafka Streams API进行流式计算,例如过滤、转换、聚合等。

Kafka使用高效的数据存储和管理技术,能够轻松地处理TB级别的数据量。其优点包括高吞吐量、低延迟、可扩展性、持久性和容错性等。

Kafka在企业级应用中被广泛应用,包括实时流处理、日志聚合、监控和数据分析等方面。同时,Kafka还可以与其他大数据工具集成,如Hadoop、Spark和Storm等,构建一个完整的数据处理生态系统。

Kafka是一个优秀的消息中间件产品,那么MQ的作用有什么呢?

常见的MQ产品RabbitMQ、RocketMQ、Kafka的作用通常都为一下三点:

  • 异步

    例子:快递员发快递,直接到客户家效率会很低。引入菜鸟驿站后,快递员只需要把快递放到菜鸟驿站,就可以继续发其他快递去了。客户再按自己的时间安排去菜鸟驿站取快递。

    作用:异步能提高系统的响应速度、吞吐量。

  • 解耦

    例子:《Thinking in JAVA》很经典,但是都是英文,我们看不懂,所以需要编辑社,将文章翻译成其他语言,这样就可以完成英语与其他语言的交流。

    作用:

    1、服务之间进行解耦,才可以减少服务之间的影响。提高系统整体的稳定性以及可扩展性。

    2、另外,解耦后可以实现数据分发。生产者发送一个消息后,可以由一个或者多个消费者进行消费,并且消费者的增加或者减少对生产者没有影响。

  • 削峰

    例子:长江每年都会涨水,但是下游出水口的速度是基本稳定的,所以会涨水。引入三峡大坝后,可以把水储存起来,下游慢慢排水。

    作用:以稳定的系统资源应对突发的流量冲击。

2.为什么用Kafka

一个典型的日志聚合的应用场景:

image-20240116095056950

业务场景决定了产品的特点,Kafka的特点主要有以下几点:

1、数据吞吐量很大: 需要能够快速收集各个渠道的海量日志

2、集群容错性高:允许集群中少量节点崩溃

3、功能不需要太复杂:Kafka的设计目标是高吞吐、低延迟和可扩展,主要关注消息传递而不是消息处理。所以,Kafka并没有支持死信队列、顺序消息等高级功能。

4、允许少量数据丢失:Kafka本身也在不断优化数据安全问题,目前基本上可以认为Kafka可以做到不会丢数据。

3.Kafka快速上手

1.kafka安装

1.准备一台linux服务器,并安装了jdk环境。

2.下载Kafka,下载地址https://kafka.apache.org/downloads,选择kafka_2.13-3.4.0.tgz进行下载。

关于kafka的版本,前面的2.13是开发kafka的scala语言的版本,后面的3.4.0是kafka应用的版本。

Scala是一种运行于JVM虚拟机之上的语言。在运行时,只需要安装JDK就可以了,选哪个Scala版本没有区别。但是如果要调试源码,就必须选择对应的Scala版本。因为Scala语言的版本并不是向后兼容的。

另外,在选择kafka版本时,建议先去kafka的官网看下发布日志,了解一下各个版本的特性。 https://kafka.apache.org/downloads。 例如3.2.0版本开始将log4j日志框架替换成了reload4j,这也是应对2021年log4j框架爆发严重BUG后的一种应对方法。

3.下载完成后,将Kafka安装包上传到linux服务器上,并解压

 tar -xvf kafka_2.13-3.4.0.tgz 

image-20240116095729636

这样kafka就已经安装完完成了。接下来我们来体验一下Kafka。

2.Kafka服务体验

下载下来的Kafka安装包不需要做任何的配置,就可以直接单击运行。

1.启动Zookeeper。

启动Kafka之前需要先启动Zookeeper。这里就用Kafka自带的Zookeeper。启动脚本在bin目录下。

cd /app/kafka/kafka_2.13-3.4.0/
nohup bin/zookeeper-server-start.sh config/zookeeper.properties & 

从nohup.out中可以看到zookeeper默认会在2181端口启动。通过jps指令看到一个QuorumPeerMain进程,确定服务启动成功。

2.启动Kafka

cd /app/kafka/kafka_2.13-3.4.0/
nohup bin/kafka-server-start.sh config/server.properties &

启动完成后,使用jps指令,看到一个kafka进程,确定服务启动成功。服务会默认在9092端口启动。

image-20240116100504175

如图显示则证明Kafka和Zookeeper均启动成功,就可以来体验了。

3.简单收发消息

Kafka的基础工作机制是消息发送者可以将消息发送到kafka上指定的topic,而消息消费者,可以从指定的topic上消费消息。

image-20240116100645961

1.利用Kafka提供的客户端脚本创建Topic

#创建Topic
bin/kafka-topics.sh --create --topic demo1 --bootstrap-server localhost:9092
#查看Topic
bin/kafka-topics.sh --describe --topic demo1 --bootstrap-server localhost:9092

image-20240116101134407

image-20240116141916167

2.启动消息接收者

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo1

光标在闪动,证明消费者启动成功

3.复制一个标签页,启动消息发送者,向名称为demo1的Topic发送消息

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic demo1

当命令行出现 > 符号后,随意输入一些字符,例如“hello,kafka”。Ctrl+C 退出命令行。这样就完成了往kafka发消息的操作。

image-20240116101635135

此时消息接收者会受到消息

image-20240116101643845

这样就完成了一个基础的交互。这其中,生产者和消费者并不需要同时启动。他们之间可以进行数据交互,但是又并不依赖于对方。没有生产者,消费者依然可以正常工作,反过来,没有消费者,生产者也依然可以正常工作。这也体现出了生产者和消费者之间的解耦。

4.其他消费模式

1.指定消费进度

通过kafka-console.consumer.sh启动的控制台消费者,会将获取到的内容在命令行中输出。如果想要消费之前发送的消息,可以通过添加–from-begining参数指定。

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic demo1

image-20240116103922152

如果需要更精确的消费消息,甚至可以指定从哪一条消息开始消费。

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --partition 0 --offset 4 --topic demo1

image-20240116103856918

这表示从第0号Partition上的第四个消息开始读起。Partition和Offset是什么呢?

在Apache Kafka中,分区(Partition)和偏移量(Offset)是两个关键的概念,用于管理和定位消息。

分区(Partition):

Kafka 的主题(Topic)可以被分为多个分区。每个分区是一个有序且不可变的消息序列,分区内的消息会按照它们进入分区的顺序被顺序存储。分区的作用主要有以下几点:

  1. 水平扩展: 分区允许 Kafka 在多个节点上并行处理消息,提高了系统的吞吐量和可伸缩性。
  2. 容错性: 每个分区的副本可以分布在不同的节点上,确保即使某个节点失败,数据依然可用。
  3. 顺序性: 分区内的消息是有序的,而跨分区的消息顺序不能保证。

偏移量(Offset):

偏移量是一个与消息相关的唯一标识,它表示在分区中的消息位置。在 Kafka 中,每个消息都有一个唯一的偏移量,它是相对于分区而言的。偏移量是一个非负整数,用于唯一地标识分区中的每一条消息。

偏移量的作用:

  1. 消息位置标识: 消费者通过偏移量来标识自己在分区中的消费位置,以确保不会漏掉任何消息。
  2. 精确定位: 可以通过指定偏移量来准确地获取特定位置的消息,而不必从头开始读取整个分区。
  3. 管理消费状态: 偏移量由消费者维护,用于跟踪已经消费的消息,以便在重启后能够从上次的位置继续消费。
2.分组消费

对于每个消费者,可以指定一个消费者组。kafka中的同一条消息,只能被同一个消费者组下的某一个消费者消费。而不属于同一个消费者组的其他消费者,也可以消费到这一条消息。在kafka-console-consumer.sh脚本中,可以通过–consumer-property group.id=testGroup来指定所属的消费者组。例如,可以启动三个消费者组,来验证一下分组消费机制:

#两个消费者实例属于同一个消费者组
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic demo1
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic demo1
#这个消费者实例属于不同的消费者组
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup2 --topic demo1

这时在发送一条“11”的消息,可以观察到统一消费者组的消费者实例共享一条消息,而不同消费者组的互不干扰

5.查看消费者组的消费进度

使用kafka-consumer-groups.sh观测消费者组的情况。包括他们的消费进度。

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group testGroup

image-20240116105716828

从这里可以看到,虽然业务上是通过Topic来分发消息的,但是实际上,消息是保存在Partition这样一个数据结构上的。

4.理解Kafka的消息传递机制

image-20240116132328345

在Kafka的技术体系中,有以下一些概念需要先熟悉起来:

  • 客户端Client: 包括消息生产者 和 消息消费者。
  • 消费者组:每个消费者可以指定一个所属的消费者组,相同消费者组的消费者共同构成一个逻辑消费者组。每一个消息会被多个感兴趣的消费者组消费,但是在每一个消费者组内部,一个消息只会被消费一次。
  • 服务端Broker:一个Kafka服务器就是一个Broker。
  • 话题Topic:这是一个逻辑概念,一个Topic被认为是业务含义相同的一组消息。客户端都通过绑定Topic来生产或者消费自己感兴趣的话题。
  • 分区Partition:Topic只是一个逻辑概念,而Partition就是实际存储消息的组件。每个Partiton就是一个queue队列结构。所有消息以FIFO先进先出的顺序保存在这些Partition分区中。
文章来源:https://blog.csdn.net/qq_42439945/article/details/135623666
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。