RabbitMQ缺省配置:
ACK机制 消费者正常消费后发送一个ack, 告诉mq该消息已经正常消费, 然后从队列中删除
消息正常消费
confirm、return、ack机制<br />**重复消费**<br />幂等性(每个消息用一个唯一标识来区分,消费前先判断标识有没有被消费过,若已消费过,则直接ACK)
confire return机制
confire 生产者 -> 交换机 默认关闭 confirm callback
return 交换机 -> 队列 出错了才会回调 记录日志
1)开启confirm机制 publisher-confirms=true2)在发送消息前,设置confirm callback回调函数rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {//b:true 成功、false 失败}});/*消息生产者把消息发送到交换机是否有问题:有无问题,都会回调confirm callback方法*/
1)开启return机制 publisher-returns=true2)开启消息失败回退模式(默认return机制,使用的消息丢弃模式)rabbitTemplate.setMandatory(true);3)在发送消息前,设置return callback回调函数rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {@Overridepublic void returnedMessage(Message message, int errorCode, String errorMsg, String exchange,String routingkey) {//消息回退,业务处理}});/*交换机把消息推送到队列是否有问题:出现问题,回调return Callback方法*/
confirm、return消息发送失败后,把失败的消息内容存储起来(redis),使用定时任务过一段时间再重新发送消息
消息顺序性
将消息放入同一个交换机,交给同一个队列,这个队列只有一个消费者,消费者只允许同时开启一个线程
消息重试
使用消息重试机制(SpringBoot默认3次消息重试机制)
消息丢失
方案1:
交换机持久化 durable = true 走的构造器
队列持久化 durable = true
Message持久化发送 deliveryMode=2代表持久化消息
方案2:
将自动ACK改为手动ACK确认机制
方案3:
设置镜像集群
方案4:
开启confirm(推荐)
消息堆积
原因:
消息发送数量太多 消息合并 假如发送id 封装到集合 一次发过去
消息队列存储数量太小 扩容 搭建集群
消费者消费能力太弱 增加消费者数量
消息限流
//保护消息消费者服务,防止请求并发量太高,导致服务器宕机1)开启手动消息确认 acknowledge-mode=manual2)设置限流的具体数据 prefetch=100
高可用
搭集群
提升消息处理能力
