了解MQ

简介: 消息堆积处理核心在于平衡生产与消费速度,可通过限流生产、优化消费者处理能力及异步机制缓解。RabbitMQ通过持久化、确认机制保障消息可靠性,MQTT则依赖QoS等级确保传输。延迟消息常用死信队列实现,而幂等性可通过唯一ID避免重复消费。MQ广泛用于异步处理、系统解耦及分布式事务等场景。

消息堆积如何处理

本质上就是生产者速度大于消费者速度

生产者:限制生产者发送速率

broker:优先核心业务处理,降级处理 惰性队列(针对更多是消息持久化(记录在磁盘)的时候 ,按需从内存中加载,不是直接都加载到内存中)

消费者:消费者数量,提高消费者处理能力、多线程

异步

RabbitMQ消息的可靠性与MQTT消息可靠性

RabbitMQ

生产者确认机制:publish-confirm、publish-return确保消息一定到MQ

消息持久化:借助于springAMQP声明的交换机、队列、消息默认都是持久化,或者在浏览器界面化创建的时候,勾选Durable参数,也可以默认持久化

消费者确认+重试机制:当指定队列失败次数达到上限之后,可以将消息投递给死信队列,然后人工处理

死信队列绑定交换机的key不一定要与工作队列绑定交换机的key一样(工作队列->交换机->死信队列)

生产者:重试,确认机制

broker(交换机、队列):持久化

消费者:ack确认机制

生产者确认机制:

找不到交换机:publish-confirm 返回 nack

找不到队列 : publish -confirm 返回 ack publish-return 返回异常信息

没有问题:publish-confirm 返回 ack

消费者重试:默认情况下,如果一直消费不成功,消息会不断requeue(重入队)到队列,然后再重新获取 ,因此加了一个重试机制

重试机制:实现RepublishMessageRecoverer,将失败消息投递到固定的交换机,通过交换机将消息转发到失败消息队列,程序监听失败消息队列,接收到失败消息,将失败消息存入失败消息表,通过定时任务进行处理。

持久化三要素:协同工作保障消息可靠性

组件

作用

持久化设置

注意事项

交换机持久化

确保交换机在 RabbitMQ 重启后仍然存在

durable = true

(声明交换机时)

非持久化交换机会在重启后丢失

队列持久化

确保队列在 RabbitMQ 重启后仍然存在

durable = true

(声明队列时)

非持久化队列会在重启后丢失

消息持久化

确保消息内容在 RabbitMQ 重启后仍然可用

delivery_mode = 2

(发送消息时)

即使队列持久化,消息本身也必须标记为持久化

MQTT

  1. QoS 0(最多一次)
  • 用于无关紧要的数据(如周期性温度上报,丢包不影响业务)。
  1. QoS 1(至少一次)
  • 90% 的推荐场景(如设备状态更新),配合业务幂等性成本最低。
  1. QoS 2(恰好一次)
  • 仅用于强一致性需求(如订单状态变更),注意性能损耗。

延迟消息实现(针对的是订单超时自动取消)

方案以:死信队列+ttl(消息设置存活时间,时间一到就可以进行投递到死信队列,进行专门消费者执行)

方案二:延迟队列

对于时间的设置要选择,比如30分钟取消,可以设置延迟时间35min(避免卡点行为)

如何保证MQ幂等性?或 如何防止消息重复消费?

设置消息唯一ID、或者根据消息状态判断


MQ有什么应用场景?

异步处理、系统解耦、流量削峰、日志收集与分析(ELK架构)、分布式事务最终一致性、延迟消息与定时任务

RabbitMQ 的工作模型有哪些?

  1. 工作队列模型

消费者直接绑定到队列上。

一个队列可以绑定一个或多个消费者,多个消费者绑定到一个队列会共同消费队列中的消息,提高消费能力避免消息堆积。

2.发布订阅模型

发布订阅模型可以实现一条消息发给多个队列,每个队列绑定到同一个交换机,最终实现了向多个消费者发送一条消息,这种模式称为“发布/订阅”模型。

发布订阅模型中通过交换机有不同的类型,完成将消息推送到队列:

Fanout:广播类型,将消息交给所有绑定到交换机的队列。采用轮询的方式一次只能由一个消费者消费消息(默认状态)

Direct:直接类型,基于RoutingKey(路由key)发送给订阅了消息的队列

Topic:通配符类型(主题类型),与Direct类似,只不过RoutingKey可以使用通配符 对应的# (通配hash->匹配零个或多个单词)和*(通配符->仅匹配一个单词


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
1月前
|
消息中间件 安全 Android开发
抖音私信脚本怎么制作,用autojs?
AutoJS通过Android无障碍服务模拟用户操作,其抖音私信脚本主要依赖三大技术模块: 控件定位层
|
1月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
2月前
|
机器学习/深度学习 JSON 监控
如何通过API技术提升电商客户忠诚度:构建智能化客户关系引擎
在电商竞争激烈的当下,客户忠诚度成为核心壁垒。通过API技术构建智能化客户关系系统,整合全渠道数据,实现个性化推荐与自动化运营,提升用户黏性与复购率。结合实时行为分析、差异化定价、积分系统等手段,打造高效忠诚度管理体系,助力企业实现长期增长。
59 1
|
1月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
75 6
|
1月前
|
消息中间件 存储 安全
初始kafka
Kafka因高吞吐量被广泛使用,适合处理大量用户行为数据,支持实时推荐和数据展示。其优势包括提升响应速度、故障隔离、低耦合、流量削峰等。但也有架构复杂、依赖Broker等缺点。为避免消息丢失,可通过同步/异步发送、重试机制、设置ACK确认级别、副本机制及手动提交offset等方式保障消息可靠性。
|
1月前
|
Java Nacos Sentinel
了解微服务
本文对比了微服务与单体架构的优缺点,指出单体架构适合小规模系统,开发部署简单,而微服务适合复杂系统,具备良好的扩展性和灵活性。同时介绍了Spring Cloud相关组件如Nacos、OpenFeign、Sentinel的原理与应用,以及微服务中的熔断、降级、限流机制和AT模式的工作原理。
|
1月前
|
SQL Java 数据库连接
了MyBatis的多个核心功能实现方式
本文介绍了MyBatis的多个核心功能实现方式,包括:如何获取生成的主键、实体类属性与表字段名不一致时的处理方法、多表查询的实现方式(使用`association`和`collection`标签)、延迟加载的支持情况、批量插入的实现方式及主键返回问题。内容实用,适合MyBatis开发者参考。

热门文章

最新文章