Kafka 入门教程之一

大纲

前言

学习资源

消息队列

目前企业中比较常见的消息队列产品主要有 Kafka、RabbitMQ、RocketMQ、ActiveMQ 等。在大数据场景主要采用 Kafka 作为消息队列,而在 JavaEE 开发中主要采用 RabbitMQ、RocketMQ、ActiveMQ。

消息队列的优势

  • 解耦 - 允许独立地扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束

  • 缓冲 - 有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
  • 削峰 - 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源并随时待命,这无疑是巨大的浪费。使用消息队列
    能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃

  • 异步通信 - 很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要
    的时候再去处理它们

  • 可恢复性 - 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理

消息队列的两种模式

点对点模式

点对点模式 就是一对一,消费者主动拉取数据,消息收到后消息会被清除。消息生产者将消息发送到 Queue 中,然后消息消费者从 Queue 中取出并消费消息。消息被消费以后,Queue 中不再存储它,所以消息消费者不可能消费到已经被消费的消息。Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

发布 / 订阅模式

发布/订阅模式 就是一对多,消息产生后主动推送给订阅者,消费者消费消息之后不会清除消息。消息生产者(发布)将消息发布到 topic 主题(如浏览、点赞、收藏、评论等)中,同时有多个消息消费者(订阅)消费该消息。这和点对点模式不同,每个消费者互相独立,发布到 topic 的消息会被所有订阅者消费。

Kafka 详细介绍

在流式计算中,Kafka 一般用于缓存数据,Storm 通过消费 Kafka 的数据来进行计算。

  • Apache Kafka 是一个开源的分布式消息队列系统,由 Scala 语言编写。
  • Kafka 最初由 LinkedIn 公司开发,并于 2011 年初开源。2012 年 10 月从 Apache Incubator 毕业,该项目的目标是为处理实时数据提供一个统一、高通量、低延迟的平台。
  • Kafka 集群由多个 Kafka 实例(broker)组成,无论是 Kafka 集群,还是 Consumer 都依赖于 Zookeeper 集群保存一些 meta 信息,以此来保证系统的高可用性。

提示

从 Kafka 2.8.0 版本开始,Kafka 自身实现了 Raft 分布式一致性机制,这意味着 Kafka 集群是可以选择脱离 ZooKeeper 独立运行的。

Kafka 概述

  • 传统定义:Kafka 是一个分布式的基于发布 / 订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
  • 最新定义:Kafka 是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

Kafka 基础架构

  • Producer:消息生产者,就是向 Kafka Broker 发消息的客户端。
  • Consumer:消息消费者,就是从 Kafka Broker 取消息的客户端。
  • Consumer Group (CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
  • Broker:一台 Kafka 服务器就是一个 broker。一个 Kafka 集群由多个 broker 组成。一个 broker 可以容纳多个 topic
  • Topic主题,可以理解为一个队列,生产者和消费者面向的都是一个 topic
  • Partition:分区,为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即 Kafka 服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
  • Replication:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且让 Kafka 仍然能够继续工作,Kafka 为此提供了副本机制。一个 topic 的每个分区都有若干个副本,包括一个 leader 和若干个 follower
  • Leader:每个分区多个副本的 ,生产者发送数据的对象,以及消费者消费数据的对象都是 leader
  • Follower:每个分区多个副本的 ,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 leader

Kafka 企业案例

Kafka 集群搭建

单机搭建 Kafka 集群

生产环境搭建 Kafka 集群

Kafka 常用命令

Topic 命令

命令参数

使用案例

  • 创建主题:创建名称为 test、分区数量为 1 和 分区副本数量为 3 的主题
1
$ ./kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --topic test --partitions 1 --replication-factor 3
  • 查看主题列表
1
$ ./kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092
  • 查看主题详情:查看 test 主题的详细信息(例如分区数量、分区副本数量等)
1
$ ./kafka-topics.sh --describe --bootstrap-server 127.0.0.1:9092 --topic test
  • 更改主题的分区数量:更改 test 主题的分区数量为 3
1
$ ./kafka-topics.sh --alter --bootstrap-server 127.0.0.1:9092 --topic test --partitions 3
  • 删除主题:删除 test 主题
1
$ ./kafka-topics.sh --delete --bootstrap-server 127.0.0.1:9092 --topic test

特别注意

  • (1) Kafka 不支持更改主题的分区的副本数量。
  • (2) 更改主题的分区数量时,只能增加,不能减少。

Consumer 命令

命令参数

使用案例

  • 消费 test 主题中的数据(增量消费)
1
$ ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test
  • 消费 test 主题中的所有数据(包括历史数据)
1
$ ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --from-beginning

Producer 命令

命令参数

使用案例

  • 生产消息:往 test 主题发送消息
1
$ ./kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test