1.初识 kafka
Kafka是一个由Scala和Java语言开发的,经典高吞吐量的分布式消息发布和订阅系统,也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐,低延迟,高伸缩,高可靠性,高并发,且社区活跃度高等特性,从而备受广大技术组织的喜爱。
官网地址:https://kafka.apache.org/

2.消息队列
Kafka软件最初的设计就是专门用于数据传输的消息系统,类似功能的软件有RabbitMQ、ActiveMQ、RocketMQ等。这些软件名称中的MQ是英文单词Message Queue的简称,也就是所谓的消息队列的意思。这些软件的核心功能是传输数据,而Java中如果想要实现数据传输功能,那么这个软件一般需要遵循Java消息服务技术规范JMS(Java Message Service)。前面提到的ActiveMQ软件就完全遵循了JMS技术规范,而RabbitMQ是遵循了类似JMS规范并兼容JMS规范的跨平台的AMQP(Advanced Message Queuing Protocol)规范。除了上面描述的JMS,AMQP外,还有一种用于物联网小型设备之间传输消息的MQTT通讯协议。
Kafka拥有作为一个消息系统应该具备的功能,但是却有着独特的设计。可以这样说,Kafka借鉴了JMS规范的思想,但是却并没有完全遵循JMS规范。这也恰恰是软件名称为Kafka,而不是KafkaMQ的原因。
由上可知,无论学习哪一种消息传输系统,JMS规范都是大家应该首先了解的。所以咱们这里就对JMS规范做一个简单的介绍:
- JMS是Java平台的消息中间件通用规范,定义了主要用于消息中间件的标准接口。如果不是很理解这个概念,可以简单地将JMS类比为Java和数据库之间的JDBC规范。Java应用程序根据JDBC规范种的接口访问关系型数据库,而每个关系型数据库厂商可以根据JDBC接口来实现具体的访问规则。JMS定义的就是系统和系统之间传输消息的接口。
- 为了实现系统和系统之间的数据传输,JMS规范中定义很多用于通信的组件:
- 
JMS Provider:JMS消息提供者。其实就是实现JMS接口和规范的消息中间件,也就是我们提供消息服务的软件系统,比如RabbitMQ、ActiveMQ、Kafka。
- 
JMS Message:JMS消息。这里的消息指的就是数据。一般采用Java数据模型进行封装,其中包含消息头,消息属性和消息主体内容。
- 
JMS Producer:JMS消息生产者。所谓的生产者,就是生产数据的客户端应用程序,这些应用通过JMS接口发送JMS消息。
- 
JMS Consumer:JMS消息消费者。所谓的消费者,就是从消息提供者(JMS Provider)中获取数据的客户端应用程序,这些应用通过JMS接口接收JMS消息。
- MS支持两种消息发送和接收模型:一种是P2P(Peer-to-Peer)点对点模型,另外一种是发布/订阅(Publish/Subscribe)模型。
- P2P模型:P2P模型是基于队列的,消息生产者将数据发送到消息队列中,消息消费者从消息队列中接收消息。因为队列的存在,消息的异步传输成为可能。P2P模型的规定就是每一个消息数据,只有一个消费者,当发送者发送消息以后,不管接收者有没有运行都不影响消息发布到队列中。接收者在成功接收消息后会向发送者发送接收成功的消息。
- 发布 / 订阅模型:所谓得发布订阅模型就是事先将传输的数据进行分类,我们管这个数据的分类称之为主题(Topic)。也就是说,生产者发送消息时,会根据主题进行发送。比如咱们的消息中有一个分类是NBA,那么生产者在生产消息时,就可以将NBA篮球消息数据发送到NBA主题中,这样,对NBA消息主题感兴趣的消费者就可以申请订阅NBA主题,然后从该主题中获取消息。这样,也就是说一个消息,是允许被多个消费者同时消费的。这里生产者发送消息,我们称之为发布消息,而消费者从主题中获取消息,我们就称之为订阅消息。Kafka采用就是这种模型。
3.生产者-消费者模型
生产者-消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个消息缓冲区,平衡了生产者和消费者的处理能力。在数据传输过程中,起到了一个削弱峰值的作用,也就是我们经常说到的削峰。

图形中的缓冲区就是用来给生产者和消费者解耦的。在单点环境中,我们一般会采用阻塞式队列实现这个缓冲区。而在分布式环境中,一般会采用第三方软件实现缓冲区,这个第三方软件我们一般称之为中间件。纵观大多数应用场景,解耦合最常用的方式就是增加中间件。
遵循JMS规范的消息传输软件(RabbitMQ、ActiveMQ、Kafka、RocketMQ),我们一般就称之为消息中间件。使用软件的目的本质上也就是为了降低消息生产者和消费者之间的耦合性。提升消息的传输效率
4.几种消息中间件对比
| 特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka | 
| 单机吞吐量 | 万级,比RocketMQ,Kafka低一个数量级 | 万级,比RocketMQ,Kafka低一个数量级 | 10万级,支持高吞吐 | 10万级,支持高吞吐 | 
| Topic数量对吞吐量的影响 | Topic可以达到几百/几千量级 | Topic可以达到几百量级,如果更多的话,吞吐量会大幅度下降 | ||
| 时效性 | ms级 | 微秒级别,延迟最低 | ms级 | ms级 | 
| 可用性 | 高,基于主从架构实现高可用 | 高,基于主从架构实现高可用 | 非常高,分布式架构 | 非常高,分布式架构 | 
| 消息可靠性 | 有较低的概率丢失数据 | 基本不丢 | 经过参数优化配置,可以做到0丢失 | 经过参数优化配置,可以做到0丢失 | 
| 功能支持 | MQ领域的功能极其完备 | 并发能力强,性能极好,延时很低 | MQ功能较为完善,分布式,扩展性好 | 功能较为简单,支持简单的MQ功能,在大数据领域被广泛使用 | 
| 其他 | 很早的软件,社区不是很活跃 | 开源,稳定,社区活跃度高 | 阿里开发,社区活跃度不高 | 开源,高吞吐量,社区活跃度极高 | 
通过上面各种消息中间件的对比,大概可以了解,在大数据场景中我们主要采用kafka作为消息中间件,而在JaveEE开发中我们主要采用ActiveMQ、RabbitMQ、RocketMQ作为消息中间件。如果将JavaEE和大数据在项目中进行融合的话,那么Kafka其实是一个不错的选择。
5.ZooKeeper
ZooKeeper是一个开放源码的分布式应用程序协调服务软件。在当前的Web软件开发中,多节点分布式的架构设计已经成为必然,那么如何保证架构中不同的节点所运行的环境,系统配置是相同的,就是一个非常重要的话题。一般情况下,我们会采用独立的第三方软件保存分布式系统中的全局环境信息以及系统配置信息,这样系统中的每一个节点在运行时就可以从第三方软件中获取一致的数据。也就是说通过这个第三方软件来协调分布式各个节点之间的环境以及配置信息。Kafka软件是一个分布式事件流处理平台系统,底层采用分布式的架构设计,就是说,也存在多个服务节点,多个节点之间Kafka就是采用ZooKeeper来实现协调调度的。
ZooKeeper的核心作用:
- ZooKeeper的数据存储结构可以简单地理解为一个Tree结构,而Tree结构上的每一个节点可以用于存储数据,所以一般情况下,我们可以将分布式系统的元数据(环境信息以及系统配置信息)保存在ZooKeeper节点中。
- ZooKeeper创建数据节点时,会根据业务场景创建临时节点或永久(持久)节点。永久节点就是无论客户端是否连接上ZooKeeper都一直存在的节点,而临时节点指的是客户端连接时创建,断开连接后删除的节点。同时,ZooKeeper也提供了Watch(监控)机制用于监控节点的变化,然后通知对应的客户端进行相应的变化。Kafka软件中就内置了ZooKeeper的客户端,用于进行ZooKeeper的连接和通信。
其实,Kafka作为一个独立的分布式消息传输系统,还需要第三方软件进行节点间的协调调度,不能实现自我管理,无形中就导致Kafka和其他软件之间形成了耦合性,制约了Kafka软件的发展,所以从Kafka 2.8.X版本开始,Kafka就尝试增加了Raft算法实现节点间的协调管理,来代替ZooKeeper。不过Kafka官方不推荐此方式应用在生产环境中,计划在Kafka 4.X版本中完全移除ZooKeeper,让我们拭目以待。
ZooKeeper与Kafka安装
6.消息主题
在消息发布/订阅(Publish/Subscribe)模型中,为了可以让消费者对感兴趣的消息进行消费,而不是对所有的数据进行消费,包括那些不感兴趣的消息,所以定义了主题(Topic)的概念,也就是说将不同的消息进行分类,分成不同的主题(Topic),然后消息生产者在生成消息时,就会向指定的主题(Topic)中发送。而消息消费者也可以订阅自己感兴趣的主题(Topic)并从中获取消息。
 有很多种方式都可以操作Kafka消息中的主题(Topic):命令行、第三方工具、Java API、自动创建。而对于初学者来讲,掌握基本的命令行操作是必要的。所以接下来,我们采用命令行进行操作。
6.1创建主题
- 启动ZooKeeper,Kafka服务进程。
kafka/bin/ kafka/config/zookeeper.properties &
kafka/bin/ kafka/config/server.properties &- 输入指令,创建主题。
Kafka 是通过 kafka-topics.sh 指令文件进行消息主题操作的。其中包含了对主题的查询,创建,删除等功能。
调用指令创建主题时,需要传递多个参数,而且参数的前缀为两个横线。因为参数比较多,为了演示方便,这里我们只说明必须传递的参数,其他参数后面会进行讲解。
- --bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。
- --create: 表示对主题的创建操作,是个操作参数,后面无需增加参数值。
- --topic: 主题的名称,后面接的参数值一般就是见名知意的字符串名称,类似于java 中的字符串类型标识符名称,当然也可以使用数字,只不过最后还是当成数字字符串使用。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test[2024-05-17 15:39:13,701] INFO Creating topic test with configuration {} and initial partition assignment Map(0 -> ArrayBuffer(0)) (kafka.zk.AdminZkClient)
[2024-05-17 15:39:13,820] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-17 15:39:13,868] INFO [LogLoader partition=test-0, dir=/home/hxy/data/kafka-logs] Loading producer state till offset 0 with message format version 2 (kafka.log.UnifiedLog$)
[2024-05-17 15:39:13,881] INFO Created log for partition test-0 in /home/hxy/data/kafka-logs/test-0 with properties {} (kafka.log.LogManager)
[2024-05-17 15:39:13,885] INFO [Partition test-0 broker=0] No checkpointed highwatermark is found for partition test-0 (kafka.cluster.Partition)
[2024-05-17 15:39:13,887] INFO [Partition test-0 broker=0] Log loaded for partition test-0 with initial high watermark 0 (kafka.cluster.Partition)
Created topic test.6.2 查看主题
Kafka 是通过 kafka-topics.sh 文件进行消息主题操作的。其中包含了对主题的查询,创建,删除等功能。
- 
--bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。
- 
--list: 表示对所有主题的查询操作,是个操作参数,后面无需增加参数值。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
test6.3 查看指定主题信息
Kafka 是通过 kafka-topics.sh 文件进行消息主题操作的。其中包含了对主题的查询,创建,删除等功能。
- 
--bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。
- 
--describe: 查看主题的详细信息。
- 
--topic: 查询的主题名称。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
test
[hxy@hcss-ecs-4c0e ~]$ kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic test
Topic: test     TopicId: 97ayJpedT1GAvvZQsoPzUQ PartitionCount: 1       ReplicationFactor: 1    Configs: 
        Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 06.4 修改主题
创建主题后,可能需要对某些参数进行修改,那么就需要使用指令进行操作。
Kafka 是通过 kafka-topics.sh 文件进行消息主题操作的。其中包含了对主题的查询,创建,删除等功能。
- 
--bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。
- 
--alter: 表示对所有主题的查询操作,是个操作参数,后面无需增加参数值。
- 
--topic: 查询的主题名称。
- 
--partitions: 修改的配置参数:分区数量。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic test --alter --partitions 2
[2024-05-17 15:48:01,628] INFO Creating 1 partitions for 'test' with the following replica assignment: Map(1 -> ReplicaAssignment(replicas=0, addingReplicas=, removingReplicas=)). (kafka.zk.AdminZkClient)
[2024-05-17 15:48:01,650] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-1) (kafka.server.ReplicaFetcherManager)
[2024-05-17 15:48:01,653] INFO [LogLoader partition=test-1, dir=/home/hxy/data/kafka-logs] Loading producer state till offset 0 with message format version 2 (kafka.log.UnifiedLog$)
[2024-05-17 15:48:01,653] INFO Created log for partition test-1 in /home/hxy/data/kafka-logs/test-1 with properties {} (kafka.log.LogManager)
[2024-05-17 15:48:01,654] INFO [Partition test-1 broker=0] No checkpointed highwatermark is found for partition test-1 (kafka.cluster.Partition)
[2024-05-17 15:48:01,654] INFO [Partition test-1 broker=0] Log loaded for partition test-1 with initial high watermark 0 (kafka.cluster.Partition)查看修改后的主题。
afka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic test
Topic: test     TopicId: 97ayJpedT1GAvvZQsoPzUQ PartitionCount: 2       ReplicationFactor: 1    Configs: 
        Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: test     Partition: 1    Leader: 0       Replicas: 0     Isr: 06.5 删除主题
如果主题创建后不需要了,或创建的主题有问题,那么我们可以通过相应的指令删除主题。
Kafka 是通过 kafka-topics.sh 文件进行消息主题操作的。其中包含了对主题的查询,创建,删除等功能。
- 
--bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。
- 
--delete: 表示对主题的删除操作,是个操作参数,后面无需增加参数值。默认情况下,删除操作是逻辑删除,也就是说数据存储的文件依然存在,但是通过指令查询不出来。如果想要直接删除,需要在server.properties 文件中设置参数delete.topic.enable=true。
- 
--topic: 删除的主题名称。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic test --delete
[2024-05-17 15:52:35,998] INFO [GroupCoordinator 0]: Removed 0 offsets associated with deleted partitions: test-1, test-0. (kafka.coordinator.group.GroupCoordinator)
[2024-05-17 15:52:36,047] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-1, test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-17 15:52:36,047] INFO [ReplicaAlterLogDirsManager on broker 0] Removed fetcher for partitions Set(test-1, test-0) (kafka.server.ReplicaAlterLogDirsManager)
[2024-05-17 15:52:36,054] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-1, test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-17 15:52:36,054] INFO [ReplicaAlterLogDirsManager on broker 0] Removed fetcher for partitions Set(test-1, test-0) (kafka.server.ReplicaAlterLogDirsManager)
[2024-05-17 15:52:36,064] INFO Log for partition test-0 is renamed to /home/hxy/data/kafka-logs/test-0.7d08fc40f8fc42618666a0520c96a2d7-delete and is scheduled for deletion (kafka.log.LogManager)
[2024-05-17 15:52:36,066] INFO Log for partition test-1 is renamed to /home/hxy/data/kafka-logs/test-1.8e14a3b783c0432db5fe92c7a2641d27-delete and is scheduled for deletion (kafka.log.LogManager)查看主题是否被删除。
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list7.生产数据
消息主题创建好了,就可以通过Kafka客户端向Kafka服务器的主题中发送消息了。Kafka生产者客户端并不是一个独立的软件系统,而是一套API接口,只要通过接口能连接Kafka并发送数据的组件我们都可以称之为Kafka生产者。下面我们就演示几种不同的方式:
7.1 命令行操作
Kafka 是通过文件进行消息生产者操作的。
调用指令时,需要传递多个参数,而且参数的前缀为两个横线,因为参数比较多。为了演示方便,这里我们只说明必须传递的参数,其他参数后面进行讲解。
- 
--bootstrap-server: 把当前的窗口当成Kafka 的客户端,那么进行操作前,就需要连接服务器,这里的参数就表示服务器的连接方式,因为我们在本机启动Kafka 服务进程,且Kafka 默认端口为9092,所以此处,后面接的参数值为localhost:9092,用空格隔开。早期版本的Kafka 也可以通过 --broker-list 参数进行连接,当前版本已经不推荐使用了。
- 
--topic: 主题的名称,后面接的参数值就是之前已经创建好的主题名称。
$ kafka/bin/ --bootstrap-server localhost:9092 --topic test
>hello kafka
[2024-05-17 16:02:36,129] INFO Creating topic test with configuration {} and initial partition assignment Map(0 -> ArrayBuffer(0)) (kafka.zk.AdminZkClient)
[2024-05-17 16:02:36,145] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 5 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2024-05-17 16:02:36,167] INFO [Controller id=0, targetBrokerId=0] Node 0 disconnected. (org.apache.kafka.clients.NetworkClient)
[2024-05-17 16:02:36,172] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-17 16:02:36,179] INFO [LogLoader partition=test-0, dir=/home/hxy/data/kafka-logs] Loading producer state till offset 0 with message format version 2 (kafka.log.UnifiedLog$)
[2024-05-17 16:02:36,180] INFO Created log for partition test-0 in /home/hxy/data/kafka-logs/test-0 with properties {} (kafka.log.LogManager)
[2024-05-17 16:02:36,180] INFO [Partition test-0 broker=0] Log loaded for partition test-0 with initial high watermark 0 (kafka.cluster.Partition)
>注意:这里的数据需要回车后,才能真正将数据发送到Kafka服务器。
7.2 go API
一般情况下,我们也可以通过程序来产生数据,这里我们就以 go 来进行演示。
- 首先要求必须有 go 的开发环境,此处不做详细说明,当然我们可以用 java 来代替,只不过需要我们查看 java相关文档。
- 在 code 目录下创建文件 producer.go,并用 vim 打开。
vim code/producer- 写入代码。
package main
import (
	"fmt"
	"/Shopify/sarama"
)
func main() {
	// 创建消费者配置
	config := sarama.NewConfig()
	// 创建消费者
	consumer, err := sarama.NewConsumer([]string{"localhost:9092"}, config)
	if err != nil {
		fmt.Println("创建消费者出错:", err)
		return
	}
	defer consumer.Close()
	// 订阅主题
	partitionConsumer, err := consumer.ConsumePartition("test", 0, sarama.OffsetNewest)
	if err != nil {
		fmt.Println("订阅分区出错:", err)
		return
	}
	defer partitionConsumer.Close()
	// 处理消息
	for message := range partitionConsumer.Messages() {
		fmt.Printf("收到消息: %s, 偏移量: %d\n", string(message.Value), message.Offset)
	}
}- 代码分析:
sarama.NewConfig():
- 这用于初始化一个 sarama的配置结构体。通过设置不同的属性来定制生产者的行为。
- 
config.Producer.RequiredAcks = sarama.WaitForAll表示生产者需要等待所有副本都确认收到消息才认为发送成功。
- 
config.Producer.Retry.Max = 5设定了发送失败时最多重试 5 次。
- 
config.Producer.Return.Successes = true使生产者在发送成功后返回相关信息。
sarama.NewSyncProducer([]string{"localhost:9092"}, config):
- 根据指定的 Kafka 节点地址(这里是本地的 localhost:9092)和配置创建一个同步生产者实例。同步意味着发送操作会阻塞直到收到响应。
&sarama.ProducerMessage{...}:
- 构建了一个具体要发送的消息结构体。
- 
Topic指定了消息要发送到的主题。
- 
Value是消息的实际内容,这里使用sarama.StringEncoder将字符串编码为合适的格式。
producer.SendMessage(message):
- 这是执行消息发送的关键操作。它将构建好的消息发送到指定的主题。
- 发送成功后,返回发送到的分区编号和该消息在分区中的偏移量。这可以用于后续的跟踪和确认。
在整个代码流程中:
- 首先进行必要的配置设置,包括生产者的行为参数。
- 然后创建生产者实例。
- 接着准备好要发送的消息。
- 最后执行发送操作,并根据结果进行相应的输出或错误处理。这种一步步的流程清晰地展示了如何使用 sarama库来实现与 Kafka 的交互,完成消息的生产和发送过程。
- 在生产数据之前我们先来看看 /root/data/kafka-logs/目录下有哪些文件。
# ll /root/data/kafka-logs/
total 12
-rw-r--r-- 1 root root  0 May 20 10:05 cleaner-offset-checkpoint
-rw-r--r-- 1 root root  4 May 20 10:06 log-start-offset-checkpoint
-rw-r--r-- 1 root root 88 May 20 10:05 meta.properties
-rw-r--r-- 1 root root  4 May 20 10:06 recovery-point-offset-checkpoint
-rw-r--r-- 1 root root  0 May 20 10:05 replication-offset-checkpoint- 编译代码,并运行。
go build producer.go # 编译
./producer # 运行
# 因为代码中我们每次只生产一条消息,所以我们这里运行十次 # 或者修改代码[root@hosuregao-11d93y4qea code]# ./producer 
[2024-05-20 10:06:33,152] INFO Creating topic test with configuration {} and initial partition assignment Map(0 -> ArrayBuffer(0)) (kafka.zk.AdminZkClient)
[2024-05-20 10:06:33,236] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-20 10:06:33,290] INFO [LogLoader partition=test-0, dir=/root/data/kafka-logs] Loading producer state till offset 0 with message format version 2 (kafka.log.UnifiedLog$)
[2024-05-20 10:06:33,306] INFO Created log for partition test-0 in /root/data/kafka-logs/test-0 with properties {} (kafka.log.LogManager)
[2024-05-20 10:06:33,310] INFO [Partition test-0 broker=0] No checkpointed highwatermark is found for partition test-0 (kafka.cluster.Partition)
[2024-05-20 10:06:33,312] INFO [Partition test-0 broker=0] Log loaded for partition test-0 with initial high watermark 0 (kafka.cluster.Partition)
消息发送成功,分区: 0, 偏移量: 0
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 1
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 2
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 3
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 4
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 5
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 6
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 7
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 8
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 9
[root@hosuregao-11d93y4qea code]# ./producer 
消息发送成功,分区: 0, 偏移量: 10
[root@hosuregao-11d93y4qea code]#- 这里我们可以看到,当第一次向kafka发送消息时,首先得创建主题,这里我们给主题的名字是test。而创建主题生产的提示语句与我们之前命令行创建主题的提示语句内容是大致相同的。
# 命令行创建主题test
kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test
[2024-05-17 15:39:13,701] INFO Creating topic test with configuration {} and initial partition assignment Map(0 -> ArrayBuffer(0)) (kafka.zk.AdminZkClient)
[2024-05-17 15:39:13,820] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions Set(test-0) (kafka.server.ReplicaFetcherManager)
[2024-05-17 15:39:13,868] INFO [LogLoader partition=test-0, dir=/home/hxy/data/kafka-logs] Loading producer state till offset 0 with message format version 2 (kafka.log.UnifiedLog$)
[2024-05-17 15:39:13,881] INFO Created log for partition test-0 in /home/hxy/data/kafka-logs/test-0 with properties {} (kafka.log.LogManager)
[2024-05-17 15:39:13,885] INFO [Partition test-0 broker=0] No checkpointed highwatermark is found for partition test-0 (kafka.cluster.Partition)
[2024-05-17 15:39:13,887] INFO [Partition test-0 broker=0] Log loaded for partition test-0 with initial high watermark 0 (kafka.cluster.Partition)
Created topic test.- 再来看看 /root/data/kafka-logs/目录下的文件是否有变化。
ll /root/data/kafka-logs/
total 20
-rw-r--r-- 1 root root    0 May 20 10:05 cleaner-offset-checkpoint
-rw-r--r-- 1 root root    4 May 20 10:10 log-start-offset-checkpoint
-rw-r--r-- 1 root root   88 May 20 10:05 meta.properties
-rw-r--r-- 1 root root   13 May 20 10:10 recovery-point-offset-checkpoint
-rw-r--r-- 1 root root   14 May 20 10:10 replication-offset-checkpoint
drwxr-xr-x 2 root root 4096 May 20 10:06 test-0
# test-0
ll /root/data/kafka-logs/test-0/
total 12
-rw-r--r-- 1 root root 10485760 May 20 10:06 00000000000000000000.index
-rw-r--r-- 1 root root     1012 May 20 10:06 00000000000000000000.log
-rw-r--r-- 1 root root 10485756 May 20 10:06 00000000000000000000.timeindex
-rw-r--r-- 1 root root        8 May 20 10:06 leader-epoch-checkpoint
-rw-r--r-- 1 root root       43 May 20 10:06 partition.metadata本章作为Kafka软件的入门章节,介绍了一些消息传输系统中的基本概念以及单机版Linux 系统中Kafka软件的基本操作。如果仅从操作上,感觉Kafka和数据库的功能还是有点像的。比如:
- 数据库可以创建表保存数据,kafka可以创建主题保存消息。
- Java客户端程序可以通过JDBC访问数据库:保存数据、修改数据、查询数据,kafka可以通过生产者客户端生产数据,通过消费者客户端消费数据。
从这几点来看,确实有相像的地方,但其实两者的本质并不一样:
- 数据库的本质是为了更好的组织和管理数据,所以关注点是如何设计更好的数据模型用于保存数据,保证核心的业务数据不丢失,这样才能准确地对数据进行操作。
- Kafka的本质是为了高效地传输数据。所以软件的侧重点是如何优化传输的过程,让数据更快,更安全地进行系统间的传输。
通过以上的介绍,你会发现,两者的区别还是很大的,不能混为一谈。接下来的章节我们会给大家详细讲解Kafka在分布式环境中是如何高效地传输数据的。
                
 
 
                     
            
        













 
                    

 
                 
                    