本文涉及:投递失败的消息怎么处理、如何实现延时队列、如何指定消息的优先级、消息的持久化是如何实现的、如何保证消息不丢失

投递失败的消息怎么处理

首先投递失败存在如下两个情况

  • 当交换器无法根据自身的类型和路由键找到符合条件的队列
  • 如果交换器在将消息路由到队列时发现队列上并不存在任何消费者

    解决方案:

    在生产者投递消息时指定mandatory或者imrnediate参数设为 true 时,RabbitMQ 会把无法投递的消息通过Basic.Return 命令将消息返回给生产者,此时生产者需要调用channel.addReturnListener 来添加 ReturnListener 监昕器实现监听投递失败的消息

如果设置了上方两个参数就要添加ReturnListener 逻辑,使生产者的逻辑变得复杂,RabbitMQ中的备份交换机也可以处理这个问题

以通过在声明交换器(调用 channel.exchangeDeclare 方法)的时候添加alternate-exchange 参数来实现

对于备份交换器,使用时包含几种特殊情况:

如果设置的备份交换器不存在,客户端和 RabbitMQ 服务端都不会有异常出现,此时消息会丢失

如果备份交换器没有绑定任何队列,客户端和 RabbitMQ 服务端都不会有异常出现,此时消息会丢失

如果备份交换器没有任何匹配的队列,客户端和 RabbitMQ 服务端都不会有异常出现,此时消息会丢失

如果备份交换器和 mandatory 参数一起使用,那么 mandatory 参数无效

如何设置消息的过期时间

设置队列属性,队列中所有消息都有相同的过期时间

对消息本身进行单独设置,每条消息的 TTL 可以不同

如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准

如何实现延时队列
  • 使用死信交换机

    消息投递到一个没有消费者的队列中,为这个队列指定死信队列,当消息达到设置过期时间还没有被消费时将会被发布到死信队列中,而消费者订阅死信队列直接消费到了一份延时消息

延时消息插件

从以下地址下载延时插件rabbitmq_delayed_message_exchange

1
https://www.rabbitmq.com/community-plugins.html

把下载好的插件放到以下目录

1
/usr/lib/rabbitmq/lib/rabbitmq_server3.6.4/plugins

启动插件

1
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

声明交换器类型为x-delayed-message来标示此交换机为延时交换机

发送消息时在header中添加”x-delay”参数来控制消息的延时时间

如何指定消息的优先级

设置队列的 max priority 参数,RabbitMQ中消息的优先级默认是0,最大值是10

消息的持久化是如何实现的

RabbitMQ的持久化分为:交换器的持久化、队列的持久化和消息的持久化

交换器和队列的持久化都是通过在声明时将 durable 参数置为 true 实现的

消息的持久化是在发送消息指定deliveryMode为2实现的

如何保证消息不丢失

生产者开启事务或者发送方确认机制,交换机、队列和消息全部设置持久化,消费者开启消费确认机制

RabbitMQ高级面试题的更多相关文章

  1. Java高级面试题解析(一)

    最近,在看一些java高级面试题,我发现我在认真研究一个面试题的时候,我自己的收获是很大的,我们在看看面试题的时候,不仅仅要看这个问题本身,还要看这个问题的衍生问题,一个问题有些时候可能是一个问题群( ...

  2. php高级面试题知识点(转载)

    php高级面试题知识点大全 时间:2016-01-26 06:36:22来源:网络 导读:php高级面试题知识点大全,本套面试题内容包括php魔术方法.php单点登录.linux基本命令.前端开发技术 ...

  3. 2019-11-19-C#-高级面试题

    title author date CreateTime categories C# 高级面试题 lindexi 2019-11-19 08:40:50 +0800 2018-11-12 11:18: ...

  4. 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

    RabbitMQ 面试题 1.什么是 rabbitmq 2.为什么要使用 rabbitmq 3.使用 rabbitmq 的场景 4.如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费 ...

  5. 【面试突击】-RabbitMQ常见面试题(一)

    rabbit面试题1.什么是rabbitmq采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2.为什么要使用rabbitmq1.在分 ...

  6. rabbitmq高级消息队列

    rabbitmq使用 什么是消息队列 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以很复杂,可以包含嵌入对象. 消息队列是一种应用间的通信方式,消息发送后 ...

  7. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitMQ(一)已经入门RabbitMQ,本文介绍Rabb ...

  8. Java 高级面试题收集

    Java概念题 拆箱装箱的原理 自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类 ...

  9. RabbitMQ高级之如何保证消息可靠性?

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第四弹. RabbitMQ我已经写了三篇了,基础的收发消息和基础的概念我都已经写了,学任何东西都是这样,先 ...

随机推荐

  1. [原创]python+beautifulsoup爬取整个网站的仓库列表与仓库详情

    from bs4 import BeautifulSoup import requests import os def getdepotdetailcontent(title,url):#爬取每个仓库 ...

  2. Appium基础:Desired Capabilities详讲

    Desired Capabilities在启动session的时候是必须提供的,先看如下代码: Desired Capabilities本质上是key value的对象,他告诉appium serve ...

  3. 桌面图标管理工具-Rolan(网上收集,仅供学习与研究,支持正版)

    Rolan 是一个轻量级启动器,“你可以通过将文件拖到软件窗口中,然后通过像 QQ 一样的吸附或者键盘热键随时呼出,点击图标即可启动,使用起来非常方便快捷! 官网:https://getrolan.c ...

  4. Excel-基本操作

    一.EXCEL的数据类型 1.字符型 2.数值型 3.日期型数据和时间型数据 二.快捷键 ctrl+上下左右健 快速选择某区域  上下左右单元格 ctrl+shift+上下左右 快速选择某个取悦 三. ...

  5. 第四章、Go-面向“对象”

    4.1.结构体和方法 (1)go语言的面向对象 go仅支持封装,不支持继承和多态 go语言没有class,只有struct (2)struct的创建 package main import " ...

  6. P3273 【[SCOI2011]棘手的操作】

    此题用可并堆勉强过,需加输入优化,但是这里有个问题就是set总是过不了一组数据,用multiset时间有点高,不懂这个问题,请懂此问题的给我留言. 左偏树+并查集 下面上代码: #include &l ...

  7. subprocess实用手册

    背景 python执行操作系统的命令,如python执行shell命令 subprocess模块主要用于创建子进程,并连接它们的输入.输出和错误管道,获取它们的返回状态.通俗地说就是通过这个模块,你可 ...

  8. mysql Duplicate entry '9223372036854775807' for key 'PRIMARY'

    mysql插入数据报错提示: ERROR 1062(23000) Duplicate entry  '9223372036854775807' for key 'PRIMARY' 发现问题果断 直接 ...

  9. [BAT脚本] 1、BAT脚本FOR循环操作文件和命令返回实例

    Wednesday, 31. October 2018 08:18PM - beautifulzzzz 一.需求 需要在windows上实现一个bat脚本解析json,将json转换为自己想要的key ...

  10. Jenkins Pipeline 参数详解

    Pipeline 是什么 Jenkins Pipeline 实际上是基于 Groovy 实现的 CI/CD 领域特定语言(DSL),主要分为两类,一类叫做 Declarative Pipeline,一 ...