Kafka安装和使用

本文为个人学习笔记整理,仅供交流参考,非专业教学资料,内容请自行甄别。

文章目录


概述

Kafka是apache基金会下的产品,和Rabbit MQ,Rocket MQ类似,它也是一个作为MQ消息队列性质的存在。只是它的运用场景与后两者有所区分,主要是运用于数据分析领域的大体量的日志收集。其同样具有MQ的异步,削峰,解耦的三大特性,但是具体的实现和架构,和后两者有较大的区别。

简单来说,前者更加侧重于数据吞吐量,集群容错性,对于功能的完善和复杂度,消息的可靠性,则是有所牺牲,缺少死信队列,延迟队列等高级功能,并且可能存在数据的丢失,但是Kafka也在一直优化该问题,目前理论上已经可以理解成数据不会丢失了。

一、安装Kafka

同样是选择在linux服务器的环境进行安装和使用,首先需要准备一台虚拟机,并且安装好java的环境。

Kafka的安装包,可以在官网下载,官网下载安装包,但是速度很慢,可以使用阿里云镜像网站加速下载:国内Kafka镜像网站下载

下载完成后,上传到服务器的指定目录上,因为要配合ZK使用,所以推荐放在和ZK在同一个路径下:

解压完成后,先启动ZK,然后进入Kafka解压出的文件夹,执行:

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

然后使用JPS命令验证是否启动成功:

上图所示即是启动成功,QuorumPeerMain是ZK的进程,Kafka则是刚刚启动的。

二、Kafka基本使用

Kafka的基础工作机制是消息发送者可以将消息发送到kafka上指定的topic,而消息消费者,可以从指定的topic上消费消息,这里可以和Rabbit MQ对比一下:

  • Rabbit MQ是生产者先将消息发送到Channel通道中,然后再由通道发送给具体的交换机,交换机和队列绑定,消费者也是通过通道从对立中拉取消息。
  • Kafka则是省去了很多中间步骤,生产者直接将消息发送到topic上,然后消费者拉取。


2.1、创建Topic

所以首先需要创建一个topic:

bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9092

bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092 -- 查询topic

2.2、创建生产者

创建生产者:

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

发送消息,按CTRL + C退出

2.3、启动消费者

然后启动一个消费者,从队列中获取消息:

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

这里没有接收到消息,是因为生产者发送消息时,没有同步启动消费者,如果需要获取历史消息,则需要加上--from-beginning

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

还可以指定具体的偏移量:--partition 0 --offset 2,代表从0号partition 的第 2个消息开始读:

以上便是Kafka最基本的使用。

2.4、分组消费

Kafka中同样存在着消费者组的概念:

  • 如果某个消费者组下有两个消费者,有一条消息,那么这条消息,只会被其中一个消费者消费
  • 如果有两个消费者组,有一条消息,那么这条消息可以同时被两个消费者组消费

例:创建两个消费者组,第一个消费者组有两个消费者,第二个消费者组只有一个消费者:

#两个消费者实例属于同一个消费者组

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=testGrroup1 --topic test

生产者发送消息

消费者组1的消费者1没有收到

消费者组1的消费者2收到

消费者组2的消费者收到

查看消费者组的偏移量,这里透露了几个关键的信息:

  • PARTITION:为0,说明当前只有一个PARTITIONPARTITION代表的时分区编号,之前所说,生产者将信息发送到topic,topic只是业务上的名称,实际上消息还是保存在PARTITION上的
  • CURRENT-OFFSET:当前偏移量,代表用户当前消费到的位置
  • LOG-END-OFFSET:TOPIC中最新消息的偏移量
  • LAG:滞后量,为LOG-END-OFFSET - CURRENT-OFFSET,滞后量为 0 表示消费者消费进度与最新消息同步,没有消息积压

总结

Kafka的核心概念:

  1. 客户端:包含生产者和消费者
  2. TOPIC:消息中转的逻辑单元,生产者将消息发送到TOPIC,消费者从TOPIC拉取消息。
  3. PARTITION:是TOPIC中真正存储消息的单元,每一个PARTITION的结构是先进先出的队列
  4. 服务端:指的是Kafka服务器。
  5. 消费者组:一个消费者组可以包含多个消费者,但是一个消费者只能属于同一个消费者组。(如果同一个消费者既是A消费者组,也是B消费者组的成员,怎么确定该消费者组消费消息的偏移量?)。同一条消息,可以被多个消费者组消费,但是如果一个消费者组中有多个消费者,该条消息只能被其中一个消费者消费。
  6. Offset:偏移量(Offset)在 Kafka 中是「消费者组级别」的核心概念,Kafka 中不存在「未加入消费者组的消费者」------ 所有消费者必须归属某个消费者组,否则无法消费主题消息。即使在创建消费者时没有显式的指定消费者组, Kafka 会自动为其分配一个临时消费者组

关于TOPIC,PARTITION,消费者组的关联:

  1. Topic 可以包含多个 Partition(推荐生产环境设置多个,提升吞吐和可用性);
  2. 一个 Partition 可以被多个消费者组消费(每个组独立维护消费进度,实现广播消费);

假设:

  • Topic T 有 1 个 Partition(P1);
  • 有 3 个消费者组(G1、G2、G3),都订阅了 Topic T;
  • 每个组内有 1 个消费者(C1、C2、C3)。
      消费逻辑:
  • 消息 M 写入 P1 后,G1 的 C1 会消费 M(G1 的偏移量更新为 M 的下一个位置);
  • 同时,G2 的 C2 会消费 M(G2 的偏移量独立更新);
  • G3 的 C3 也会消费 M(G3 的偏移量独立更新);
  • 三个组的消费进度完全隔离:哪怕 G1 已经消费到偏移量 10,G2 仍可从偏移量 0 重新消费 P1 的所有消息。

组内的多个消费者是负载均衡 ,一个Partition被多个消费者组消费,是广播机制


相关推荐
從南走到北2 小时前
JAVA国际版打车APP打车顺风车滴滴车跑腿APP源码Android+IOS+H5
android·java·ios
Java天梯之路2 小时前
如何接收前端参数
java·后端
独自破碎E2 小时前
从括号匹配到字符串解码:递归思想的巧妙应用
android·java·开发语言
忧郁的橙子.2 小时前
二、Rabbit MQ 高级
java·开发语言
Chan163 小时前
【 Java八股文面试 | JVM篇 内存结构、类加载、垃圾回收与性能调优 】
java·jvm·spring boot·后端·spring·idea
百锦再3 小时前
第15章 并发编程
android·java·开发语言·python·rust·django·go
qq_281317473 小时前
Kafka
分布式·kafka
Chan164 小时前
【 Java八股文面试 | Redis篇 缓存问题、持久化、分布式锁 】
java·数据库·redis·后端·spring·缓存·面试
q***47184 小时前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端