千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > mq消息积压中,突然mq挂了,或者mysql挂了,或者两个都挂了怎么处理?

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

来源:千锋教育
发布人:xqq
时间: 2023-10-13 09:58:27 1697162307

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

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

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT