RabbitMQ详解

1. 五种工作模式

1.1 简单模式

生产者p发送消息到队列,消费者c消费消息。(无交换机消息直接进入队列)

p->queue->c

1.2 工作模式

一个生产者p发送消息到队列,队列将消息分配给多个消费者c1,c2。(实现负载均衡,适合集群异步处理,典型场景:发送邮件、短信等) p->queue|->c1 |->c2

1.3 订阅模式,每个队列的消息都是一样的

使用广播类型的交换机e, 生产者p把消息发送到交换机e,交换机e把消息发送到和交换机绑定的队列c4、c5(每个消费者接收相同的消息。典型应用场景:天气订阅,微博订阅等)

      |->c4
p->e->|
      |->c5

1.4 路由模式

使用Direct类型的交换机,生产者p发送消息到交换机e,交换机E根据路由键(如error发送到c1)匹配队列,消息仅发送到匹配的队列(与订阅模式的区别:按条件筛选发送)

    |->error->c1
p->e|
    |->info->c2

1.5 主题模式

使用Topic类型的交换机,路由模式的升级版,支持通配符匹配路由,匹配更灵活(#代表匹配一个或多个单词,*代表匹配一个)

    |log.*->c4
p-> |
    |log.#->c5

2. 消息持久化

当RabbitMQ重启以后,未消费的消息可以在服务重启后继续消费,不会丢失。

3. 应答机制 ACK

两种方式

  • 自动确认:消费者接收消息后,立即ACK然后再处理业务逻辑,加入业务逻辑出现异常,消息也会被确认
  • 手动确认:消费者接收消息后,消息状态被设置为unack,由业务逻辑指定ACK的位置,假如没有手动ACK,则mq中的消息不会减少,会重复消费

4. 死信队列

DLX全程Dead-Letter-Exchange,也可以称为私信交换机,就是当一个队列中的消息变成死信以后,会被重新发送到另一个交换机,这个交换机就是DLX,而绑定DLX的队列就是死信队列。 变为死信的一般情况:

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

使用死信队列只需要定义队列的时候设置x-dead-letter-exchange参数指定交换机就可以了,x-message-ttl参数设置消息存活时间,x-dead-letter-routing-key参数设置路由键

5. 延时队列

延时队列就是当消息发送以后,并不想让消费者立即拿到消费,而是等待特定时间之后才能拿到消息来消费。

延时功能可以通过设置过期时间+死信队列来实现

6. 集群模式

  • 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
  • 允许通过添加更多的节点来扩展消息通信的吞吐量
  • RabbitMQ会始终记录以下四种类型的内部元数据
    • 队列元数据-队列的名称和他们的属性(是否持久化,是否自动删除)
    • 交换器元数据-交换器的类型、名称和属性
    • 绑定元数据-一张简单的表格展示了如何将消息路由到队列
    • v-host元数据-为vhost内的队列、交换器和绑定提供命名空间和安全属性

RabbitMQ集群的3个模式

  1. 主备模式:从节点相当于主节点的链接,所有从节点收到的请求,真实转向的都是从节点。一般在并发和数据不是特别多的情况下使用,当从节点挂掉后会从备份节点中选择一个节点出来作主节点对外提供服务。
  2. 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用。作用就是消息实体会主动在镜像节点之间实现同步,任何一个节点宕机都没关系,保证100%数据不丢失,在实际工作中用的最多的。并且实现集群非常的简单,一般物联网大厂都会构建这种镜像集群模式。
  3. 异地多活模式:用来实现异地的数据复制,使用多活模式需要借助federation插件来实现集群间或节点间的消息复制,广泛应用于众多互联网公司

7. 负载均衡

  • HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡、以及基于TCP和HTTP的应用程序代理
  • 特别适用于那些负载特大的web站点,完全可以支持数以万计的并发连接,同时可以保护web服务器不被暴露到网络上