天天看点

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

rabbitmq

一:概念

1:ConnectionFactory:客户端与Rabbitmq建立连接,我们发一条消息连接一次,这样很显然是浪费资源的,建立连接的过程也很耗时,所以我们就会做一个东西让他来管理连接,当我用的时候,直接从里边拿出来已经建立好的连接发信息,那么ConnectionFactory应运而生。

2:channel:消息生产者发送消息到交换机的通道叫channel。

3:交换机Exchange:接收消息生产者发送的消息,作用:一个消息发送多个通道,生产者一条条的发送,太麻烦,交换机就是解决这一问题的。

4:队列:消息缓存。

5:routingKey:路由键,生产者发送消息所带的参数,交换机根据该参数匹配bingKey,匹配成功,则发送到绑定的队列上去。

6:bindingKey:绑定键:交换机与队列绑定的唯一ID。可以手动绑定,也可以在代码中绑定。

二:消息流转流程

1:发送者发送消息(携带参数:交换机,routingKey)

2:rabbitmq根据交换机名称将消息发送到指定的交换机

3:交换机根据routingKey匹配交换机下所有bindingKey,满足,则把消息发送bindingKey对应的队列中去。

4:rabbitmq根消费者据客户端订阅的队列,把队列消息push到消费者。

三:交换机类型

1:direct 直流交换机

根据消息的路由键routingkey,将消息以完全匹配的方式路由到指定的队列中。

这里的匹配指的是消息本身携带的路由键和队列与交换机绑定的绑定键进行对比,完全一致才算匹配上。

2:topic 主题交换机:

和direct交换机非常类似,根据消息的路由键routingkey,将消息以模糊匹配的方式路由到指定的队列中。

3:fanout 扇形交换机:

不管消息的路由键是什么,它直接将发送到该交换机的消息路由到所有与它绑定的队列中。

4:headers 头部交换机

不常用

四:rabbitmq工作模式

1:简单模式

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

一个生产者,一个队列,一个消费者。(这里没有交换机)

2:work queue(工作队列)

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

一个生产者,一个队列,同一个队列里面的消息被多个消费者同时消费,每条消费只会被消费一次。(这里没有交换机)

3:发布订阅模式

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

一个消费者将消息首先发送到交换器(fanout),交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。

ps:X表示交换器,在RabbitMQ中,这里的交换器是 fanout(发送所有绑定的队列中,不在关注routingKey)。

  两个消费者获得了同一条消息。即就是,一个消息从交换机同时发送给了两个队列中,监听这两个队列的消费者消费了这个消息;

如果没有队列绑定交换机,则消息将丢失。因为交换机没有存储能力,消息只能存储在队列中。

4:路由模式

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

生产者将消息发送到交换器(direct),在绑定队列和交换器的时候有一个路由key,生产者发送的消息会指定一个路由key,那么消息只会发送到相应key相同的队列,接着监听该队列的消费者消费消息。

也就是让消费者有选择性的接收消息。

路由模式,是以路由规则为导向,引导消息存入符合规则的队列中。再由队列的消费者进行消费的。

5:主题模式

rabbitmqrabbitmq一:概念二:消息流转流程三:交换机类型四:rabbitmq工作模式五:备份交换机六:过期时间(TTL)七:死信队列八:延迟队列九:优先级队列

使用topic交换机,上面的路由模式是根据路由key进行完整的匹配(完全相等才发送消息),这里的通配符模式通俗的来讲就是模糊匹配。

符号“#”表示匹配一个或多个词,符号“*”表示匹配一个词。与路由模式相似,但是,主题模式是一种模糊的匹配方式。

五:备份交换机

生产者在发送消息的时候如果不设置 mandatory 参数 那么消息在未被路由的情况下将会丢失,如果设置了 mandatory 参数,那么需要添加 ReturnListener 的编程逻辑,生产者的代码将变得复杂。如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器,这样可以将未被路由的消息存储在 RabbitMQ 中,再在需要的时候去处理这些消息。

六:过期时间(TTL)

RabbitMQ 可以对消息和队列设 TTL。目前有两种方法可以设置消息的 TTL 。第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息本身进行单独设置,每条消息的 TTL 可以不同。如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准。消息在队列中的生存时一旦超过设置 TTL 值时,就会变成"死信" (Dead Message) ,消费者将无法再收到该消息,这点不是绝对。
           

七:死信队列

DLX ,全称为 Dead-Letter-Exchange ,可以称之为死信交换器,也有人称之为死信邮箱。当消息在一个队列中变成死信 (dea message) 之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX ,绑定 DLX 的队列就称之为死信队列。

消息变成死信一般是由于以下几种情况:
1:消息被拒绝,并且设置requeue参数为false
2:消息过期
3:队列达到最大长度
           

对于 RabbitMQ 来说, DLX 是个非常有用的特性,它可以处理异常情况下,消息不能够被消费者正确消费(消费者调用了 Basic.Nack 或者 Basic.Reject) 而被置入死信队列中的情况,后续分析程序可以通过消费这个死信队列中的内容来分析当时所遇到的异常情况,进而可以改善和优化系统。

八:延迟队列

延迟队列存储的对象是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

九:优先级队列

具有高优先级的队列具有高的优先权,优先级高的消息具备优先被消费的特权。可以通过设置队列的x-max-priority 参数来实现。

优先级高的消息可以被优先消费,这个也是有前提的 如果在消费者的消费速度大于生产者的速度Broke 中没有消息堆积的情况下,对发送的消息设置优先级也就没有什么实际意义。因为生产者刚发送完一条消息就被消费者消费了,那么就相当于 Broker 中至多只有一条消息,对于单条消息来说优先级是没有什么意义的。           

继续阅读