解决rabbitmq的重复消息和消息丢失

消息丢失

解决rabbitmq的重复消息和消息丢失_第1张图片
我们来看消息在什么情况下会丢失,我们得理解消息产生和消费的过程。
1.生产者产生消息,投递到rabbimq-server时,投递到队列成功,返回确认时,网络连接断开了,导致消息投递失败。
这里有2种解决方式,
1.同步单条或批量确认
同步确认机制对性能损耗太大,一般不采用
2.异步确认
实现异步确认接口,根据消息的唯一id,来判断,消息是否被投递成功,如若未投递成功可以维护一个消息唯一id和消息体的map映射,开启一个线程,决定是否继续投递。
解决rabbitmq的重复消息和消息丢失_第2张图片
解决rabbitmq的重复消息和消息丢失_第3张图片

消费端消息确认机制

消费端消息确认分自动确认和手动确认
自动确认:,可以指定autoAck参数,当autoAck=true时,一旦消费者接收到了消息,就视为自动确认了消息。在springboot整合rabbitmq模块中,在消费端消费消息抛出异常后,会自动重入队列。自动确认可能会存在消息丢失的情况,比如在spring的事物中回滚啊,等等。
手动确认消息
当autoAck=false时,需要消费端手动确认消息,
tag为channel连接中,接受消息的一个递增整数.,multiple 为是否批量确认,requeue 为是否继续入队

   确认消息方法
    void basicAck(long deliveryTag, boolean multiple) throws IOException;

   拒绝消息 可批量,决定是否重入队列,如果false,则消息会进入死信队列
    void basicNack(long deliveryTag, boolean multiple, boolean requeue)
            throws IOException;

  拒绝消息单个消息,决定是否重入队列,如果false,则消息会进入死信队列
    void basicReject(long deliveryTag, boolean requeue) throws IOException;

例如
解决rabbitmq的重复消息和消息丢失_第4张图片
重复性的消息还是要在消费端,保证幂等性,

参考

https://www.jianshu.com/p/6579e48d18ae

你可能感兴趣的:(rabbitmq)