八股中间件

ps:中间件蛮多的,但是这里注意走RabbtMQ把

RabbitMQ如何保证消息不丢失?

信息的保证性

生产者 开启生产者确认机制,到达队列返回ack

队列 交换机 开启持久化功能

消费者

开启消费者确认机制,开启消费者重试机制

RabbitMQ重复

服务发送信息,然后宕机重启。

服务在发送信息,幂等性

  • 通过业务唯一标识检查数据库中数据是否存在,若不存在则处理消息,若存在则忽略,避免重复消费。

主要是要思考到这个问题,要么给Redis记录库,要么自己想办法想想怎么解决

  • 使用Redis分布式锁或数据库锁来确保操作的幂等性。

  • 以 RabbitMQ + Redis 分布式锁为例,完整流程如下(新手友好版): 生成唯一锁标识:用消息的唯一 ID(如消息的message_id或业务唯一标识,比如订单 ID)作为 Redis 锁的key; 抢占分布式锁:消费者拿到消息后,先尝试向 Redis 写入这个锁(带过期时间,防止死锁); 判断锁是否获取成功: 成功:执行业务逻辑,执行完成后手动确认消息(RabbitMQ 建议用手动确认模式); 失败:说明已有其他消费者在处理这条消息,直接放弃处理,不确认消息(或直接忽略); 释放锁:业务执行完成后,主动删除 Redis 中的锁(需保证原子性,避免误删其他锁)

  • 加锁不可靠,无法解决宕机的问题

死信队列

延迟队列:进入队列的消息会被延迟消费的队列 场景:超时订单、限时优惠、定时发布

TTL,也就是Time-To-Live。如果一个队列中的消息TTL结束仍未消费,则会变为死信,ttl超时分为两种情况: 消息所在的队列设置了存活时间 消息本身设置了存活时间

延迟队列

DelayExchange插件,需要安装在RabbitMQ中 RabbitMQ有一个官方的插件社区,地址为:https://www.rabbitmq.com/community-plugins.html

  • 另一种方法是安装RabbitMQ的死信插件,简化配置,在声明交换机时指定为死信交换机,并设置消息超时时间。
100W消息堆积MQ

1.提供消费者能力,采取多线程或加机器

2.惰性消息,磁盘保存

3.增加消费者数量,采用工作队列模式,让多个消费者并行消费同一队列。

工作队列:通过多个消费者并发消费同一个队列,提高消息处理速度,缓解消费瓶颈。

惰性队列:将消息直接存储在磁盘上,仅在消费时加载,适用于海量消息堆积场景,降低内存压力

RabbitMQ高可用

普通集群
镜像集群

可能主节点宕机,未同步,暑假丢失

  1. 那出现丢数据怎么解决呢?

仲裁集群

只需要指定是仲裁队列即可-

相关推荐
阿昌喜欢吃黄桃3 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙4 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-4 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH2312115 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会5 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了6 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路6 天前
消息中间件
中间件
都说名字长不会被发现6 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室7 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆7 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express