背景:前几天,同事告诉我DSR(内部一个数据处理应用)又挂了,这次的数据丢失特别严重,有25天的数据受到影响。这已经是上线来的第三次出问题了,如果再不认真处理,下次肯定还会有这种问题。
结合同事经常抱怨的事情和我自己的经验,数据处理程序里常见的坑点有:
1.程序升级、迁移等运维需求导致配置错误
2.程序自身的bug
3.外部依赖项的变更
4.部分内容缺少相应的测试环境,测试困难
对于第一点,比较好的方案是使用两套配置文件:开发和线上,基于maven的profile,可以很方便地做到这点,这样把配置的工作的将由程序来完成,可以减少人工出错,也便于开发和维护。同时,在修改完成配置后,需要去检查配置到底生效没有
对于第2个问题,我觉得既然bug无法彻底消除,那就要想办法降低它的伤害,并提高调试开发的工作效率。首先就是要把原始的数据记录下来,例如,从消息队列中读取的每条消息,都可以存起来,这样当程序没有正确保存数据时,还可以在修复完数据之后把这部分数据追加回去。其次是记录程序中发生的异常,并在关键逻辑节点上输出日志,这样调试找问题的时候就会非常简单。
第3个问题的话,就需要引入监控,外部依赖项的变更导致的各种异常,如输出数据的数量、外部接口的调用情况、异常的次数等,通过统计程序的运行情况,可以较快地发现,从而减少这个依赖项变化带来的破坏。
其他的经验还包括:
a.对于数据处理程序应该有至少两种运行模式:
1.定时运行的正常模式
2.补充数据时的批处理模式,最好允许在命令中输入参数,对于调试会比较方便
3.测试接口和验证特定数据的测试模式,可选
b.过早的优化是魔鬼。先弄清楚需求,搞清楚数据量、接口吞吐量等功能非功能性需求之后,再去考虑性能等问题,过早的优化只会让自己陷入泥潭
c.对程序的关键/重要依赖项和指标进行监控,出现问题里及早修复
以上就是这段时间主要碰到的问题和解决方式