Willson Chen

Stay Hungry, Stay Foolish.

消息队列基础

消息队列

发展历史

  • 操作系统消息队列:解决进程间通信问题。
  • TIB(The Information Bus):最早的消息中间件,高盛在解决金融交易场景下诞生,基于发布订阅模式。
  • MSMQ:微软消息中间件。
  • JMS(Java Message Service):sun公司提出的消息标准,提出了接口标准用于解决不同中间件的互通。
  • ActiveMQ:Apache协议开源的消息中间件。
  • AMQP:摩根大通和其他公司提出的标准,是行业广泛使用的消息中间件标准。
  • RabbitMQ:基于 AMQP 协议的。
  • Kafka:特点是高吞吐、高并发。由linkin开源,解决 ActiveMQ 消息阻塞,无法支持高并发的问题。
  • RocketMQ:阿里研发解决双11,解决高并发下的高可靠、一致性等问题。
  • Pulsar:存储计算分离,多租户等。

分阶段看:

  • 第一阶段:
    • 解决异步和解耦
    • 代表产品:activemq、rabbitmq
  • 第二阶段:
    • 解决吞吐量和一致性
    • 代表产品:kafka、rocketmq
  • 第三阶段:
    • 解决平台化和云原生
    • 代表产品:puslar

AMQP

AMQP是Advanced Message Queuing Protocal,高级消息队列协议。
包含了AMQ模型和网络协议。

概念

image

  • Exchange(交换机):接收消息,并根据路由键转发消息到绑定的队列。
  • Queue(队列):存储消息直到发送给消费者。
  • Binding(绑定):用于将Exchange和Queue按照路由规则绑定起来。
  • Virtual Host(虚拟主机):一个虚拟主机持有一组交换机、队列和绑定,用于多租户隔离。
  • Broker(消息代理):消息中间件程序。
  • Connection(连接):网络连接,比如TCP连接。
  • Channel(信道):多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接
  • Consumer(消费者):接收消息的程序。
  • Publisher(生产者):发送消息的程序。

Exchange

  • 类型:
    • Direct(直连):根据路由键进行匹配。
    • 队列绑定到交换机时需指定路由键的值。
    • 交换机收到消息时会读取路由键的值,遍历绑定列表,找到所有匹配的队列。
    • Fanout(扇出):将接收到的消息广播到所有绑定的队列。
    • 队列绑定到交换机时无需指定路由键的值。
    • 交换机收到消息时会直接将消息转发到所有绑定的队列。
    • Topic(主题):根据通配符匹配路由键。
    • 队列绑定到交换机时需指定路由键的通配符模式。
    • 交换机收到消息时会读取路由键的值,遍历绑定列表,根据模式找到所有匹配的队列。
    • Headers(头):根据消息的头部信息匹配。
    • 队列绑定到交换机时需指定多个header。
    • 消息携带header与x-match参数,当参数为any时表示任何一个header匹配即可,all表示需全部匹配。
    • 默认交换机:
    • 只要创建的队列没有绑定交换机,都会自动绑定到默认交换机。
    • 路由键与队列名相同。
  • 属性:
    • Name:名称。
    • Type:类型,直连或扇出等。
    • Durable:持久化标志,非持久化broker重启丢失。
    • AutoDelete:自动删除标志,最后一个绑定被解除后是否自动删除。
    • Arguments:可选参数。

Queue

  • 属性:
    • Name:名称。
    • Durable:持久化标志,非持久化broker重启丢失。
    • Exclusive:排他性标志,仅创建者可以使用的私有队列,断开后自动删除。
    • AutoDelete:自动删除标志,最后一个消费者断开后是否自动删除。
    • Arguments:可选参数。
  • 创建:
    • 先声明再使用,如果声明时不存在则创建。
    • 如果已存在并且属性相同则无影响,如属性不同则产生通道级异常。
  • 持久化:
    • 持久化队列在broker后仍然存在。
    • 消息的持久化完全取决于消息本身的持久化模式,与队列持久化无关。

Consumer

  • 获取消息方式:
    • 推:broker推送给消费者。
    • 拉:消费者主动拉取消息。
    • 多个消费者监听同一个队列,消息只会被其中一个消费者消费。

Binding

  • 属性:
    • Source:源,只能是交换机。
    • Destination:目标,可以是队列或交换机。
    • DestinationType:目标类型,queue或exchange。
    • RoutingKey:路由键,直连交换机时使用。
    • Arguments:路由参数。
  • 交换机路由过程:
    • 遍历Binding数组,找到Source为自身的Binding。
    • 判断消息是否满足RoutingKey或Arguments的设置。

Message

  • AMQP传输数据的基本结构时帧,分类:
    • 方法帧:携带RPC请求或响应。
    • 内容头帧:具体业务消息的头部。
    • 内容帧:具体业务消息。
    • 心跳帧:维持TCP连接的帧。
  • 发布消息时包含哪些帧:
    • 方法帧Basic.Publish。
    • 内容头帧。
    • 内容帧,一个或多个。
  • 消费消息时包含哪些帧:
    • 方法帧Basic.Deliver。
    • 内容头帧。
    • 内容帧,一个或多个。