前言、最近在生产上遇到一些消息队列的问题,翻阅了很多资料文档发现有不少的都是错误的,于是把自己从实践中得到的一些分享、记录在此;

一、MQ的应答模式

  • acknowledge-mode: none(无应答模式)
    在这种模式下,不管消费者异常消费,还是正常消费,MQ服务器中的队列都会自动删除已消费的消息

  • acknowledge-mode: auto(自动应答模式)
    当mq的应答模式配置为auto,或者没有进行配置时,系统会默认为自动应答模式。在这种情况下,只要我们的消费者,在消费消息的时候没有抛出异常,那服务端MQ会认为,消息消费正常,删除队列中的消息;如果消费过程中,抛出了异常,消息会进行自动补偿,重会队列头部,再次被拉到消费者的缓冲区(prefetch count),进行重复消费。此时如果缓冲区的大小设置为1,那么整个队列就会被阻塞,unacked也会显示为1(单线程消费的情况下)。

  • acknowledge-mode: manual(手动应答模式)
    当设置为应手动应答时,我们需要在消费消息的时候手动告诉MQ我们消费的情况,否者MQ会一直等待消费端的消息,如果一直没有应答,当消费数量达到缓冲区大小(prefetch count)后,队列会全部阻塞。

  • channel.basicReject(deliveryTag, true)-------------拒绝deliveryTag(一个消费线程对应的一个消费ID,是自增的LONG类型)对应的消息,第二个参数是否requeue,true则重新入队列,否则丢弃或者进入死信队列。该方法reject后,该消费者还是会消费到该条被reject的消息。

  • channel.basicNack(deliveryTag, false, true)---------------不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue
    与basic.reject区别就是同时支持多个消息,可以nack该消费者先前接收未ack的所有消息。nack后的消息也会被自己消费到。

  • channel.basicRecover(true)------------是否恢复消息到队列,参数是是否requeue,true则重新入队列,并且尽可能的将之前recover的消息投递给其他消费者消费,而不是自己再次消费。false则消息会重新被投递给自己。

spring:rabbitmq:host: 121.40.65.123port: 5672username: rabbitpassword: rabbitlistener:type: simplesimple:prefetch: 3 #缓冲区大小,这是对于每个消费线程来说的,默认的值是250concurrency: 2 #消费的线程数,默认是1acknowledge-mode: manual #应答模式,默认的是auto

二、配置

配置类(简洁方法)(推荐)


package com.example.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQRouterConfig {public static final String QUEUE_HELLO              = "Queue@hello";public static final String QUEUE_HI                 = "Queue@hi";public static final String EXCHANGE_TOPIC_WELCOME   = "Exchange@topic.welcome";public static final String ROUTINGKEY_HELLOS        = "hello.#";@Autowiredprivate AmqpAdmin amqpAdmin;@Beanpublic Object initBindingTest() {amqpAdmin.declareExchange(new TopicExchange(EXCHANGE_TOPIC_WELCOME, true, false));amqpAdmin.declareQueue(new Queue(QUEUE_HI, true));amqpAdmin.declareQueue(new Queue(QUEUE_HELLO, true));amqpAdmin.declareBinding(new Binding(QUEUE_HELLO, Binding.DestinationType.QUEUE,EXCHANGE_TOPIC_WELCOME, ROUTINGKEY_HELLOS, null));return new Object();}
}

amqpAdmin.declareBinding

需要一个Binding对象作为参数

exchange:交换器名称
type:交换器类型。BuiltinExchangeType枚举类,有以下4中类型交换器:DIRECT(“direct”), FANOUT(“fanout”), TOPIC(“topic”), HEADERS(“headers”)
durable:设置是否持久化。true:持久化,false:非持久化。持久化可以将交换器存盘,在服务器重启时不会丢失相关消息。
autoDelete:设置是否自动删除。true:自动删除,false:不自动删除。自动删除的前提是至少有一个队列或交换器与这个交换器绑定,之后所有与这个交换器绑定的队列或交换器都与此交换器解绑。
internal:设置是否内置的。true:内置交换器,false:非内置交换器。内置交换器,客户端无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式。
arguments:其他一些结构化参数。如备份交换器:alternate-exchange、超时时间。示例配置超时时间方法:
Map<String, Object> params = new HashMap();
params.put(“x-message-ttl”, 2000);
amqpAdmin.declareBinding(new Binding(QUEUE_HELLO, Binding.DestinationType.QUEUE,
EXCHANGE_TOPIC_WELCOME, ROUTINGKEY_HELLOS, params));

三、遇到的问题及解决办法

  1. 消费顺序问题----------在生产上有个监控功能使用了消息队列,会先发送一条插入数据库的消息到监控系统,当业务成功完成后再发一条删除数据的消息到监控系统。
  2. 重复消费日志文件打爆------------
  3. 队列阻塞问题---------------

RabbitMq应答模式、配置简介、常见阻塞场景相关推荐

  1. RabbitMQ总结(一)--消息队列RabbitMQ应答模式(自动、手动)

    原文链接 消息队列RabbitMQ应答模式(自动.手动) 为了确保消息不会丢失,RabbitMQ支持消息应答.消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了.RabbitM ...

  2. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    为什么80%的码农都做不了架构师?>>>    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 问题导读: 1.zookeeper在kafka的作用是什么? 2. ...

  3. kafka入门:简介、使用场景、设计原理、主要配置及集群搭

    李克华 云计算高级群: 292870151 195907286 交流:Hadoop.NoSQL.分布式.lucene.solr.nutch  kafka入门:简介.使用场景.设计原理.主要配置及集群搭 ...

  4. 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

    文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...

  5. 淘宝店小蜜配置手册——自定义知识库的应答模式与测试

    上篇讲完了配置自定义问法的基本配置方法 现在讲讲自定义问法的应答模式 店小蜜中设定的自定义问法应答模式有两种: 一种是全自动模式(也就是纯粹由机器人接待), 此时会从知识库里选择匹配度最高的进行自动回 ...

  6. RabbitMQ的应答模式

    Message acknowledgment 应答模式              RabbitMQ支持生产者生产消息后发送到服务器,服务器把消息传递到消费者,消费者消费后告诉服务器,服务器删除列队. ...

  7. Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战

    本文源码地址 后端:https://gitee.com/youlaitech/youlai-mall/tree/v2.0.1 前端:https://gitee.com/youlaiorg/mall-a ...

  8. Apache Camel简介以及使用场景

    Apache Camel简介以及使用场景 我们要解决的问题以及解决方案 我们要解决的问题 EAI的常用解决方案 SOA架构模型 ESB企业服务总线 如何实现ESB 为什么使用Camel Camel可以 ...

  9. 从零开始搭建高可用RabbitMQ镜像模式集群

    文章目录 RabbitMQ集群模式搭建 准备工作 选取任意一个节点作为master节点, 进行文件同步, 我这里选择138作为master节点 组成集群 配置镜像队列(设置镜像队列策略) 集群配置参数 ...

最新文章

  1. 【iOS Tips】002-实现“简单单例模式”的几种方法?
  2. 阿里巴巴60万年薪抢毕业生 必须是公认技术牛人
  3. 数据集按类划分_大数据风控面试(五) 模型评估与优化
  4. redis启动没反应_Promethues如何针对Redis进行监控
  5. GitHub 多次宕机的罪魁祸首竟是 MySQL?
  6. 谷歌云端语音识别软件
  7. paip.hibernate save 失败的解决
  8. 坚果云android功能,Android
  9. 集成电路封测行业科普
  10. 9轴电子罗盘工作原理,校准与应用
  11. Sketch56.1汉化
  12. 微博三方登录账号注册
  13. hihocode——#1498 : Diligent Robots
  14. MySQL数据库如何改名
  15. 2021-03-31
  16. 蒲公英 · JELLY技术周刊 Vol.22: npm i react-router@6.0.0-beta.0
  17. Dracula PRO 零售版
  18. 哨向 Mika Lelush 2
  19. 机械臂操作运动传送带上的物体
  20. Python中的str()函数和repr()函数

热门文章

  1. 二本计算机学生的找工作经历
  2. 英超引入 AI 球探,寻找下一个足球巨星
  3. 卖网课的怎么引流?卖网课去哪个平台好?卖网课如何推广?
  4. AMD与Intel现在的情况20120906
  5. Revit剪贴板用法复制一样的楼层及构件一键剪切功能
  6. 算法导论习题—二叉搜索树、红黑树、区间树
  7. PDFjs提取文件中的图片
  8. RNN循环神经网络的自我理解:基于Tensorflow的简单句子使用(通俗理解RNN)
  9. 技术团队如何制定个人发展规划(IDP)
  10. 北美压铸协会推荐的填充时间