八股中间件

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

仲裁集群

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

相关推荐
Meme Buoy11 小时前
13.6其他架构评估方法-中间件
中间件·架构
我是李龙1 天前
第二十六章 全链路监控体系: 服务器资源、中间件状态与业务指标的可视化大屏开发
中间件
别抢我的锅包肉2 天前
FastAPI + Vue3 + Vite 跨域报错全解:从 `Access-Control-Allow-Origin missing` 到彻底修复
中间件·状态模式·fastapi
爱吃烤鸡翅的酸菜鱼2 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
my_styles2 天前
linux系统下安装 tengine / 宝兰德等国产信创中间件和闭坑
linux·运维·服务器·spring boot·nginx·中间件
ZHENGZJM2 天前
Gin 鉴权中间件设计与实现
中间件·gin
开心码农1号3 天前
mq是什么,常用mq的使用场景有哪些?
中间件·rabbitmq
斌味代码3 天前
Next.js 14 App Router 完全指南:服务端组件、流式渲染与中间件实战
开发语言·javascript·中间件
fantasy5_56 天前
从零手写线程池:把多线程、锁、同步、日志讲透
开发语言·c++·中间件
heimeiyingwang7 天前
【架构实战】海量数据存储:分库分表中间件实战
中间件·架构