RabbitMQ 的消息传递模型

2019-09-11 0 By admin

虚拟消息服务器(VirtualHost) 对象下可以分为【消息交换机】Exchange用于管理消息队列和【队列】Queue用于消息队列的分类。

一、消息传递模型

我们都知道【生产者】将消息发送到 RabbitMQ 服务中,而【消费者】从其接受和使用消息。不过消息是如何在RabbitMQ中传递的呢?这里需要学习RabbitMQ的消息传递模型。

RabbitMQ 的消息传递模型的核心思想是,【生产者】不直接发送任何信息到队列。事实上,【生产者】根本就不知道消息是否会被传送到队列。
【生产者】只能发送消息到【消息交换机】。【消息交换机】一方面接收来自【生产者】的消息,另一方面是将接收到消息推送到队列中。
【消息交换机】必须知道它如何处理接收消息的确切方法。是发送到特定队列?发送到多个队列?或者它应该被丢弃?该规则由【消息交换机】的类型来定义。

1.1、消息交换机 Exchange

用于接受、分配消息。VirtualHost 创建后,会自动创建多个消息交换机;并设置一个为默认交换机。
核心概念:可以简化理解为路由器,其不存储数据,其通常会和一个队列绑定,但也可以绑定到另一个交换器上。
其包括4种类型的交换器类型,生产实践中主要使用的类型是:可以精细管理的direct和topic两种。

  1. direct,路由规则为完全匹配;
  2. topic,支持完全匹配,也支持模糊匹配;
  3. fanout,会将消息转发到该交换器绑定的所有队列中;
  4. header,实际中无应用。

1.2、队列 Queue

用于存储生产者的消息;和Kafka的消息模型完全不同,其会将消息存储在Topic中。因此在实现类似ConsumerGroup概念时差异很大,Kafka是可以回溯消息的,但RabbitMQ新绑定的队列的数据是空的,不能回溯。

1.3、绑定键 BindingKey

绑定键是用于绑定【消息交换机】和【队列】的一个字符串。
当【消息交换机】接受到消息后,会检查消息附带的【路由键】;如果【路由键】和某个【绑定键】匹配,则【消息交换机】会将此消息,分配到对应的【队列】中。

1.4、路由键 RoutingKey

在【生产者】向 RabbitMQ 发送消息时,一般会附带一个称为【路由健】的字符串。
【消息交换机】会根据这个字符串,来匹配【消息交换机】自身设置的【绑定键】;当【路由健】和【绑定键】匹配后,就可以确定此消息会进入的【队列】了。