- 1章 Kafka入门
学习目标
- 了解消息队列的应用场景
- 能够搭建Kafka集群
- 能够完成生产者、消费者Java代码编写
- 理解Kafka的架构,以及Kafka的重要概念
- 了解Kafka的事务
- 简介
- 消息队列简介
- 什么是消息队列
- 消息队列简介
- 简介
消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列。来看一下下面的代码:
// 1. 创建一个保存字符串的队列
Queue<String> stringQueue = new LinkedList<String>();
// 2. 往消息队列中放入消息
stringQueue.offer("hello");
// 3. 从消息队列中取出消息并打印
System.out.println(stringQueue.poll()); |
上述代码,创建了一个队列,先往队列中添加了一个消息,然后又从队列中取出了一个消息。这说明了队列是可以用来存取消息的。
我们可以简单理解消息队列就是将需要传输的数据存放在队列中。
-
-
-
- 消息队列中间件
-
-
消息队列中间件就是用来存储消息的软件(组件)。举个例子来理解,为了分析网站的用户行为,我们需要记录用户的访问日志。这些一条条的日志,可以看成是一条条的消息,我们可以将它们保存到消息队列中。将来有一些应用程序需要处理这些日志,就可以随时将这些消息取出来处理。
目前市面上的消息队列有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ等。
-
-
-
-
- 为什么叫Kafka呢
-
-
-
Kafka的架构师jay kreps非常喜欢franz kafka(弗兰兹·卡夫卡),并且觉得kafka这个名字很酷,因此取了个和消息传递系统完全不相干的名称kafka,该名字并没有特别的含义。
「也就是说,你特别喜欢尼古拉斯赵四,将来你做一个项目,也可以把项目的名字取名为:尼古拉斯赵四,然后这个项目就火了」
-
-
-
- 消息队列的应用场景
- 异步处理
- 消息队列的应用场景
-
-
电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。
-
-
-
-
系统解耦
-
-
-
-
-
-
-
- 流量削峰
-
-
-
-
-
-
-
- 日志处理(大数据领域常见)
-
-
-
大型电商网站(淘宝、京东、国美、苏宁...)、App(抖音、美团、滴滴等)等需要分析用户行为,要根据用户的访问行为来发现用户的喜好以及活跃情况,需要在页面上收集大量的用户访问信息。
-
-
-
- 生产者、消费者模型
-
-
我们之前学习过Java的服务器开发,Java服务器端开发的交互模型是这样的:
我们之前也学习过使用Java JDBC来访问操作MySQL数据库,它的交互模型是这样的:
它也是一种请求响应模型,只不过它不再是基于http协议,而是基于MySQL数据库的通信协议。
而如果我们基于消息队列来编程,此时的交互模式成为:生产者、消费者模型。
-
-
-
- 消息队列的两种模式
- 点对点模式
- 消息队列的两种模式
-
-
消息发送者生产消息发送到消息队列中,然后消息接收者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息接收者不可能消费到已经被消费的消息。
点对点模式特点:
- 每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
- 接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;
-
-
-
- 发布订阅模式
- 发布订阅模式
-
-
-
发布/订阅模式特点:
- 每个消息可以有多个订阅者;
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
- 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行;
-
-
- Kafka简介
- 什么是Kafka
- Kafka简介
-
Kafka是由Apache软件基金会开发的一个开源流平台,由Scala和Java编写。Kafka的Apache官网是这样介绍Kakfa的。
Apache Kafka是一个分布式流平台。一个分布式的流平台应该包含3点关键的能力:
|
英文原版
messaging system.
|
更多参考:Apache Kafka
我们重点关键三个部分的关键词:
- Publish and subscribe:发布与订阅
- Store:存储
- Process:处理
后续我们的课程主要围绕这三点来讲解。
-
-
-
- Kafka的应用场景
-
-
我们通常将Apache Kafka用在两类程序:
- 建立实时数据管道,以可靠地在系统或应用程序之间获取数据
- 构建实时流应用程序,以转换或响应数据流
上图,我们可以看到:
- Producers:可以有很多的应用程序,将消息数据放入到Kafka集群中。
- Consumers:可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。
- Connectors:Kafka的连接器可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到
数据库中。
- Stream Processors:流处理器可以Kafka中拉取数据,也可以将数据写入到Kafka中。
-
-
- Kafka诞生背景
-
-
kafka的诞生,是为了解决linkedin的数据管道问题,起初linkedin采用了ActiveMQ来进行数据交换,大约是在2010年前后,那时的ActiveMQ还远远无法满足linkedin对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,linkedin决定研发自己的消息传递系统,当时linkedin的首席架构师jay kreps便开始组织团队进行消息传递系统的研发。
提示:
|
-
-
- Kafka的优势
-
前面我们了解到,消息队列中间件有很多,为什么我们要选择Kafka?
特性 |
ActiveMQ |
RabbitMQ |
Kafka |
RocketMQ |
所属社区/公司 |
Apache |
Mozilla Public License |
Apache |
Apache/Ali |
成熟度 |
成熟 |
成熟 |
成熟 |
比较成熟 |
生产者-消费者模式 |
支持 |
支持 |
支持 |
支持 |
发布-订阅 |
支持 |
支持 |
支持 |
支持 |
REQUEST-REPLY |
支持 |
支持 |
- |
支持 |
API完备性 |
高 |
高 |
高 |
低(静态配置) |
多语言支持 |
支持JAVA优先 |
语言无关 |
支持,JAVA优先 |
支持 |
单机呑吐量 |
万级(最差) |
万级 |
十万级 |
十万级(最高) |
消息延迟 |
- |
微秒级 |
毫秒级 |
- |
可用性 |
高(主从) |
高(主从) |
非常高(分布式) |
高 |
消息丢失 |
- |
低 |
理论上不会丢失 |
- |
消息重复 |
- |
可控制 |
理论上会有重复 |
- |
事务 |
支持 |
不支持 |
支持 |
支持 |
文档的完备性 |
高 |
高 |
高 |
中 |
提供快速入门 |
有 |
有 |
有 |
无 |
首次部署难度 |
- |
低 |
中 |
高 |
在大数据技术领域,一些重要的组件、框架都支持Apache Kafka,不论成成熟度、社区、性能、可靠性,Kafka都是非常有竞争力的一款产品。
-
-
- 哪些公司在使用Kafka
-
-
-
- Kafka生态圈介绍
-
Apache Kafka这么多年的发展,目前也有一个较庞大的生态圈。
Kafka生态圈官网地址:https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem
-
-
- Kafka版本
-
本次课程使用的Kafka版本为2.4.1,是2020年3月12日发布的版本。
可以注意到Kafka的版本号为:kafka_2.12-2.4.1,因为kafka主要是使用scala语言开发的,2.12为scala的版本号。Apache Kafka可以查看到每个版本的发布时间。
-
- 环境搭建
- 搭建Kafka集群
- 环境搭建
- 将Kafka的安装包上传到虚拟机,并解压
cd /export/software/ tar -xvzf kafka_2.12-2.4.1.tgz -C ../server/ cd /export/server/kafka_2.12-2.4.1/ |
- 修改 server.properties
cd /export/server/kafka_2.12-2.4.1/config vim server.properties # 指定broker的id broker.id=0 # 指定Kafka数据的位置 log.dirs=/export/server/kafka_2.12-2.4.1/data # 配置zk的三个节点 zookeeper.connect=node1.itcast.cn:2181,node2.itcast.cn:2181,node3.itcast.cn:2181 |
- 将安装好的kafka复制到另外两台服务器
cd /export/server scp -r kafka_2.12-2.4.1/ node2.itcast.cn:$PWD scp -r kafka_2.12-2.4.1/ node3.itcast.cn:$PWD 修改另外两个节点的broker.id分别为1和2 ---------node2.itcast.cn-------------- cd /export/server/kafka_2.12-2.4.1/config vim erver.properties broker.id=1 --------node3.itcast.cn-------------- cd /export/server/kafka_2.12-2.4.1/config vim server.properties broker.id=2 |
- 配置KAFKA_HOME环境变量
vim /etc/profile export KAFKA_HOME=/export/server/kafka_2.12-2.4.1 export PATH=:$PATH:${KAFKA_HOME} 分发到各个节点 scp /etc/profile node2.itcast.cn:$PWD scp /etc/profile node3.itcast.cn:$PWD 每个节点加载环境变量 source /etc/profile |
- 启动服务器
# 启动ZooKeeper nohup bin/zookeeper-server-start.sh config/zookeeper.properties & # 启动Kafka cd /export/server/kafka_2.12-2.4.1 nohup bin/kafka-server-start.sh config/server.properties & # 测试Kafka集群是否启动成功 bin/kafka-topics.sh --bootstrap-server node1.itcast.cn:9092 --list |
-
-
- 目录结构分析
-
目录名称 |
说明 |
bin |
Kafka的所有执行脚本都在这里。例如:启动Kafka服务器、创建Topic、生产者、消费者程序等等 |
config |
Kafka的所有配置文件 |
libs |
运行Kafka所需要的所有JAR包 |
logs |
Kafka的所有日志文件,如果Kafka出现一些问题,需要到该目录中去查看异常信息 |
site-docs |
Kafka的网站帮助文件 |
-
-
- Kafka一键启动/关闭脚本
-
为了方便将来进行一键启动、关闭Kafka,我们可以编写一个shell脚本来操作。将来只要执行一次该脚本就可以快速启动/关闭Kafka。
- 在节点1中创建 /export/onekey 目录
cd /export/onekey
- 准备slave配置文件,用于保存要启动哪几个节点上的kafka
node1.itcast.cn node2.itcast.cn node3.itcast.cn |
- 编写start-kafka.sh脚本
vim start-kafka.sh cat /export/onekey/slave | while read line do { echo $line ssh $line "source /etc/profile;export JMX_PORT=9988;nohup ${KAFKA_HOME}/bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties >/dev/nul* 2>&1 & " }& wait done |
- 编写stop-kafka.sh脚本
vim stop-kafka.sh cat /export/onekey/slave | while read line do { echo $line ssh $line "source /etc/profile;jps |grep Kafka |cut -d' ' -f1 |xargs kill -s 9" }& wait done |
- 给start-kafka.sh、stop-kafka.sh配置执行权限
chmod u+x start-kafka.sh chmod u+x stop-kafka.sh |
- 执行一键启动、一键关闭
./start-kafka.sh ./stop-kafka.sh |
-
- 基础操作
-
-
- 创建topic
-
创建一个topic(主题)。Kafka中所有的消息都是保存在主题中,要生产消息到Kafka,首先必须要有一个确定的主题。
|
-
-
- 生产消息到Kafka
-
使用Kafka内置的测试程序,生产一些消息到Kafka的test主题中。
bin/kafka-console-producer.sh --broker-list node1.itcast.cn:9092 --topic test |
-
-
- 从Kafka消费消息
-
使用下面的命令来消费 test 主题中的消息。
bin/kafka-console-consumer.sh --bootstrap-server node1.itcast.cn:9092 --topic test --from-beginning |
-
-
- 使用Kafka Tools操作Kafka
- 连接Kafka集群
- 使用Kafka Tools操作Kafka
-
安装Kafka Tools后启动Kafka |
|
|
|
-
-
-
- 创建topic
-
-
-
- Kafka基准测试
- 基准测试
- Kafka基准测试
基准测试(benchmark testing)是一种测量和评估软件性能指标的活动。我们可以通过基准测试,了解到软件、硬件的性能水平。主要测试负载的执行时间、传输速度、吞吐量、资源占用率等。
-
-
-
- 基于1个分区1个副本的基准测试
-
-
测试步骤: