全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

mq消息积压中,突然mq挂了,或者mysql挂了,或者两个都挂了怎么处理?

发布时间:2023-10-13 09:58:27
发布人:xqq

一、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:什么是消息队列

消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。

#it技术干货

相关文章

大数据用什么数据库?

大数据用什么数据库?

2023-10-13
读写分离为什么能够提升性能?

读写分离为什么能够提升性能?

2023-10-13
分布式数据库是什么,有哪些优缺点?

分布式数据库是什么,有哪些优缺点?

2023-10-13
高性能计算与分布式数据库的区别?

高性能计算与分布式数据库的区别?

2023-10-13

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取