栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

kafka学习笔记一

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

kafka学习笔记一

一、同步通信与异步通信 1、同步通信


同步通信存在性能问题:

  • 造成系统得开销、响应时间比较大。
  • 在同步得过程中要保证每个服务都顺利完成,整个链路才会执行完。因为网络等其他问题,整个链路执行完得成功率回受到影响,导致用户体验较差。
2、异步通信


异步通信得优势:

  • 明显提高系统得吞吐量。
  • 即使服务失败,也能通过分布式事务来保障最终是成功得。

针对于同步通信来说,异步通信得方式,可以让上游快速成功,极大得提高了吞吐量。而且在分布式系统中,通过下游多个服务得分布式事务得保障,也能保障事务执行得最终一致性。

二、kafka得基本知识

Kafka是最初由linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

主要应用场景是:日志收集系统和消息系统。

Kafka主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
  • 同时支持离线数据处理和实时数据处理。
  • Scale out:支持在线水平扩展
1、kafka安装配置

(1) 安装 zookeeper 及配置

dataDir=D:\Program Files\zookeeper-3.6.3\tmp
clientPort=2181
admin.serverPort=8090    

(2)配置环境变量

ZOOKEEPER_HOME = D:Program Fileszookeeper-3.6.3
PATH=%ZOOKEEPER_HOME%bin

(3)启动 zookeeper, 打开命令提示符,输入

zkserver


(4)启动kafka 进入kafka安装目录,打开命令提示符输入

.binwindowskafka-server-start.bat .configserver.properties

2、kafka基本概念

名称解释
Broker消息中间件处理节点,一个kafka节点就是一个Broker,一个或多个Broker可组成一个kafka集群
Topickafka根据topic对消息进行归类,发布到kafka集群得每条消息都需要指定一个topic
Producer消息生产者,向Broker发送消息得客户端。
Consumer消息消费者,从Broker读取消息得客户端。
3、创建topic

创建topic

binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic "test"

查看topic

binwindowskafka-topics.bat --list --bootstrap-server localhost:9092
4、发送消息

把消息发送给broker中某个topic,打开kafka发送消息得客户端,然后开始向客户端发送消息。

binwindowskafka-console-producer.bat --broker-list localhost:9092 --topic test
5、消费消息

消费broker中某个topic中得消息,打开kafka消费消息得客户端,然后在客户端中消费消息。

  • 方式一:从当前主题中得最后一条消息得偏移量(offset)+1开始消费
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test
  • 方式二:从当前主题第一条消息开始消费
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
6、关于消息得细节
  • 生产者将消息发送给broker,broker会将消息保存在本地日志文件中
D:kafkakafka_2.12-2.8.0logstest-000000000000000000000.log
  • 消息得保存是有序得,通过offset偏移量来描述消息得有序性。
  • 消费者消费消息时也是通过offset偏移量来描述当前消费得那条消息得位置。
7、删除topic
binwindowskafka-topics.bat --zookeeper localhost:2181 --delete --topic test
三、单播消息与多播消息 1、单播消息

在一个kafka得topic中,启动两个消费者,一个生产者,生产者发送消息是否同时被两个消费者消费?

如果多个消费者在同一个消费组,只有一个消费者可以收到订阅得topic中得消息。换言之,同一个消费组中只能有一个消费者收到topic中得消息。

binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic test
2、多播消息

不同得消费者组订阅同一个topic,那么不同得消费者组中只有一个消费者收到消息。实际上也是多个消费者组中得多个消费者收到消息。

binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup1 --topic test
binwindowskafka-console-consumer.bat --bootstrap-server localhost:9092 --consumer-property group.id=testGroup2 --topic test
3、查看消费组详细信息
# 查看当前主题下有哪些消费者组
binwindowskafka-consumer-groups --list --bootstrap-server localhost:9092
# 查看消费者组中具体信息:比如偏移量、最后一条消息得偏移量、堆积得消息数量
binwindowskafka-consumer-groups --bootstrap-server localhost:9092 --describe --group testGroup


重点关注得信息:

  • current-offset:最后被消费得信息得偏移量。
  • Log-end-offset:消费总量(最后一条消息得偏移量)
  • Lag:积压了多少条消息
四、Kafka中主题和分区得概念 1、主题topic

主题-topic在kafka中是一个逻辑概念,kafka通过topic将消息进行分类。不同得topic会被订阅该topic得消费者消费。

如果说topic中得消息非常非常多,多到需要几T来进行存储,因为消息是会被保存到 log 日志文件中得。为了解决这个问题,kafka提出了Partition(分区)得概念。

2、分区Partiton

通过partition将一个topic中得消息分区存储。这样得好处有:

  • 分区存储可以解决文件过大得问题
  • 提高了读写得吞吐量:读和写可以同时在多个分区上进行

创建多分区主题

binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "test"
3、kafka中消息日志文件保存得内容
  • 00000.log: 这个文件中保存得就是消息

  • _consumer_offsets_49:

    kafka内部自己创建了_consumer_offsets主题包含了50个分区。这个主题用来存放消费者消费某个主题得偏移量。因为每个消费者都会自己维护消费主题得偏移量,也就是说每个消费者会把消费主题得偏移量自主上报给kafka中默认的主题:consumer_offsets。因此kafka为了提升这个主题得并发性,默认设置了50个分区。

    • 至于提交到哪个分区,通过hash函数:hash(consumerGroupId)%_consumer_offsets主题得分区数。
    • 提交到该主题的内容是:key是consumerGroupId+topic+分区号,value就是当前offset得值。
  • 文件中保存得消息,默认保存7天,7天后消息会被删除。

五、Kafka集群操作 1、搭建kafka集群(三个broker)
  • 创建三个server.properties文件
# 0 1 2
broker.id=0
#9092 9093 9094 
listeners=PLAINTEXT://192.168.111.1:9092
#logs logs1 logs2
log.dirs=D:kafkakafka_2.12-2.8.0logs
  • 通过命令来启动三台broker
binwindowskafka-server-start.bat .configserver.properties
binwindowskafka-server-start.bat .configserver1.properties
binwindowskafka-server-start.bat .configserver2.properties
  • 校验是否启动成功

进入到zk中查看/brokers/ids中是否有三个znode(0,1,2)

2、副本的概念

在创建主题时,除了指明主题得分区数以外,还指明了副本数。

副本是为了主题中区分创建多个备份,多个副本在kafka集群的多个broker中,会有一个服务作为leader,其他是follower。

# 创建多副本 多分区的 topic
binwindowskafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 3 --partitions 2 --topic my-relicated-topic

# 查看副本以及分区信息
binwindowskafka-topics.bat --describe --zookeeper localhost:2181 --topic my-replicated-topic

  • learder

kafka的写和读的操作,都发生在leader上。learder负责把数据同步给follower。当leader挂了,经过主从选举,从多个follower中选举产生新的leader。

  • follower

接收leader的同步的数据。

  • isr

可以同步和已同步的节点会被存入到isr集合中。这里有一个细节:如果isr中的节点性能较差,会被踢出isr集合。

broker、主题、分区、副本概念梳理:

集群中有多个broker,创建主题时可以指明主题有多个分区(把消息拆分到不同的分区中存储),可以为分区创建多个副本,不同的副本存放在不同的broker里。

3、关于kafka集群消费
  • 向集群发送消息
# 创建集群生产者
binwindowskafka-console-producer.bat --broker-list 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --topic my-relicated-topic
  • 从集群中消费消息
# 创建集群消费者
binwindowskafka-console-consumer.bat --bootstrap-server 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --topic my-relicated-topic --from-beginning
  • 指定消费者组消费
# 创建消费者组
binwindowskafka-console-consumer.bat --bootstrap-server 192.168.111.1:9092,192.168.111.1:9093,192.168.111.1:9094 --consumer-property group.id=testGroup1 --topic my-relicated-topic --from-beginning
  • 分区中消费者组的消费细节

  • 一个partition只能被消费者组中的一个消费者消费,目的是保证消费的顺序性,但是多个partition的多个消费者消费的总的顺序性是得不到保证的
  • partition的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要多于partition的数量,否则多出来的消费者不会进行消费。
  • 如果消费则挂了,那么会触发rebanlance机制,会让其他消费者来消费该分区。

icated-topic --from-beginning

- 分区中消费者组的消费细节

[外链图片转存中...(img-JCXFUjvJ-1634782051832)]

- 一个partition只能被消费者组中的一个消费者消费,目的是保证消费的顺序性,但是多个partition的多个消费者消费的总的顺序性是得不到保证的
- partition的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要多于partition的数量,否则多出来的消费者不会进行消费。
- 如果消费则挂了,那么会触发rebanlance机制,会让其他消费者来消费该分区。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号