RabbitMQ 交换机类型详解

RabbitMQ中四大核心概念
  • 生产者:

    产生数据发送消息的程序是生产者。

  • 交换机
    交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,这个得有交换机类型决定。

  • 队列
    队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。

  • 消费者
    消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

在RabbitMQ中,生产者发送消息不会直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列再将消息以推送或者拉取方式给消费者进行消费。

RabbitMQ 交换机类型详解_第1张图片

默认交换机 Default Exchange

默认交换机(default exchange)实际上是一个由RabbitMQ预先声明好的名字为空字符串的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

直连交换机 Direct Exchange

此种类型的交换机是通过routing key 和队列绑定在一起的。

通过一个routing key,交换机可以绑定一个队列,也可以同时绑定多个队列。

如果一个交换机绑定了多个队列,则交换机会将消息分别路由给每一个队列,也就是说每个队列都会得到一份全量的消息。

例如,交换机绑定了2个队列,接到生产者的10条消息后,不是分别向两个队列发送5条消息,而是向2个队列都发送10条消息。

RabbitMQ 交换机类型详解_第2张图片

适用场景

适用于业务数据需要直接传输并消费的场景,比如不同业务模块之间的消息交互,就可以借助基于DirectExchange的消息模型进行通信。

主题交换机 Topic Exchange

和direct exchange类似,topic exchange也是根据routing key,将exchange和queue绑定在一起

区别在于,直连交换机的routing key 是精确匹配,而topic exchange的routing key 是模式匹配,类似于正则表达式匹配。

routing key 可以是类似 .orange. 或者 lazy.# 的表达式。其中,* (星) 代表一个单词,# (hash) 代表0个或多个单词

RabbitMQ 交换机类型详解_第3张图片

适用场景

1、涉及分类或标记的新闻更新,例如体育新闻、娱乐新闻、社会新闻、金融新闻等分类推送。

2、后台任务处理,每个工作线程处理特定的任务。

扇形交换机 Fanout Exchange

和直连、主题交换机不同,扇形交换机不使用routing key,它会将消息路由到所有与其绑定的队列。

和直连交换机的一个交换机绑定多个队列的情况一样,绑定了fanout exchange的队列,都会接收到一份全量的消息。

我们在发送消息时,只指定了交换机,没有指定routing key,在消费者这边也指定了交换机,同时还指定了routing key,结果每个绑定了交换机的队列都可以消费到全量消息,这说明了fanout exchange不使用routing key,它会将消息路由到所有与其绑定的队列。

适用场景

1、适用于广播消息的场景

2、群聊功能,广播消息给当前群聊中的所有人

3、大型多人在线游戏的游戏积分排行榜更新

4、体育新闻客户端实时更新分数

5、分布式系统可以广播各种状态和配置更新

头交换机 Headers Exchange

和上面三种交换机类型不同,headers exchange是根据Message的一些头部信息来分发过滤Message的,它会忽略routing key的属性,如果Header信息和message消息的头信息相匹配,那么这条消息就匹配上了。

有一个重要参数x-match:当“x-match”参数设置为“any”时,只要一个匹配的header 属性值就足够了;当“x-match”设置为“all”时,意味着所有值都必须匹配,才能将交换机和队列绑定上。

适用场景

1、适用于routing key非常复杂或者灵活多变的场景

死信交换机

当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信。

  • 消息被拒绝
  • 消息TTL过期
  • 队列达到最大长度

当消息在一个队列中变成一个死信之后,如果配置了死信队列,它将被重新publish到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列。

RabbitMQ 交换机类型详解_第4张图片

/**
  * 队列的其他属性参数
  * (1)x-message-ttl:消息的过期时间,单位:毫秒;
         *(2)x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
         *(3)x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
         *(4)x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消息;
         *(5)x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。		仲裁队列类型仅支持drop-head;
         *(6)x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
         *(7)x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
         *(8)x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给		 所有消费者(默认false)
         *(9)x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
         *(10)x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地		  传递消息;
         *(11)x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。
  */

你可能感兴趣的:(rabbitmq,分布式)