八股中间件

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. 那出现丢数据怎么解决呢?

仲裁集群

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

相关推荐
彭于晏Yan15 小时前
MQTT消息服务
spring boot·后端·中间件
Nandeska19 小时前
1、RocketMQ核心概念详解
中间件·rocketmq
Tezign_space1 天前
Context System vs. API网关与中间件:重新定义AI时代的“连接”逻辑
中间件·agentic ai·gea·主动规划·企业级智能体·proactive agent
Volunteer Technology2 天前
中间件场景题归纳
中间件·面试·架构
攒了一袋星辰2 天前
SequenceGenerator高并发有序顺序号生成中间件 - 架构设计文档
java·后端·spring·中间件·架构·kafka·maven
天微微蓝sunny2 天前
Linux 磁盘与文件 I/O 深度笔记
中间件·存储
勇往直前plus2 天前
大模型开发手记(九):LangChain Agent 中间件-提升Agent的可靠性与可控性
中间件·langchain
Volunteer Technology2 天前
中间件场景题归纳(二)
中间件
隔壁小邓3 天前
数据库中间件全景解析:从连接管理到分布式协同
数据库·分布式·中间件