RabbitMQ缺省配置:

ACK机制 消费者正常消费后发送一个ack, 告诉mq该消息已经正常消费, 然后从队列中删除

消息正常消费

  1. confirmreturnack机制<br />**重复消费**<br />幂等性(每个消息用一个唯一标识来区分,消费前先判断标识有没有被消费过,若已消费过,则直接ACK)

confire return机制
confire 生产者 -> 交换机 默认关闭 confirm callback
return 交换机 -> 队列 出错了才会回调 记录日志

  1. 1)开启confirm机制 publisher-confirms=true
  2. 2)在发送消息前,设置confirm callback回调函数
  3. rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
  4. @Override
  5. public void confirm(CorrelationData correlationData, boolean ack, String cause) {
  6. //b:true 成功、false 失败
  7. }
  8. });
  9. /*消息生产者把消息发送到交换机是否有问题:有无问题,都会回调confirm callback方法*/
  1. 1)开启return机制 publisher-returns=true
  2. 2)开启消息失败回退模式(默认return机制,使用的消息丢弃模式)
  3. rabbitTemplate.setMandatory(true);
  4. 3)在发送消息前,设置return callback回调函数
  5. rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
  6. @Override
  7. public void returnedMessage(Message message, int errorCode, String errorMsg, String exchange,
  8. String routingkey) {
  9. //消息回退,业务处理
  10. }
  11. });
  12. /*交换机把消息推送到队列是否有问题:出现问题,回调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

高可用

搭集群
提升消息处理能力