一.防止消息丢失
    1.交换机、队列、消息要配置消息持久化
    2.开启confirm模式或者return模式进行监听,确保消息准确到达交换机、队列中
    publisher-confirms=”true”
    publisher-returns=”true”
    3.消息不要自动签收,改为手动签收,消费端如果catch之后回退消息到消息队列,一般回退3次还签收不成功就写日志或者写redis,并检查是否程序bug原因
    // 自动签收
    acknowledge=”none”
    // 配置为手动签收
    acknowledge=”manual”
    // 代码进行手动签收成功
    channel.basicAck(deliveryTag,true);
    // 如果出现catch,代码进行手动拒绝签收,false是不重回队列了,true是重回队列
    channel.basicNack(deliveryTag,true,false);
    4.Broker高可用,如搞集群进行消息同步,防止一台服务器掉了消息丢失了。
    二.防止消息重复消费
    image.png
    image.png
    如上图,可以利用数据库乐观锁机制来解决这个问题,我们可以在数据库里设置一个version的字段,消息发送的时候把版本号带过来,执行一次更新操作后修改数据库的版本号,如果再将执行的话比对版本是否一样就可以了。
    或者用Redis的setnx也可以防止多次消费。
    三.消息积压处理
    image.png