当前位置:   article > 正文

RabbitMQ中死信交换机的应用,工作原理,实现案例_私信交换机的实现

私信交换机的实现

目录

一、介绍

1. 概述

2. 应用场景

3. 工作原理

二、应用

1. 讲述

2. 运用

三、案例

1. 实践 

2. 代码整合

每篇一获


一、介绍

1. 概述

死信交换机是用来处理消息队列中无法被消费者正确处理的消息的交换机。当消息在队列中变成死信时,它会被重新发送到死信交换机,然后被路由到死信队列中进行处理。

死信交换机的作用是将死信消息重新路由到指定的死信队列中,以便进行后续处理。这样可以帮助系统更好地处理无法被消费者正确处理的消息,保证消息队列的稳定运行。

在RabbitMQ中,可以通过设置队列的属性来指定死信交换机和死信队列。当消息变成死信时,会根据队列的属性将消息发送到对应的死信交换机,然后再路由到指定的死信队列中。

  • 当消息无法路由到队列时,确认消息路由失败。消息成功路由时,当需要发送的队列都发送成功后,进行确认消息,对于持久化队列意味着写入磁盘,对于镜像队列意味着所有镜像接收成功

  • 通过实现 ConfirmCallback 接口,消息发送到 Broker 后触发回调,确认消息是否到达 Broker 服务器,也就是只确认是否正确到达 Exchange 中

通过使用死信交换机,可以更好地处理消息队列中的异常情况,保证系统的稳定性和可靠性。因此,死信交换机在消息队列中起着非常重要的作用。

2. 应用场景

死信交换机在项目中有多种应用场景,其中一些包括:        

        1. 错误处理:当消息在队列中无法被正确处理时,可以将其发送到死信交换机,然后再路由到死信队列中进行错误处理和调查。

        2. 重试机制:当消息处理失败时,可以将其发送到死信交换机,并设置重试次数。如果消息在一定次数内仍然无法被处理,可以将其发送到死信队列中,以便进一步处理或记录错误信息。

        3. 延迟消息处理:可以通过设置死信交换机和死信队列来实现延迟消息处理。当消息需要延迟处理时,可以将其发送到死信交换机,并设置一定的延迟时间,然后再路由到指定的死信队列中进行处理。

        4. 日志记录:可以将无法被正确处理的消息发送到死信交换机,并将其路由到死信队列中进行日志记录,以便后续分析和排查问题。

        总之,死信交换机在项目中可以用于处理消息队列中的异常情况,提高系统的稳定性和可靠性,同时也可以用于实现一些特定的消息处理需求,如延迟处理、重试机制等。因此,在消息队列的设计和应用中,死信交换机是一个非常有用的工具。

3. 工作原理

死信交换机(Dead Letter Exchange,DLX)的工作原理如下:

        1. 定义死信队列:首先需要在消息队列中定义一个死信队列,用于存放无法被正确处理的消息。

        2. 设置队列属性:在定义普通队列时,可以设置一些属性,如消息的过期时间、消息的最大重试次数等。当消息满足这些属性时,会变成死信消息。

        3. 绑定死信交换机:在定义普通队列时,可以指定该队列的死信交换机和死信路由键。当消息变成死信时,会被发送到死信交换机,并根据指定的路由键路由到死信队列中。

        4. 处理死信消息:一旦消息被发送到死信队列中,就可以进行后续处理,如记录日志、重试处理、延迟处理等。

具体工作流程如下:

  • 1.  当消息在普通队列中满足某些条件(如消息过期、消息被拒绝、队列长度超过限制等)时,会变成死信消息。
  • 2.  死信消息会被发送到指定的死信交换机中。
  • 3.  死信交换机会根据指定的路由键将死信消息路由到死信队列中。
  • 4.  死信队列中的消息可以被消费者重新处理,或者进行其他后续处理。

通过死信交换机,可以更好地处理消息队列中的异常情况,保证系统的稳定性和可靠性。同时,也可以实现一些特定的消息处理需求,如延迟处理、重试机制等。因此,死信交换机在消息队列中具有非常重要的作用。

二、应用

1. 讲述

死信,在官网中对应的单词为“Dead Letter”,它是 RabbitMQ 的一种消息机制。

般来说,生产者将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,如果它一直无法消费某条数据,那么可以把这条消息放入死信队列里面。等待

条件满足了再从死信队列中取出来再次消费,从而避免消息丢失。

死信消息来源:

  • 消息 TTL 过期
  • 队列满了,无法再次添加数据
  • 消息被拒绝(reject 或 nack),并且 requeue =false

2. 运用

以下的代码都基于我博客中文章的代码案例:

RabbitMQ中交换机的应用及原理,案例的实现icon-default.png?t=N7T8https://blog.csdn.net/SAME_LOVE/article/details/135761097?spm=1001.2014.3001.5501

生产者代码: 

在生产者的RabbitConfig中增加以下代码

  1. @Bean
  2. public Queue queueA() {
  3. return new Queue("queueA");
  4. }
  5. @Bean
  6. public DirectExchange directExchangeA() {
  7. return new DirectExchange("directExchangeA");
  8. }
  9. @Bean
  10. public Binding bindingA() {
  11. return BindingBuilder
  12. .bind(queueA())
  13. .to(directExchangeA())
  14. .with("dA");
  15. }
  16. @Bean
  17. public Queue queueB() {
  18. return new Queue("queueB");
  19. }
  20. @Bean
  21. public DirectExchange directExchangeB() {
  22. return new DirectExchange("directExchangeB");
  23. }
  24. @Bean
  25. public Binding bindingB() {
  26. return BindingBuilder
  27. .bind(queueB())
  28. .to(directExchangeB())
  29. .with("dB");
  30. }

解析:

以上代码定义了一个名为"RabbitMQ死信队列处理"的配置类,该类包含三个队列:queueA、queueB和directExchangeA、directExchangeB。

其中,queueA和directExchangeA进行绑定,并指定路由键为dA;queueB和directExchangeB进行绑定,并指定路由键为dB。

在生产者的TestController中增加以下代码

  1. @RequestMapping("test07")
  2. public String test07() {
  3. template.convertAndSend("directExchangeA","dA","Hello,directExchangeA:QueueA!");
  4. return "
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/153933
    推荐阅读
    相关标签