RabbitMQ 的延时队列和镜像队列原理与实战

掌阅资深后端工程师、掘金小测《Redis深度历险》作者钱文品为大家介绍了RabbitMQ的延时队列和镜像队列的原理与实践,重点比较了RabbitMQ提供的消息可靠与不可靠模式,同时介绍了生产环境下如何使用RabbitMQ实现集群间消息传输。
展开查看详情

1.RabbitMQ 特性

2.RabbitMQ 特性 1.消息的接受者(消费者)

3. RabbitMQ 特性 1.消息的接受者(消费者) 2. 消息的发送者(⽣产者)

4. RabbitMQ 特性 1.消息的接受者(消费者) 2. 消息的发送者(⽣产者) 3. 消息的仓储(持久化)

5. RabbitMQ 特性 1.消息的接受者(消费者) 2. 消息的发送者(⽣产者) 3. 消息的仓储(持久化) 4. 延后传递(堆积)

6. RabbitMQ 特性 1.消息的接受者(消费者) 2. 消息的发送者(⽣产者) 3. 消息的仓储(持久化) 4. 延后传递(堆积) 5. 复制(⼴播)

7. RabbitMQ 特性 1.消息的接受者(消费者) 2. 消息的发送者(⽣产者) 3. 消息的仓储(持久化) 4. 延后传递(堆积) 5. 复制(⼴播) 6. 分炼(分类路由)

8. 消息不可靠 socket.write(msg)

9.消息不可靠 1. ⽹络故障 2. 宕机 2. kill -9

10. 消息可靠 1.server deliver后不删除 2. client 收到消息处理后回复ack 3. server 收到ack后删除消息 4.没收到ack消息(关闭后)重新投递

11. 消息可靠 1.server deliver后不删除 2. client 收到消息处理后回复ack 3. server 收到ack后删除消息 4.没收到ack消息(关闭后)重新投递 5.ack丢失会导致消息重复处理 6.去重(幂等)由业务系统⾃⼰考虑

12.Auto Ack vs Manual Ack 1.AutoAck 投后即删(no ack) 2. ⽹络故障,消息丢失 3.消费慢,投递风暴 4.缓冲区堆积,Server 写不动 5.链接被Server强制关闭

13. Auto Ack vs Manual Ack 1. Manual Ack 善解⼈意(照顾客户端) 2. 客户端PrefetchCount 能⼒参数 3. Deliver 有限个消息 4. Ack ⼀个,Deliver ⼀个

14.⽣产者消息可靠性 消费端的问题⽣产端也会有

15.⽣产者消息可靠性 ⽣产的消息也会丢

16.⽣产者消息可靠性 1. fsync ⼏百毫秒⼀次 2. Server 宕机 3. Redis AOF

17. ⽣产者事务 1. ⽤ select 和 commit 包裹 publish 2.commit要等到fsync才返回,奇慢! 3.批量 publish

18. ⽣产者确认 1. 等价于 消费者 ack(fsync) 2. ⽣产端需要实现消息重发机制(难) 3. 没有重发机制的confirm没什么⽤(除了降速)

19. ⽣产者确认(重发) 1. 存内存会丢 2. 存磁盘需要fsync(⽆状态变有状态) 3.存 redis 还会遇到⽹络故障(Redis也会丢) 4.ack丢失,重发会导致消息重复

20. 消息过期 Queue x-message-ttl 属性 回收站

21. 死信队列 1. 延时队列 2. 过期时间⽐较死,不灵活 3.不同的过期时间需要不同的过期队列

22. 死信队列 Retry Later(双重死信) 1. 消息处理异常 客户端reject 消息进⼊死信队列 1. 死信队列⾥消息过期重新⼊队列

23.死信队列 演⽰

24. 集群 1. 元信息每个节点都有 2. 队列⾥的消息只有⼀份 3. 客户端只会链接⼀个节点(负载均衡) 4. 服务端转发

25.镜像队列

26. 镜像队列 1. 镜像队列列是默默⽆无闻的 2. ha-mode=all|exactly|nodes 3. ha-params=n/2+1 4. x-queue-master-locator=min-master|client-local|random 5. ha-sync-mode=manual|automatic 6. ha-sync-batch-size=1000 7. ha-promote-on-shutdown=when-synced|always 8. ha-promote-on-failure=when-synced|always(v3.7.5+)

27. 镜像队列 配置 Ram Node 对性能提升⽆益

28.镜像队列 演⽰

29.Game Over