初识Kafka

1.初识kafka

官网:Apache Kafka

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

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

Kafka的基本架构由生产者、消费者和主题(topic)组成生产者 可以将数据发布到指定的主题,而消费者 可以订阅这些主题并消费其中的数据。同时,Kafka还支持数据流的处理和转换 ,可以在管道中通过Kafka Streams API进行流式计算,例如过滤、转换、聚合等。
Kafka使用高效的数据存储和管理技术能够轻松地处理TB级别的数据量 。其优点包括高吞吐量、低延迟、可扩展性、持久性和容错性等。

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

2. 为什么要使用kafka

我们通过一个经典的kafka使用场景--》日志聚合的应用场景来分析一下kafka的的特点。知道了产品的特点,我们也就知道了为甚么要用kafka。

如下图所示,kafka可以汇集不同大量的日志,然后各系统根据所需获取对应的日志。想象一下,如果没有使用kafka,这些大量不同的日志与各个系统之间应该怎么样处理?

业务场景决定了产品的特点:

  1. 数据吞吐量很大: 需要能够快速收集各个渠道的海量日志。
  2. 集群容错性高:允许集群中少量节点崩溃。
  3. 功能不需要太复杂:Kafka的设计目标是高吞吐、低延迟和可扩展,主要关注消息传递而不是消息处理。所以,Kafka并没有支持死信队列、顺序消息等高级功能。
  4. 允许少量数据丢失:Kafka本身也在不断优化数据安全问题,目前基本上可以认为Kafka可以做到不会丢数据。

3. 单机服务搭建

  1. 准备一台虚拟机

  2. 安装jdk

jdk安装可参考Linux环境下安装JDK-CSDN博客

  1. 关闭防火墙(实验版本关闭防火墙,生产环境开启对应端口即可)

    firewall-cmd --state 查看防火墙状态
    systemctl stop firewalld.service 关闭防火墙

第一步,下载kafka

下载地址:Apache Kafka

本文章使用的是3.2.0版本

关于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后的一种应对方法。
第二步:.tgz文件上传到服务器且解压

bash 复制代码
tar -xzf kafka_2.13-3.6.1.tgz


第三步:启动zookeeper

下载下来的Kafka安装包不需要做任何的配置,就可以直接单击运行。Kafka的运行依赖于zookeeper,所以,接下来,启动kafka内置的zookeeper。通过jps指令看到一个QuorumPeerMain进程,确定服务启动成功。

bash 复制代码
cd kafka_2.13-3.6.1
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
jps


第四步: 启动kafka

nohup bin/kafka-server-start.sh config/server.properties &

使用jps指令,看到一个kafka进程,这样我们就成功启动了一个kafka。

4. 消息的收发

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

4.1 发消息

消息是存储在topic上的,所以,发送消息前,我们需要有topic。

创建一个topic

bash 复制代码
bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9092


查看topic

bash 复制代码
bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092


有了topic 接下来,我们可以发送一条消息在这个topic上了。
启动一个消息发送者端。往一个名为test 的 Topic 发送消息。

bash 复制代码
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

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

如果不提前创建Topic,那么在第一次往一个之前不存在的Topic发送消息时,消息也能正常发送,只是会抛出LEADER_NOT_AVAILABLE警告。

一些生产者具体指令参数可以使用help指令查看

bash 复制代码
 bin/kafka-console-producer.sh --help

4.2 消费消息

4.2.1 最简单的消费模式

然后启动一个消息消费端,从名为 test 的 Topic 上接收消息。

bash 复制代码
 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning  


截至为此,我们完成了一个基础的交互。这其中,生产者和消费者并不需要同时启动。他们之间可以进行数据交互,但是又并不依赖于对方。没有生产者,消费者依然可以正常工作,反过来,没有消费者,生产者也依然可以正常工作。这也体现出了生产者和消费者之间的解耦。
注意:如果没有 --from-beginning 这个参数,消费端只能收到当前消息发送端实时发送的消息,之前的收不到,如果要收到之前的消息,需要加上--from-beginning参数,当然也可以指定从哪条消息开始接收。

一些具体指令参数,我们可以使用以下命令来查看

bash 复制代码
 bin/kafka-console-consumer.sh --help

4.2.2 指定消费进度

消费之前发送的消息:

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

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

指定从具体的消息消费:

以下为从第0号Partition上的第4个消息开始读起的指令

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

4.2.3 分组消费

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

可以启动三个消费者组,来验证一下分组消费机制:

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

启动第一个 同一消费者组的消费者

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGrroup2 --topic test


启动第二个 同一消费者组的消费者

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGrroup --topic test


启动一个不同消费者组的消费者


接下来,启动生产者,在test这个topic中发送消息 ,当发送了一条消息后,

这条消息被同一个消费者组下的一个消费者消费了。而不属于同一个消费者组的其他消费者,也消费到了这一条消息。

4.3 查看消费者组的偏移量

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

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

Kafka的消息发送者和消息消费者通过Topic这样一个逻辑概念来进行业务沟通。但是实际上,所有的消息是存在服务端的Partition这样一个数据结构当中的。

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

  1. 客户端Client: 包括消息生产者 和 消息消费者。
  2. 消费者组:每个消费者可以指定一个所属的消费者组,相同消费者组的消费者共同构成一个逻辑消费者组。每一个消息会被多个感兴趣的消费者组消费,但是在每一个消费者组内部,一个消息只会被消费一次。
  3. 服务端Broker:一个Kafka服务器就是一个Broker。
  4. 话题Topic:这是一个逻辑概念,一个Topic被认为是业务含义相同的一组消息。客户端都通过绑定Topic来生产或者消费自己感兴趣的话题。
  5. 分区Partition:Topic只是一个逻辑概念,而Partition就是实际存储消息的组件。每个Partiton就是一个queue队列结构。所有消息以FIFO先进先出的顺序保存在这些Partition分区中。一个Topic中可以有多个 Partition。
相关推荐
WX187021128731 小时前
在分布式光伏电站如何进行电能质量的治理?
分布式
Stringzhua2 小时前
【SpringCloud】Kafka消息中间件
spring·spring cloud·kafka
不能再留遗憾了4 小时前
RabbitMQ 高级特性——消息分发
分布式·rabbitmq·ruby
茶馆大橘4 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
材料苦逼不会梦到计算机白富美7 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王7 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情7 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
杨荧8 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
ZHOU西口9 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk9 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka