博客
关于我
最强整理!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等等内容,持续更新中。

    你可能感兴趣的文章
    Nacos集群搭建
    查看>>
    nacos集群搭建
    查看>>
    Navicat for MySQL 查看BLOB字段内容
    查看>>
    Neo4j电影关系图Cypher
    查看>>
    Neo4j的安装与使用
    查看>>
    Neo4j(2):环境搭建
    查看>>
    Neo私链
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    Netty WebSocket客户端
    查看>>