通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

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

mq消息积压中,mq挂了的处理方法:1、降级处理,数据存储;2、重发消息。mysql挂了的处理方法:1、停止 MQ 的消息发送服务;2、处理消息;3、检查数据库表的状态。两个都挂了的处理方法:1、启动备份 MQ 和 MySQL;2、使用分布式事务机制等。

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

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

相关文章