前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >运维经理:自动化解决批量作业运行异常的探索之路

运维经理:自动化解决批量作业运行异常的探索之路

作者头像
DevOps时代
发布2023-08-22 09:06:42
1890
发布2023-08-22 09:06:42
举报

作者简介

中国工商银行软件开发中心广州技术部

一、故事起源

小明是一家大型公司的运维支持经理,凌晨三点他收到了批量中断的报警信息,他不得不拖着疲惫的身体来到电脑前,点开报警信息,又是熟悉的数据库异常,他点了点鼠标,重新启动批量作业处理。经常需要半夜处理的批量中断使他感到非常沮丧,他想这种情况能否有所改变?

二、深入分析

开发的小伙伴决定提升自动化运维水平,当遇到批量中断时,系统能自动重新启动批量作业。当然,并非所有批量中断都可以自动重新启动的,例如粗心的开发人员写错了代码,重提也只能继续中断,甚至可能会引发重复入账等更严重的后果。一般只有环境抖动之类的问题,才适合自动重新启动批量作业。那么看看批量运行依赖的环境和资源以及可能发生的异常。

批量作业主要依赖的外部环境和资源有:批量运行框架、数据库、文件服务器、分布式消息,下表梳理了可能发生的异常及应对措施:

又对 MySQL 数据库的错误进行了细化分析,认为以下几个错误码可进行重提:

另外对数据库访问语句的 SocketTimeoutException 异常,也可进行重提,例如:

代码语言:javascript
复制
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 3,008 milliseconds ago.  The last packet sent 
successfully to the server was 3,006 milliseconds ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3556)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3897)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2503)
        at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1369)
        at Test.main(Test.java:36)
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101)
        at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144)
        at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174)
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3005)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3466)
        ... 8 more

三、解决之道

经过对异常的分析,开发的小伙伴要开始动手改造批量作业了。但是他们又遇到更棘手的问题。面对成千上万个批量作业,每个代码都要添加自动重提的功能,开发人员又得干几个通宵了。

还好,批量作业是由批量运行框架统一调度的,可以通过对批量运行框架进行改造,提供统一的作业重提机制。

批量运行框架分为批量控制器和批量执行器两个角色:批量控制器负责作业的调度,即根据控制器数据库中的作业排程信息,给执行器发送作业开始指令,并接收执行器的作业执行结果;批量执行器由应用开发,负责调用业务逻辑,且业务逻辑的实现基于同一个接口。

由此看出,要实现自动重新启动批量作业,涉及批量控制器和批量执行器的改造。

批量控制器支持重提的改造要点:

控制器新增支持执行器返回重提状态(原来只有成功、失败两种状态)。当控制器收到重提状态后,若作业已重提次数小于排程中定义的自动重提最大次数(防止无限次重试),则将作业状态设置为待重提状态,否则将作业置为失败状态。

环境抖动问题,一般是等待一段时间,环境恢复后再重试,因此控制器启动后台定时任务,每隔一定时间扫描作业,如果作业状态为待重提,则给批量执行器发送开始指令,并将作业状态更新为执行中。

批量执行器支持重提的改造要点:

执行器基于 Spring 开发,负责运行批量作业。每个批量作业是一个JAVA类,并且都是实现同一个接口。Spring 切面技术真是个好东西,可以减少对业务代码的侵入,也避免了每个批量作业程序进行修改。切面在 process 方法执行结束后进行加工处理,如果作业发生了异常,并判断该异常可以重提的话,则打印异常,并给框架返回重提状态。

四、圆满结局

批量运行异常自动重提的改造方案投入生产后,可以自动识别并快速处理异常的作业,降低对业务的影响,同时避免支持经理人工干预,减少人工出错的可能性。公司信息系统的自动化运维水平得到了极大的提升。

运维支持经理小明很少需要在半夜处理批量中断,良好的休息提升了工作效率,为公司创造更多价值。

近期好文:

到底要多 “牛X” 的网络,才能带得动 AIGC?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、故事起源
  • 二、深入分析
  • 三、解决之道
  • 四、圆满结局
  • 到底要多 “牛X” 的网络,才能带得动 AIGC?
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档