一.防止消息丢失
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高可用,如搞集群进行消息同步,防止一台服务器掉了消息丢失了。
二.防止消息重复消费
如上图,可以利用数据库乐观锁机制来解决这个问题,我们可以在数据库里设置一个version的字段,消息发送的时候把版本号带过来,执行一次更新操作后修改数据库的版本号,如果再将执行的话比对版本是否一样就可以了。
或者用Redis的setnx也可以防止多次消费。
三.消息积压处理