一篇文章让你快速上手Kafka

692 阅读7分钟

大家好!我是dongci777.今天我将通过一篇文章让你快速了解kafka并实现消息的发送和消费

一、Kafka概述

1、定义

分布式的基于发布订阅模式的消息队列(Message Queue),主要用于大数据实时处理 ,其中有经典结合:spark+kafka,kafka在大数据开发应用的时候是大部分公司首选的消息中间件

2、消息队列

消息队列应用场景之异步处理

最经典的场景比如注册短信的发送。

同步处理:

  • 第一步:用户填写注册信息
  • 第二步:注册信息写入数据库
  • 第三步:调用发送短信接口
  • 第四步:发送短信给用户手机
  • 第五步:页面响应注册成功

异步处理:

  • 第一步:用户填写注册信息
  • 第二步:注册信息写入数据库,立即响应给到用户提示注册成功,并且把发送短信的请求写入消息队列

很明显,异步处理给用户的体验更加好,不需要等待

其实加入消息队列,可以起到解耦、缓冲(削峰)的作用

1)解耦:不需要两个服务同时在线

2)可恢复性:一部分组件失效时,不会影响整个系统

3)缓冲:解决生产消息和消费消息的处理速度不一致的情况

4)灵活性:由于消息队列是分布式的,因此可以随时的上下线

二、消息队列的两种模式

1、点对点模式

一对一,消费者主动拉取数据,消息收到后消息清除

消息生产消息到Queue中,消息消费者从Queue中获取并且消费消息,消息被消费以后,从Queue中清除,因此消费者不可能消费一个已经被消费的消息,Queue支持多个消费者,但是对于一个消息而言,只有一个消费者可以消费

2、发布/订阅模式

一对多,消费者消费消息之后不会清除消息

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。与点对点模式不一样,发布到topic的消息会被所有的订阅者消费。Kafka就是基于该模式,基于拉取的方式,也就是通过消费者自己拉取消息进行消费

主动推送缺点:有的消费者消费能力不够,有的消费者又浪费资源。

主动拉取缺点:消费者会一直轮询队列中有没有消息可以消费,这样会导致一直处于轮询状态

三、Kafka基础架构

1、topic

Topic 被称为主题,在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。简单的说就是分类,比如男人、女人、小孩、老人这种信息分类

2、partitin

partition 译为分区,topic 中的消息被分割为一个或多个的 partition,它是一个物理概念,对应到系统上的就是一个或若干个目录,一个分区就是一个提交日志。消息以追加的形式写入分区,先后以顺序的方式读取。

由于一个主题包含无数个分区,因此无法保证在整个 topic 中有序,但是单个 Partition 分区可以保证有序。消息被迫加写入每个分区的尾部。Kafka 通过分区来实现数据冗余和伸缩性

分区可以分布在不同的服务器上,也就是说,一个主题可以跨越多个服务器,以此来提供比单个服务器更强大的性能。

3、segment

segment 被译为段,将 Partition 进一步细分为若干个 segment,每个 segment 文件的大小相等。

4、broker

Kafka 集群包含一个或多个服务器,每个 Kafka 中服务器被称为 broker,broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。

broker 是集群的组成部分,每个集群中都会有一个 broker 同时充当了 集群控制器(Leader)的角色,它是由集群中的活跃成员选举出来的。每个集群中的成员都有可能充当 Leader,Leader 负责管理工作,包括将分区分配给 broker 和监控 broker。集群中,一个分区从属于一个 Leader,但是一个分区可以分配给多个 broker(非Leader),这时候会发生分区复制。这种复制的机制为分区提供了消息冗余,如果一个 broker 失效,那么其他活跃用户会重新选举一个 Leader 接管。

5、producer

生产者,即消息的发布者,其会将某 topic 的消息发布到相应的 partition 中。生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。不过,在某些情况下,生产者会把消息直接写到指定的分区。

6、consumer

消费者,即消息的使用者,一个消费者可以消费多个 topic 的消息,但是主题的一个分区只能被一个消费者消费

注意:0.9版本之前offset存储在zk,0.9版本之后存储在本地

四、kafka安装部署

启动kafka之前先启动zookeper,因为kafka依赖于zookeper,所以先需要先把zookeeper安装启动起来

1、安装Zookeeper

1.1、下载安装

从官网下载zookeeper安装包,下载地址:zookeeper.apache.org/releases.ht…

下载对应的版本即可,我这里使用的是3.5.8版本的

下载完成后,将压缩包丢到自己Linux服务器的任意目录下,比如/tmp目录,然后执行以下命令:

tar -zxf zookeeper-3.5.8.tar.gz // 解压成文件
mv zookeeper-3.5.8 /opt/Bigdata/zookeeper // 移动到指定目录下(可自定义)

然后进入到zookeeper目录下的conf目录,将zoo_sample.cfg文件复制一份命名为zoo.cfg

cp zoo_example.cfg zoo.cfg

修改zoo.cfg文件:

tickTime=2000  // 单位是毫秒
initLimit=10 // 从节点和主节点之间建立初始化连接的时间上限 10*2000ms
syncLimit=5 // 允许从节点和主节点处于不同步状态的时间上限 5*2000ms
dataDir=/data/zookeeper/data 
dataLogDir=/data/zookeeper/logs
clientPort=2181

以上zookeeper就配置完了。

1.2、启动zookeeper

进入zookeeper主目录,执行以下命令:

./bin/zkServer.sh start

启动成功如下

使用以下命令连接zookeeper端口:

telnet localhost 2181

然后发送srvr来验证zookeeper是否安装正确

综上,zookeeper的安装配置以及启动就完成了。

2、安装Kafka Broker

1.1、下载安装

从官网下载kafak安装包,下载地址:kafka.apache.org/downloads

下载对应的版本即可,我这里使用的是2.6.0版本的,对应的scala版本是2.12

下载完成后,将压缩包丢到自己Linux服务器的任意目录下,比如/tmp目录,然后执行以下命令:

tar -zxf kafka_2.12-2.6.0.tgz
mv kafka_2.12-2.6.0 /opt/Bigdata/

这样就安装好了kafka,接下来配置config目录下的server.properties

log.dirs=/data/kafka/logs

1.2、启动kafka

到主目录下的bin目录下执行以下命令:

./kafka-server-start.sh -daemon /opt/Bigdata/kafka_2.12-2.6.0/config/server.properties 

执行完上面语句之后开始新建一个测试主题

 ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

显示结果如下:

表示test 这个topic已经创建成功!

使用以下命令列出所有topic

./kafka-topics.sh --list --zookeeper localhost:2181

有了topic之后,我们可以使用以下命令往主题上发布信息

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

生产者发送完之后,我们可以使用消费者来消费消息

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

注意:--zookeeper是一个过时的方法,需要使用--bootstrap-server

这样就完成了简单的消息的发送和消费了

下期我将对Kafka的一些配置进行详细的说明