Kafka分布式发布订阅消息系统

✎ 学习目标
1.了解Kafka Streams API的使用
2.掌握基本的消息传递模式
3.理解Kafka工作原理
4.掌握Kafka集群部署和基本操作

Kafka是一个高吞吐量的分布式发布订阅消息系统,它在实时计算系统中有着非常强大的功能。通常情况下,我们使用Kafka构建系统或应用程序之间的数据管道,用来转换或响应实时数据,使数据能够及时的进行业务计算,得出相应结果。

Kafka概述

消息传递模式简介
一个消息系统负责将数据从一个应用程序传递到另外一个应用程序中,应用程序只关注数据,无需关注数据在多个应用之间是如何传递的,分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。
消息系统有两种主要消息传递模式,分别是点对点消息传递模式和发布订阅消息传递模式。

  1. 点对点消息传递模式
    点对点消息传递模式结构中,消息是通过一个虚拟通道进行传输的,生产者发送一条数据,消息将持久化到一个队列中,此时将有一个或多个消费者会消费队列中数据,但是一条消息只能被消费一次,且消费后的消息会从消息队列中删除,因此,即使有多个消费者同时消费数据,数据都可以被有序处理。
  2. 发布订阅消息传递模式
    在发布订阅模式中,发布者用于发布消息,订阅者用于订阅消息, 发布订阅模式可以有多种不同的订阅者,发布者发布的消息会被持久化到一个主题中,这与点对点模式不同的是,订阅者可订阅一个或多个主题,订阅者可读取该主题中所有数据,同一条数据可被多个订阅者消费,数据被消费后也不会立即删除。

Kafka 简介

Kafka是由Apache软件基金会开发的一个开源流处理平台,它由Scala和Java语言编写,是一个基于Zookeeper系统的分布式发布订阅消息系统,该项目的设计初衷是为实时数据提供一个统一、高通量、低等待的消息传递平台。

android 发布订阅者模式 发布订阅系统_kafka

Kafka工作原理

Kafka核心组件介绍

android 发布订阅者模式 发布订阅系统_kafka_02


android 发布订阅者模式 发布订阅系统_android 发布订阅者模式_03


Kafka工作流程分析

  1. 生产者生产消息过程
    生产者向Kafka集群中生产消息。Producer是消息的生产者,通常情况下,数据消息源可是服务器日志、业务数据及Web服务数据等,生产者采用推送的方式将数据消息发布到Kafka的主题中,主题本质就是一个目录,而主题是由Partition Logs(分区日志)组成,每条消息都被追加到分区中。
  2. android 发布订阅者模式 发布订阅系统_hadoop_04

  3. 生产者生产消息过程:
    1.Producer先读取Zookeeper的“/brokers/…/state”节点中找到该Partition的Leader。
    2.Producer将消息发送给Leader。
    3.Leader负责将消息写入本地分区Log文件中。
    4.Follower从Leader中读取消息,完成备份操作。
    5.Follower写入本地Log文件后,会向Leader发送Ack,每次发送消息都会有一个确认反馈机制,以确保消息正常送达。
    6.Leader收到所有Follower发送的Ack后,向Producer发送Ack,生产消息完成。
  4. 消费者消费消息过程
    Kafka采用拉取模型,由消费者记录消费状态,根据主题、Zookeeper集群地址和要消费消息的偏移量,每个消费者互相独立地按顺序读取每个分区的消息,消费者消费消息的流程图如下所示。
  5. android 发布订阅者模式 发布订阅系统_java_05

Kafka 集群部署与测试

安装Kafka

1.下载Kafka安装包,并解压至hadoop01节点中的/export/software目录下。

2.修改配置文件。在server.properties配置文件中指定broker编号、Kafka运行日志存放的路径、指定Zookeeper地址和本地IP。

3.添加环境变量。在/etc/profile文件中添加Kafka环境变量。

4.分发文件。将Kafka安装目录kafka_2.11-2.0.0及环境配置文件profile分发至hadoop02、hadoop03上,并修改broker.id和host.name。

启动Kafka服务

启动Zookeeper服务

android 发布订阅者模式 发布订阅系统_hadoop_06


启动Kafka服务

android 发布订阅者模式 发布订阅系统_android 发布订阅者模式_07

Kafka生产者消费者实例

基于命令行方式使用Kafka

  1. 创建主题
$ kafka-topics.sh --create \
--topic itcasttopic \
--partitions 3 \
--replication-factor 2 \
--zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181
  1. 向主题中发送消息数据
$ kafka-console-producer.sh \
--broker-list hadoop01:9092,hadoop02:9092,hadoop03:9092 \
--topic itcasttopic
--hello kafka

android 发布订阅者模式 发布订阅系统_kafka_08


3. 消费主题中的消息

$ kafka-console-consumer.sh \
--from-beginning --topic itcasttopic \
--bootstrap-server hadoop01:9092,hadoop02:9092,hadoop03:9092

android 发布订阅者模式 发布订阅系统_大数据_09

基于Java API方式使用Kafka
用户不仅能够通过命令行的形式操作Kafka服务,Kafka还提供了许多编程语言的客户端工具,用户在开发独立项目时,通过调用Kafka API来操作Kafka集群,其核心API主要有5种,分别是Producer API、Consumer API、Streams API、Connect API、AdminClient API。

KafkaProducer常用API:

android 发布订阅者模式 发布订阅系统_大数据_10


KafkaConsumer常用API:

android 发布订阅者模式 发布订阅系统_hadoop_11

1.创建一个名为“spark_chapter06”的Maven工程,在pom.xml文件中添加Kafka依赖。

2.创建KafkaProducerTest文件用于生产消息数据并将数据发送到Kafka集群。

3.通过Kafka API创建KafkaConsumer对象,用于消费Kafka集群中名为“itcasttopic”主题的消息数据。

消费者消费消息效果图:

android 发布订阅者模式 发布订阅系统_大数据_12

Kafka Streams

Kafka Streams概述

Kafka Streams是Apache Kafka开源的一个流处理框架,基于Kafka的生产者和消费者,为开发者提供流式处理能力,具有低延迟性、高扩展性、弹性、容错的特点,易于集成到现有应用程序中。它是一套处理分析Kafka中存储数据的客户端类库,处理完的数据可重新写回Kafka,也可发送给外部存储系统。

在流式计算框架模型中,通常需要构建数据流的拓扑结构,例如生产数据源、分析数据的处理器及处理完后发送的目标节点,Kafka流处理框架同样将“输入主题自定义处理器输出主题”抽象成一个DAG拓扑图。

android 发布订阅者模式 发布订阅系统_hadoop_13


生产者作为数据源不断生产和发送消息至Kafka的testStreams1主题中,通过自定义处理器对每条消息执行相应计算逻辑,最后将结果发送到Kafka的testStreams2主题中供消费者消费消息数据。

Kafka Streams开发单词计数

1.在spark_chapter06项目中,打开pom.xml文件,添加Kafka Streams依赖。

2.创建LogProcessor类,并继承Streams API中的Processor接口,实现单词计数业务逻辑。

3.单词计数的业务功能开发完成后,Kafka Streams需要编写一个运行主程序的类App,用来测试LogProcessor业务程序。

4.在hadoop01节点创建testStreams1和testStreams2主题。

5.分别在hadoop01和hadoop02节点启动生产者服务和消费者服务。

6.运行App主程序类。在生产者服务节点(hadoop01)中输入测试语句,返回消费者服务节点(hadoop02)中查看执行结果。

单词计数的效果图:

android 发布订阅者模式 发布订阅系统_java_14