莫张周刘王 发表于 2024-8-9 14:09:51

RabbitMQ常见题目办理方案

RabbitMQ常见题目办理方案

消息丢失题目

   
[*]生产者丢失消息
[*]RabbitMQ弄丢消息
[*]消费者弄丢消息
生产者丢失消息



[*]生产者消息没到交换机,相称于生产者弄丢消息
[*]交换机没有把消息路由到队列,相称于生产者弄丢消息
对于上面两种情况,我们可以使用异步的监听操作机制来防备
   ①乐成/未乐成发送到交换机可以触发一个confirm-type监听
②交换机发送到队列会有一个publisher-returns监听
在pom文件中引入依赖项后进行设置文件的编写
rabbitmq:
    publisher-returns: true
    publisher-confirm-type: correlated
#新版本 publisher-confirms: true 已过时

   编写设置类
@Configuration
@Slf4j
public class RabbitMQConfig {
   

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void enableConfirmCallback() {
   
      //confirm 监听,当消息成功发到交换机 ack = true,没有发送到交换机 ack = false
      //correlationData 可在发送时指定消息唯一 id
      rabbitTemplate.setConfirmCallback(
            (correlationData, ack, cause) -> {
   
            if(!ack){
   
                //记录日志、发送邮件通知、落库定时任务扫描重发
            }
      });
      
      //当消息成功发送到交换机没有路由到队列触发此监听
      rabbitTemplate.setReturnsCallback(returned -> {
   
            //记录日志、发送邮件通知、落库定时任务扫描重发
      });
    }
}

   tips:
对于实际开发中,一般不这样使用,由于丢失的概率很低,成本又很高,一般都采用日志/邮件记载,手动维护
真的极其罕见的是生产者弄丢消息,那么开发往数据库补数据就行了。
RabbitMQ弄丢消息



[*]RabbitMQ 宕机导致队列、队列中的消息丢失,相称于 RabbitMQ 弄丢消息
   办理方法就是设置长期化消息写出磁盘,这样子可以确保RabbitMQ宕机重启后队列和消息不会丢失
长期化操作:


[*]交换机长期化
[*]队列长期化
[*]消息长期化
   交换机长期化
@RabbitListener(
      bindings = @QueueBinding(
                value = @Queue(
                  value =
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: RabbitMQ常见题目办理方案