大纲
前言
学习资源
消息队列
目前企业中比较常见的消息队列产品主要有 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
|
1
| $ ./kafka-topics.sh --delete --bootstrap-server 127.0.0.1:9092 --topic test
|
特别注意
- (1) Kafka 不支持更改主题的分区的副本数量。
- (2) 更改主题的分区数量时,只能增加,不能减少。
Consumer 命令
命令参数
使用案例
1
| $ ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test
|
1
| $ ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --from-beginning
|
Producer 命令
命令参数
使用案例
1
| $ ./kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test
|