mq消息积压中,突然mq挂了,或者mysql挂了,或者两个都挂了怎么处理?
一、mq消息积压中,mq挂了的处理方法
如果MQ挂掉,势必会影响发消息的逻辑,MQ不像数据库,挂了就没办法进行任何操作了。MQ本身就是用于多系统解耦,异步处理等场景的,就算MQ挂了,也不会影响到主流程,所以这其实就相当于是一个降级的处理。
1、降级处理,数据存储
降级可以有两种方式,一种是将要发送的消息存储到数据库中,另一种就是直接写本地磁盘。
写数据库:写数据库相对来说比较简单,本身程序中都会用到数据库,这个时候只需要单独加一张表即可。当消息发送异常的时候,将消息进行存储。写磁盘:写磁盘跟数据库的作用是一样,写磁盘相对来说更加独立,不依赖数据库。不好的点在于写磁盘还得考虑写入的格式,比如消息量大要不要分多个文件写入之类的问题,整体需要考虑的点比数据库要多。写日志:写日志可能是最简单的方式了,但是在后期消息补发的时候就需要人工介入,将失败的消息捞出来然后重新发送。2、重发消息
可以单独起一个定时任务,周期性的去将这些失败存储的消息进行重发,如果你的MQ服务故障后几分钟就恢复了,那么重试的时候消息就能够成功发出去了。也可以人工处理,最重要的是当MQ故障的时候,消息发送不出去,这些消息要存储起来,不能丢失,这才是重点。
完整流程如下:
集群环境下,MQ全部挂掉的概率非常低,某个挂掉的话,大部分成熟框架都有相应的处理策略。
二、mq消息积压中,mysql挂了的处理方法
当 MySQL 挂掉时,消息队列(MQ)还在运行,如果这时 MQ 中的消息积压严重,可能会出现因为 MQ 发送消息导致 MySQL 崩溃的情况。这时候需要采用以下方法来处理:
1、停止 MQ 的消息发送服务
停止 MQ 的消息发送服务,避免继续向 MySQL 中写入数据,直到 MySQL 恢复运行。
2、处理消息
对于已经发送成功但尚未被消费的消息,可以考虑将其存储到本地文件或 Redis 等缓存中,等待 MySQL 恢复后再进行数据同步操作。对于正在发送的消息,可以将其暂时存储到临时队列(如 RabbitMQ 的 Dead Letter Exchange),等待 MySQL 恢复后再重新发送到正式队列。3、检查数据库表的状态
在 MQ 重新启动之前,需要检查数据库表的状态,并对一些不一致的数据进行修复。例如,可以从本地文件或者 Redis 缓存中读取数据并同步到 MySQL 数据库中。
三、mq消息积压中,mq和mysql都挂了的处理方法
当消息队列(MQ)和 MySQL 都出现故障时,可能会导致业务系统不能正常运行、数据丢失甚至损坏,这时候需要采用一些应急措施来处理:
1、启动备份 MQ 和 MySQL
在系统正式运行之前,需要配置好备份 MQ 和 MySQL,当发生故障时,可以快速切换到备份服务器上,保证业务的连续性。
2、使用分布式事务机制
在应用程序中引入分布式事务机制,对应用程序的操作进行封装,保证 MQ 和 MySQL 数据库事务的一致性,防止数据的丢失或损坏。
3、采取数据恢复措施
如果 MQ 和 MySQL 同时出现故障,需要优先恢复 MySQL 数据库。可以使用数据库备份和恢复工具来恢复数据,最大程度上避免数据的丢失和损坏。
4、进行容灾演练
定期进行容灾演练,验证备份 MQ 和 MySQL 的可用性、数据的一致性以及故障恢复的时间,优化容灾方案,提高系统的容错能力和可靠性。
四、MQ 消息积压处理
消费端出了问题,导致消息队列消息积压了很多或者集群的磁盘都快写满了。
解决思路有两个:
MQ动态扩容,将MQ容量增大,让其能容纳更多的消息消费端加大消费能力,迅速处理掉积压。1、名列前茅个例子
如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概1小时的时间才能恢复过来。一般这个时候,只能操作临时紧急扩容了,具体操作步骤和思路如下:
先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都停掉新建一个较好ic,partition是原来的10倍,临时建立好原先10倍或者20倍的queue数量然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍数量的queue接着临时征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的数据这种做法相当于是临时将queue资源和consumer资源扩大10倍,以正常的10倍速度来消费数据等快速消费完积压数据之后,得恢复原先部署架构,重新用原先的consumer机器来消费消息2、第二个例子
由于长期积压,导致消息的过期时间快到了。不过生产环境一般很少会设置消息过期。rabbitmq是可以设置过期时间的,就是TTL,如果消息在queue中积压超过一定的时间就会被rabbitmq给清理掉,这个数据就没了。这时可以让这批数据先过期,后面再去补。等过了高峰期以后,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入mq里面去,把白天丢的数据补回来。
延伸阅读1:什么是消息队列
消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。
猜你喜欢LIKE
相关推荐HOT
更多>>siri的工作原理是怎样的?
Siri是苹果公司开发的一种智能个人助手,通过语音识别和自然语言处理技术,可以帮助用户完成各种任务,如发送消息、预定餐厅、调整日程等。那么...详情>>
2023-10-16 22:16:20Go的golang.org/x/系列包和标准库包有什么区别?
1、来源和维护不同golang.org/x/系列包:这个系列的包也被称为”Go扩展库”,是由Go团队和社区共同维护的。这些包并不包含在Go的发行版中,但是...详情>>
2023-10-16 21:03:28行动召唤(Call to Action)的基本设计原则是什么?
行动召唤,或者更常见的英文缩写CTA(Call to Action),是一种强制性的设计元素,旨在引导用户进行特定的行为。这些行为可能包括购买产品、注...详情>>
2023-10-16 19:31:00系统类型中的标准、VHD和VHDX是什?
系统类型中的标准、VHD和VHDX是什么系统类型中的标准、VHD和VHDX是指计算机系统中的不同类型和格式。标准系统类型是指常见的操作系统,如Window...详情>>
2023-10-16 18:39:06热门推荐
时间序列和回归分析有什么本质区别?
沸什么是敏捷开发之Scrum框架?
热Tornado的核心是什么?
热XP(极限编程)有哪些缺点?
新siri的工作原理是怎样的?
机器学习算法中GBDT 和XGBOOST 的区别有哪些?
Go的golang.org/x/系列包和标准库包有什么区别?
无线AP和无线路由器有什么区别?
C语言“悬空指针”和“野指针”是什么意思?
行动召唤(Call to Action)的基本设计原则是什么?
Access 与Excel 最重要的区别是什么?
系统类型中的标准、VHD和VHDX是什?
COOKIE和SESSION有什么区别?
为什么说Java不适合编写桌面应用?