八股中间件

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

仲裁集群

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

相关推荐
许彰午2 天前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
亿牛云爬虫专家2 天前
Go爬虫进阶:如何优雅地在Colly框架中实现无缝代理切换?
爬虫·中间件·golang·爬虫代理·colly框架·代理切换·api提取
SuperherRo3 天前
服务攻防-中间件安全&Apache&Tomcat&Jetty&Weblogic&AJP协议&反序列化&CVE漏洞
中间件·tomcat·apache·jetty·weblogic
空中海3 天前
第四篇:进阶篇 — 缓存、消息队列、安全与常用中间件
安全·缓存·中间件
逍遥德3 天前
MQTT教程详解-03. 高级知识点
java·物联网·中间件·信息与通信·iot·iotdb
前端小超人rui4 天前
【Node.js Express中间件理解及中间件分类和作用】
中间件·node.js·express
前端小超人rui4 天前
封装Express 自定义中间件
中间件·node.js·express
weixin_419658314 天前
RabbitMQ 应用问题
java·分布式·中间件·rabbitmq
z小天才b4 天前
Django ORM、中间件与信号 — 完全指南
python·中间件·django
fuquxiaoguang4 天前
金蝶天燕AMDC:当企业级缓存遇见Redis 8.2,国产中间件的“性能+易用”双飞跃
redis·缓存·中间件