RabbitMQ的传输保障机制

RabbitMQ的传输保障机制分为四个部分,生产者确认、持久化、消费者确认以及高可用性

生产者确认

确保消息从生产者成功发送并存储在RabbitMQ中。

1.工作机制(确认模式):

  • 生产者在发送消息时可以开启消息确认模式(Publisher Confirms)。
  • 当消息成功存储到RabbitMQ的队列中后,RabbitMQ会发送一个确认(ack)给生产者。
  • 如果消息在存储过程中出现问题,RabbitMQ会发送一个未确认(nack)给生产者,生产者可以选择重发消息。

2.应用场景:
需要确保消息从生产者成功发送并到达RabbitMQ服务器的场景。

以下是确认模式下实现的代码,还有另外一种方式-事务机制,也可以实现生产者确认

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatalf("Failed to connect to RabbitMQ: %s", err)
}
defer conn.Close()

ch, err := conn.Channel()
if err != nil {
log.Fatalf("Failed to open a channel: %s", err)
}
defer ch.Close()
err = ch.Confirm(false)
if err != nil {
log.Fatalf("Failed to enable confirm mode: %s", err)
}

confirmChan := ch.NotifyPublish(make(chan amqp.Confirmation, 1))
body := "Hello, World!"
err = ch.Publish(
"", // exchange
"test_queue", // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
if err != nil {
log.Fatalf("Failed to publish a message: %s", err)
}

confirmed := <-confirmChan
if confirmed.Ack {
log.Println("Message confirmed")
} else {
log.Println("Message not confirmed")
}
}

持久化

持久化的作用是,在服务重启或者崩溃时消息不至于丢失,特别是集群中有内存节点时

持久化可以细分为队列的持久化以及消息的持久化

1.队列的持久化

声明队列时,可以通过duration=true来设置队列是否持久化

2.消息的持久化

持久化的消息需要存储在持久化的队列中才能真正实现消息的持久化。如果消息持久化了,但是队列没有持久化,那么RabbitMQ重启后消息和队列都会丢失。

消息发布时设置deliveryMode=2,使得消息存储在磁盘上,如果为1,那么会保存在内存种,重启会丢失。

消费者确认

确保消息从队列中成功消费

  1. 工作机制:
  • 消费者在成功处理消息后,发送一个确认(ack)给RabbitMQ。
  • 如果消费者处理消息失败,可以选择不发送确认(nack),RabbitMQ会重新将消息放回队列,供其他消费者处理。
  1. 应用场景:
  • 需要确保消息被成功处理的场景,避免消息在消费过程中丢失。

高可用性

要实现高可用,则需要多个节点协作才能保障,通常有两种方式

  1. 镜像模式
  • 主节点和镜像节点:队列的主副本位于一个节点上,镜像副本位于其他节点上。当主节点出现故障时,镜像节点可以接管成为新的主节点。
  • 同步机制:所有的消息和元数据都会同步到镜像节点上,确保所有副本的一致性。
  • 故障恢复:如果主节点故障,RabbitMQ会自动将其中一个镜像节点提升为新的主节点,并继续处理消息。
  1. 集群模式
  • 节点类型:集群中的节点可以是内存节点(RAM Node)或磁盘节点(Disk Node)。磁盘节点存储元数据和持久化消息,而内存节点则用于提高性能。
  • 共享元数据:集群中的所有节点共享元数据(如队列声明、交换器配置等),但消息数据通常不共享。
  • 消息路由:消息可以在集群中的任何节点上生产和消费,RabbitMQ会自动处理消息的路由。

RabbitMQ的传输保障机制
https://www.xinyublog.com/tools/rabbitmq/
作者
蚂蚁
发布于
2024年5月3日
许可协议