消息重试机制幂等性

如何合适选择重试机制

情况1:  消费者获取到消息后,调用第三方接口,但接口暂时无法访问,是否需要重试?      需要重试

情况2:  消费者获取到消息后,抛出数据转换异常,是否需要重试?                                      不需要重试

总结:对于情况2,如果消费者代码抛出异常是需要发布新版本才能解决的问题,那么不需要重试,重试也无济于事。应该采用日志记录+定时任务job健康检查+人工进行补偿

 

 

消费者如果保证消息幂等性,不被重复消费

 

产生原因:网络延迟传输中,会造成进行MQ重试中,在重试过程中,可能会造成重复消费。

 

解决办法:

使用全局MessageID判断消费方使用同一个,解决幂等性。

基于全局消息id区分消息,解决幂等性

生产者:

请求头设置消息id(messageId)

@Component

public class FanoutProducer {

    @Autowired

    private AmqpTemplate amqpTemplate;

 

    public void send(String queueName) {

       String msg = "my_fanout_msg:" + System.currentTimeMillis();

       Message message = MessageBuilder.withBody(msg.getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON)

              .setContentEncoding("utf-8").setMessageId(UUID.randomUUID() + "").build();

       System.out.println(msg + ":" + msg);

       amqpTemplate.convertAndSend(queueName, message);

    }

}

你可能感兴趣的:(消息中间件)