广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何解决Rocketmq停机
  • 1470
分享到

如何解决Rocketmq停机

rocketmq 2022-10-19 10:10:14 1470人浏览 独家记忆
摘要

如何解决RocketMQ停机,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1时间追溯到2018年12月的某一天夜晚,那天我正准

如何解决RocketMQ停机,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1

时间追溯到2018年12月的某一天夜晚,那天我正准备上线一个需求完就回家,刚点下发布按钮,告警就响起,我擦,难道回不了家了?看着报错量只有一两个,断定只是偶发,稳住不要慌。

把剩下的机器发完,又出现了几个同样的错误,作为一名优(咸)秀(鱼)程序员,这种问题必须追查到底。

如何解决Rocketmq停机

2

娴熟地查询到报错日志

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed

看着异常信息,陷入了沉思

如何解决Rocketmq停机

表面上看报错是因为使用了已经关闭的数据源

数据源什么时候会关闭呢?只有进程被杀死的时候

莫非是应用关闭时不够平滑?发布时会先摘除流量的呀,应该不至于呀

天色已经很晚,漫无目的地拖动日志,疲惫地寻找新线索,突然报错日志中一个单词引入眼帘:「rocketMQ

精神抖擞,大概知道原因了,这应用中还有个兢兢业业的rocketmq  consumer一直在消费消息,在应用关闭时,外部流量被摘除了,但没人通知rocketmq consumer,于是它抛异常了。

如何解决Rocketmq停机

3

出于我对rocketmq不深刻甚至有点肤浅的理解,它的消费采用ack的方式,如果报错,消息稍后还会重试,不会丢消息,而且如果消费代码是幂等的,也不会有业务上的异常,总之这不重要,因为它也不是我写的代码。

瞅了一眼consumer的代码(这里就不贴代码了,反正贴了你也不会看),consumer注册了一个ShutdownHook,ShutdownHook里consumer执行了shutdown来优雅地退出,并且给这个shutdownThread设置了最高优先级,然而从实践看来,这个线程最高优先级并没有什么卵用。

而且从《ShutdownHook原理》这篇文章中也知道ShutdownHook是并发执行的,spring容器关闭也是一个ShutdownHook,他们之前没有先后顺序。

了解原因后,第一时间想到了类似dubbo摘流的方案,吭哧吭哧写了个优雅关闭rocketmq  cosnumer的接口,在应用关闭脚本的kill之前调用该接口,完美解决问题,赶紧下班回家,不然要猝死了。

4

夜里入睡,梦到老板让我把所有的系统都改造掉,吓得我一机灵。

于是第二天又重新思考这个问题,总觉得在应用里实现一个接口并在stop脚本中去调用是一件非常不优雅的事,更重要的是这也没法复制到其他项目,我又陷入了沉思。

既然是spring容器关闭时bean的销毁顺序导致的问题,那么能不能利用spring的depend-on把顺序理顺了?说干就干。

起初我遇到是这样的依赖关系:

如何解决Rocketmq停机

手把手在xml的每个bean中把depend-on关系都配上,似乎也起到了作用。

但当我打开第二个项目时,它的bean之间的依赖关系大致如下:

如何解决Rocketmq停机

好家伙,26个字母差点不够用,当时我的心情是这样的

所以我觉得以当前的速度,改造完所有项目可能都到9102年了。

5

又过了一段时间,在GitHub交友网站上突然看到了rocketmq官方实现的spring-boot-starter,于是点进去看了它的实现。好家伙,看完直呼666。

官方starter实现了spring的SmartLifecycle接口,它的start方法能在所有bean初始化完成后被调用,stop方法会在bean被销毁前调用,对rocketmq  consumer来说简直完美。

顺便还复习了一下spring容器的关闭,代码在AbstractApplicationContext的doClose方法,这里我总结成一幅图:

如何解决Rocketmq停机

通过上图能看到,销毁bean之前,有关闭lifecycle  bean和发送ContextClosedEvent两个动作,官方starter选择了实现LifeCycle接口的方式。

6

到这里我该给老板汇报去了,之所以rocketmq  consumer发布时不平滑是我们的使用姿势问题,虽然对业务没影响,但不优雅,解决方案有两个,老板你选吧:

  • 全都换成官方starter,依赖spring-boot,官方维护,改造成本很高,

  • 监听ContextClosedEvent来实现优雅关闭,这块可以封装一下,让业务方引入依赖即可

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网VUE频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何解决Rocketmq停机

本文链接: https://www.lsjlt.com/news/81585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决Rocketmq停机
    如何解决Rocketmq停机,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1时间追溯到2018年12月的某一天夜晚,那天我正准...
    99+
    2022-10-19
    rocketmq
  • win10开机停在鼠标黑屏如何解决
    本篇内容介绍了“win10开机停在鼠标黑屏如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win10开机停在鼠标解决方法:按下“win...
    99+
    2023-07-01
  • 如何解决SpringBoot整合RocketMQ遇到的问题
    本篇内容主要讲解“如何解决SpringBoot整合RocketMQ遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决SpringBoot整合RocketMQ遇到的问题”吧!应用场景...
    99+
    2023-06-20
  • 如何解决springboot集成rocketmq关于tag的坑
    这篇文章给大家分享的是有关如何解决springboot集成rocketmq关于tag的坑的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。新项目使用springboot的若依框架集成rocketmq,选择集成Rock...
    99+
    2023-06-20
  • windows停止工作如何解决
    当Windows停止工作时,您可以尝试以下方法来解决问题:1. 重新启动电脑:有时候只需简单地重新启动计算机即可解决问题。2. 更新...
    99+
    2023-10-20
    windows
  • android停止运行如何解决
    当Android应用程序停止运行时,可能有几种原因。以下是一些常见的解决方法:1. 重新启动设备:有时,设备可能出现问题导致应用程序...
    99+
    2023-08-23
    android
  • windows imazing停止工作如何解决
    这篇文章主要讲解了“windows imazing停止工作如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows imazing停止工作如何解决”吧!imazing停止工作解决...
    99+
    2023-07-01
  • win10账户被停用如何解决
    这篇文章主要讲解了“win10账户被停用如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win10账户被停用如何解决”吧!win10账户被停用解决方法首先在桌面找到此电脑,鼠标右键单击...
    99+
    2023-06-30
  • android被停止运行如何解决
    当Android应用程序被停止运行时,以下是一些可能的解决方案:1. 重新启动设备:有时候,重新启动设备可以解决一些应用程序停止运行...
    99+
    2023-08-19
    android
  • sql server停止服务如何解决
    要停止 SQL Server 服务,可以按照以下步骤进行操作:1. 打开 SQL Server Configuration Mana...
    99+
    2023-09-05
    sql server
  • 云主机windows停止工作怎么解决
    当云主机Windows停止工作时,可以尝试以下解决方法:1. 重启云主机:尝试通过控制台或虚拟化管理界面重启云主机,看是否能够恢复正...
    99+
    2023-09-13
    云主机 windows
  • 电脑风扇转一下就停开不了机如何解决
    这篇文章主要讲解了“电脑风扇转一下就停开不了机如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑风扇转一下就停开不了机如何解决”吧!电脑风扇转一下就停开不了机原因及解决方法:一、内存...
    99+
    2023-07-01
  • Win7系统 开机提示catalyst control center已停止如何解决
      Win7系统深受广大群众的喜爱,成为最受欢迎系统之一。即使在完美的系统在使用过程中难免遇到一些故障问题,最近有用户反馈每次开机的时候都会弹出一个catalyst control center:monitoring p...
    99+
    2023-06-13
    Win7系统 catalyst control center 系统 开机 Win7
  • win11屏幕狂闪不停如何解决
    本篇内容主要讲解“win11屏幕狂闪不停如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11屏幕狂闪不停如何解决”吧!方法一:首先我们按下键盘“win+r”打开运行,输入“servi...
    99+
    2023-07-01
  • 如何解决mysql老停止的问题
    这篇文章主要介绍了如何解决mysql老停止的问题,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql老停止的解决办法:首先把Windows服...
    99+
    2022-10-18
    mysql
  • android process已停止运行如何解决
    要解决Android进程停止运行的问题,可以尝试以下几种方法:1. 重新启动设备:有时候只需简单地重新启动设备,问题就能解决。2. ...
    99+
    2023-10-08
    android
  • win10开机停止鼠标黑屏解决方案
    许多朋友在启动win10系统计算机时停止在鼠标处的黑屏。今天,我将为您带来win10启动和停止鼠标黑屏的解决方案。如有必要,请学习win10启动和停止鼠标黑屏的解决方案。win10开机停止鼠标黑屏解决方案:通过按下win+alt+del组合...
    99+
    2023-07-13
  • 电脑开机蓝屏停机码0×0000002E的解决办法
    蓝屏停机码0×0000002E通常与内核模式堆栈溢出相关。以下是一些可能的解决办法:1. 检查硬件问题:蓝屏停机码0×0000002...
    99+
    2023-09-07
    电脑
  • 电脑屏幕闪烁不停如何解决
    本篇内容主要讲解“电脑屏幕闪烁不停如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“电脑屏幕闪烁不停如何解决”吧!方法一、检查刷新率设置鼠标右键单击系统桌面的空白区域,从弹出的右键菜单中单击...
    99+
    2023-06-27
  • win7电脑用户被停用如何解决
    这篇文章主要讲解了“win7电脑用户被停用如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7电脑用户被停用如何解决”吧!win7电脑用户被停用解决方法重启计算机,在开机界面出现后...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作