博客
关于我
最强整理!1307页字节跳动Java面试全套真题解析火了,最强技术实现
阅读量:393 次
发布时间:2019-03-05

本文共 1822 字,大约阅读时间需要 6 分钟。

RabbitMQ消息可靠性与高级功能解析

成为优秀的架构师通常是初级到中级工程师的阶段性目标。优秀的架构师往往具备七种核心能力:编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力。这些能力之间存在密切关联,其中编程能力、调试能力和编译部署能力是基础能力,而性能优化能力和业务架构能力则是关键能力。

在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式来控制消息的投递可靠性模式:confirm 确认模式和 return 退回模式。

Confirm 确认模式

当消息从 producer 发送到 exchange 时,会执行 confirmCallback 中的 confirm 方法。该方法返回包含以下信息的结果:交换机是否成功接收到消息(true 成功,false 失败),以及失败原因。

Return 退回模式

当消息发送给 exchange 后,exchange 将消息路由到 queue 失败时,会执行 returnCallback。返回的信息包括:消息对象、错误码、错误信息、交换机名称和路由键。

Consumer ACK(消费者 ACK)

ack 是 Acknowledge 的缩写,表示消费端收到消息后的确认方式。RabbitMQ 提供三种确认方式:

  • 自动确认:设置 acknowledge 为 "none"。消息一旦被 consumer 接收到,就会自动确认收到,并将相应的 message 从 RabbitMQ 的消息缓存中移除。

  • 手动确认:设置 acknowledge 为 "manual"。如果出现异常,调用 channel.basicNack() 方法,让 RabbitMQ 自动重新发送消息。

  • 根据异常情况确认:设置 acknowledge 为 "auto"。当消息处理过程中遇到异常时,会自动调用基本Nack 方法,重新发送消息。

  • 消息过期(TTL)

    TTL 是 Time To Live 的缩写,表示消息的存活时间。RabbitMQ 允许对消息和队列设置过期时间。消息过期后,会被自动清除。可以单独设置消息的 TTL,也可以设置整个队列的 TTL。消息过期可以让队列统一过期,也可以让单个消息过期。

    死信队列(DLX)

    死信队列,英文缩写为 DLX。Dead Letter Exchange(死信交换机)是指当消息成为 dead message 后,会被重新发送到另一个交换机(DLX)。死信队列的触发条件包括:

  • 队列消息长度达到限制。
  • 消费者拒接消费消息,并且不将消息重新放入原目标队列。
  • 原队列存在消息过期设置,消息未被消费而达到超时时间。
  • 死信队列和死信交换机与普通的队列和交换机没有任何区别。要实现队列与死信交换机的绑定,只需在队列配置中设置以下参数:

    • x-dead-letter-exchange:设置死信交换机名称。
    • x-dead-letter-routing-key:设置死信路由键。

    延迟队列

    延迟队列是一个强大的功能,但 RabbitMQ 本身并不提供延迟队列功能。可以通过将 TTL 和 DLX 组合使用来实现类似延迟队列的效果。例如,将消息设置为 TTL 后,如果消息未被消费,将其转发到 DLX 进行处理。

    消费端限流

    在系统峰值较高时,可以通过削峰填谷的方式使用 RabbitMQ 实现流量调节,使系统处理请求更加平稳。

    消息补偿机制

    尽管通过 confirm、ACK 以及死信队列等机制已经能够保证消息的高可用性和不丢失,但在复杂的生产环境中仍需额外考虑消息补偿机制。消息补偿机制需要建立在业务数据库和 MQ 数据库的基础之上。具体实现方式包括:

  • 在发送消息时,将消息同时保存到业务数据库和 MQ 数据库。
  • 通过业务数据库和 MQ 数据库的对比检查消费是否成功。
  • 如果消费未成功,进行消息补偿措施,重新发送消息并处理。
  • 这种机制可以确保在极端情况下也能保证消息的可靠性。

    一线互联网大厂Java核心面试题库

    本文仅展示部分内容,完整题库可在 我的博客 查看,包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件 MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等内容,持续更新中。

    你可能感兴趣的文章
    Oracle 如何处理CLOB字段
    查看>>
    oracle 学习
    查看>>
    oracle 定义双重循环例子
    查看>>
    ORACLE 客户端工具连接oracle 12504
    查看>>
    Oracle 客户端连接时报ORA-01019错误总结
    查看>>
    oracle 导出sql数据库表结构,使用sql developer 导出Oracle数据库中的表结构
    查看>>
    oracle 嵌套表 例子,Oracle之嵌套表(了解)
    查看>>
    Oracle 常用命令
    查看>>
    Oracle 常用的V$视图脚本(二)
    查看>>
    Oracle 并行原理与示例总结
    查看>>
    oracle 并集 时间_Oracle集合运算符 交集 并集 差集
    查看>>
    Oracle 序列sequence 开始于某个值(10)执行完nextval 发现查出的值比10还小的解释
    查看>>
    ORACLE 异常错误处理
    查看>>
    oracle 执行一条查询语句,把数据加载到页面或者前台发生的事情
    查看>>
    oracle 批量生成建同义词语句和付权语句
    查看>>
    oracle 抓包工具,shell 安装oracle和pfring(抓包) 及自动环境配置
    查看>>
    Oracle 拆分以逗号分隔的字符串为多行数据
    查看>>
    Oracle 排序中使用nulls first 或者nulls last 语法
    查看>>
    oracle 插入date日期类型的数据、插入从表中查出的数据,使用表中的默认数据
    查看>>
    Oracle 操作笔记
    查看>>