前言

本文记录消息队列基本概念、使用场景,以及Kafka的简介,仅供学习参考。
文章部分内容来自黑马课件。

1. 消息队列简介

消息队列(Message Queue),也就是我们常说的 MQ。从字面上来理解,消息队列是一种用来存储消息的队列。

消息队列中间件就是用来存储消息的软件(组件)。举个例子来理解,为了分析网站的用户行为,我们需要记录用户的访问日志。这些一条条的日志,可以看成是一条条的消息,我们可以将它们保存到消息队列中。将来有一些应用程序需要处理这些日志,就可以随时将这些消息取出来处理。
目前市面上的消息队列有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ 等。

2. 消息队列的应用场景

  • 异步处理

    • 电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,此时,就可以使用消息队列来进行异步处理,从而实现快速响应。

  • 系统解耦

  • 流量削峰

  • 日志处理

3. 生产者、消费者模型

Java服务器端开发的交互模型是这样的:

使用Java JDBC来访问操作 MySQL 数据库的交互模型是这样的:

这也是一种请求响应模型,只不过它不再是基于 http 协议,而是基于 MySQL 数据库的通信协议。
而如果我们基于消息队列来编程,此时的交互模式成为:生产者、消费者模型:

4. 消息队列的两种模式

4.1 点对点模式


消息发送者生产消息发送到消息队列中,然后消息接收者从消息队列中取出并且消费消息。消息被消费以后,消息队列中不再有存储,所以消息接收者不可能消费到已经被消费的消息。
消息队列支持存在多个消费者, 但是对一个消息而言, 只会有一个消费者可以消费。

点对点模式的特点:

  • 每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  • 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息
  • 接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息

4.2 发布订阅模式


消息生产者(发布)将消息发布到消息队列中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到消息队列的消息会被所有订阅者消费。

发布/订阅模式特点:

  • 每个消息可以有多个订阅者
  • 发布者和订阅者之间有时间上的依赖性,针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
  • 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线运行

5. 使用消息队列的好处

  • 解耦
    • 允许独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束
  • 可恢复性
    • 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理
  • 缓冲
    • 有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
  • 灵活性、峰值处理能力
    • 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃
  • 异步通信
    • 很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

6. Kafka简介

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),由 Scala 和 Java 编写,主要应用于大数据实时处理领域。

Apache Kafka是一个分布式流平台。一个分布式的流平台应该包含3点关键的能力(官网介绍):

  1. 发布和订阅流数据流,类似于消息队列或者是企业消息传递系统
  2. 以容错的持久化方式存储数据流
  3. 处理数据流

7. Kafka的应用场景

Kafka通常用在两类程序中:

  1. 建立实时数据管道,以可靠地在系统或应用程序之间获取数据
  2. 构建实时流应用程序,以转换或响应数据流


从上图可以看到:

  1. Producers:可以有很多的应用程序,将消息数据放入到Kafka集群中。
  2. Consumers:可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。
  3. Connectors:Kafka的连接器可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到
    数据库中。
  4. Stream Processors:流处理器可以Kafka中拉取数据,也可以将数据写入到Kafka中。

8. Kafka的优势

特性 ActiveMQ RabbitMQ Kafka RocketMQ
所属社区/公司 Apache Mozilla Public License Apache Apache/Ali
成熟度 成熟 成熟 成熟 比较成熟
生产者-消费者模式 支持 支持 支持 支持
发布-订阅 支持 支持 支持 支持
REQUEST-REPLY 支持 支持 - 支持
API完备性 低(静态配置)
多语言支持 支持,JAVA优先 语言无关 支持,JAVA优先 支持
单机呑吐量 万级(最差) 万级 十万级 十万级(最高)
消息延迟 - 微秒级 毫秒级 -
可用性 高(主从) 高(主从) 非常高(分布式)
消息丢失 - 理论上不会丢失 -
消息重复 - 可控制 理论上会有重复 -
事务 支持 不支持 支持 支持
文档的完备性
提供快速入门
首次部署难度 -