RabbitMQ(三) 性质

本文详细介绍了MQ中的四种交换机类型:直连交换机、扇型交换机、主题交换机及头交换机的工作原理与特性。并通过实例展示了如何利用不同类型的交换机实现消息的一对一、一对多以及更复杂的路由策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于mq来说,它的每一个组件都是有各种性质设置的,从而来满足我们的各种需求

 

用户生产/消费消息,这个交互的过程,是用户与交换机之间的交互而不是直接和队列做的交互。

交换机 你可以设置以下性质:

交换机的类型分别是Direct Exchange(直连交换机), Fanout Exchange(扇型交换机), Topic Exchange(主题交换机)与 Headers Exchange(头交换机)这四种,他们的区别在于路由的不同

1>  Direct Exchange 
$this->exchange->setType(AMQP_EX_TYPE_DIRECT); 

它的性质和它的名称一样,一对一的性质 这里需要在向交换机推送消息的同事,设置路由键来绑定(设置消息的性质)该消息信息

举例来说就是:

消息A发送到了 DE交换机上,某一个队列B通过绑定路由名为“DEandB_Route”的路由和对应名称的交换机来获取对应特性的消息,进行一对一的交互,当然这个是交换机的一个性质,这里的路由键决定了消息的去向,决定了哪一个特定队列缓存该交换机的消息
也可以说,同一个交换机,通过改变路由键而改变对应消息绑定的队列,但始终一个交换机绑定一个队列
 

2>Fanout Exchange

这个就是上面的直连交换机扩展,一对多,夸张点说是一对所有的关系,这里通过交换机同时绑定的多个队列路由,将一个消息同时发送到多个队列中去,这里的路由键可以设为空,以广播的形式传输消息,一般不用这种类型,但是这种方式传递速度最快,毕竟无脑输出,当然这里也仅针对绑定该交换机的所有队列,毕竟交换机的设置也是有设置交换机名称的

3> Topic Exchange

主题交换机又是上面两种的结合体,通过主题类型进行一对一或一对多的消息转递,这种模式又叫做发布/订阅模式。

这种模式需要路由绑定,但是消息和对应的路由键发送到T交换机时,T交换机会对这个路由键进行路由匹配,然后将消息发布到所有匹配的对应队列中进行存储,这里就像是sql里面的 like ,将一个路由键发送到这里,交换机对它进行模糊查询,然后再输出到查询到的队列中,总的来说,就是无脑地图炮,变成局部轰炸了

 

4>Headers Exchange

头交换机和主题交换机类似,但是在头交换机里有一个特别的参数”x-match”,当”x-match”的值为“any”时,只需要消息头的任意一个值匹配成功即可,当”x-match”值为“all”时,要求消息头的所有值都需相等才可匹配成功。

头交换机和不需要设置路由键,headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。(这个还没怎么见过,以后用到就再更新)

好了,交换机的最重要的一个性质说完了,那其他就很简单了

name:名称,必须唯一;
(exchange_type)type:类型,共有四种(fanout,direct,topic,headers),默认direct;
Durability:是否持久化,默认否;
Auto delete:是否自动删除;
Internal:是否是内部交换机,默认否;
Arguments:设置额外的参数;

 

name              交换机名称,这个必须唯一,如果重复声明交换机并且声明的参数完全一样,那么mq会忽略该声明

Auto delete     当所有与之绑定的消息队列都完成了对此交换机的使用后,是否删掉它

 

Durability        是否持久化关系到:(消息,队列,交换机的持久化都是一样的)
 

  • 消息持久化是在消息投递前定义的,设置了持久化后,消息会被保存在磁盘,当被消费后会从磁盘中删除,但是也不能保证100%持久化成功,因为消息是先放到内存中的,如果此时主机崩溃,还是会有一部分来不及写入磁盘;

  • 交换机持久化是在声明该交换机的时候设置的,当主机崩溃或重启后,mq一重新上线会自动重新声明一个和原来完全一样的交换机;

  • 队列持久化是在队列被声明的时候设置的,mq重新上线会自动重新声明一个和原来完全一样的queue,但是队列里的消息会全部丢失;

注意:

如果声明交换机已经存在,但修改了它的属性,比如类型或持久化等,那么会报错;所以修改的方法是先删除原来的交换机再创建一个新的交换机;

交换机还有一种,同样类型队列也有

Dead Letter Exchange(死信交换机)

在默认情况,如果消息在投递到交换机时,交换机发现此消息没有匹配的队列,则这个消息将被悄悄丢弃。为了解决这个问题,RabbitMQ中有一种交换机叫死信交换机。当消费者不能处理接收到的消息时,将这个消息重新发布到另外一个队列中,等待重试或者人工干预。这个过程中的exchange和queue就是所谓的”Dead Letter Exchange 和 Queue”



队列属性设置和交换机相似:

队列queue

  • queue用来缓存消息,并向消费者推送消息;

  • 声明队列的名称最多255个字节,可以是任意字符串;

  • 如果声明时名字为空,mq会随机生成一个名字;

  • 声明队列不可以用amq.开头,否则报错, amq.是rabbitmq内部使用的默认队列,内部使用的默认队列不能在应用中使用,不然会报错;

  • 如果多个消费者订阅同一个队列的消息,那么队列会用轮询的方式推送消息,这种方式可以实现负载均衡;

注意:

  • 每个队列的名字是唯一的,如果重复声明交换机并且声明的参数完全一样,那么mq会忽略该声明;

  • 如果声明的该队列已经存在,但修改了它的属性,比如类型或持久化等,那么会报错;所以修改的方法是先删除原来的队列再创建一个新的队列;

消息订阅

  • 消费者可以向队列订阅消息,每个消费者都会被分配一个标志符;

  • 订阅时可以设置消费回执,告诉mq什么时候可以将消息删除了,默认是自动删除的;

  • 消费者也可以向mq发送 拒绝消息 ,这时消息会被放回队列等待投递到其他的消费者;

  • 消费者订阅的时候可以设置预取计数,当存在多个消费者共同订阅一个队列的时候,由于是轮询机制,但每个消费者的消费能力可能是不一样的,这可能造成有的消费者闲的要死,有的忙的要死,设置预取数量,在没有收到回执确认前,该队列推送的消息是有限的,可以提高整体的吞吐量;

上面一些队列性质说明是借鉴的 https://www.cnblogs.com/hello-/articles/10346263.html

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值