RabbitMQ的Producer发送消息保证消息不丢失方案

 RabbitMQ的Producer发送消息保证消息不丢失方案

在rabbitTemplate异步确认的基础上

1 ,为当前message生成一个唯一的id,并在本地缓存已发送的message

2, 通过confirmCallback监听被确认的ack【虽然没有message本身,但是confirmCallback()方法有个correlationData参数,可以通过此参数将msgId返回回来】,将被确认的message从本地删除

3, 定时扫描本地的message,如果大于一定时间未被确认,则重发

当然了,这种解决方式也有一定的问题: 想象这种场景,rabbitmq接收到了消息,在发送ack确认时,网络断了,造成客户端没有收到ack,重发消息。(相比于丢失消息,重发消息要好解决的多,需要在consumer端做到幂等)。

@Override
public DetailRes send(Object message) {
    try {
        //生成一个唯一的msgId
        String id = retryCache.generateId();
        //缓存发送的message
        retryCache.add(id, message);
        //CorrelationData可为当前消息附带上id信息,在调用callback()方法时可以取到该值
        //(因为callback时没有message信息的)
        rabbitTemplate.correlationConvertAndSend(message, new CorrelationData(id));
    } catch (Exception e) {
        return new DetailRes(false, "");
    }

    return new DetailRes(true, "");
}
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    if (!ack) {
        log.info("send message failed: " + cause + correlationData.toString());
    } else {
        //取出发送消息时在correlationData中附带的msgId
        retryCache.del(correlationData.getId());
    }
});

 

 

转载于:https://my.oschina.net/u/3863046/blog/1824134

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值