我为什么要搞出这个“超人”系统?
我这个人,特别信奉一句话:能让机器干的活儿,我绝不动手。以前年轻不懂事,觉得跑跑脚本,手动点点鼠标,那叫“人情味”。现在年纪大了,家庭和工作压在我身上,我发现以前的“人情味”简直就是给自己挖坑。
我手头同时跑着好几个项目,有长期的维护单子,也有短期的急活儿。最要命的是,客户付款方式五花八门,有支付宝、有银行转账,还有些用境外平台的。每个月月底,我老婆就坐在客厅里,手里拿着我的银行流水,像个审计师一样,把我问得焦头烂额:“这笔钱是哪个项目的?那笔尾款收了吗?这个月的收入到底多少?”我每次都要打开无数个后台,翻无数条记录,才能给她一个模棱两可的答案。这种状态,我受够了,这简直就是浪费我的生命。
我决定自己动手,彻底解决这个财务和进度追踪的烂摊子。这就是“超人”这个项目的由来。我最初的想法很粗暴,就想搞个东西,能自动帮我收割数据,整理数据,然后早上七点准时推给我一份简洁的报告。
从开始到第一个版本跑起来,我掉了一层皮
最初动手的时候,我抓了Python,因为觉得它爬虫方便。我找了几个开源库,东拼西凑,勉强拉起了一个简陋的框架。我用它去抓取客户平台的API数据,然后计算进度,再把所有数据扔进一个本地的MySQL数据库里存着。
这个最初的版本,我叫它“超人_V1.0”。它最大的问题是,我写得太随意了,根本没考虑维护性。
- 它跑得慢:数据量一开始小还行,后来项目一多,到月底跑报表的时候,能卡我半个小时。
- 它老出错:任何一个平台的API稍微一调整,我的爬虫立马报废。我得大半夜爬起来,翻日志,改正则,然后祈祷下次能正常运行。
- 数据校验乱七八糟:因为设计的时候没想清楚并发和数据完整性,经常出现数据重复或者丢失的情况,月底算账对不上,我老婆比我先发现问题。
那段时间,我不是在工作,就是在维护这个给自己添麻烦的系统。我记得有一次,我设定了定时任务,结果它自己偷偷地跑挂了,连续三天没给我发报告。我完全蒙在鼓里,直到一个客户发信息问我尾款怎么还没算清楚,我才发现系统停摆了。当时我气得差点把笔记本砸了,我做这个系统是为了省心,不是为了给自己找个祖宗供着。
最新版《超人_更新日志_最新》我改了什么?
经过那次事故,我痛定思痛,下定决心把整个底层推倒重写。我意识到,这种需要高可靠性、持续运行的服务,必须有专业的架构来支撑。我不再用以前那种脚本式思维了。
这回重构,我把目光投向了Go语言。为啥选Go?不是说它多牛逼,而是它编译出来的东西跑得稳,占资源少,特别适合这种后台跑任务的小系统。
我这回主要干了三件事:
第一件事:彻底分离调度和执行。我用Go写了一个独立的核心调度器,它只负责看时间、发命令、收结果。真正去爬数据、算账的模块,我做成了独立的微服务。这样,就算一个平台的爬虫挂了,也不会影响到整个系统的心跳。
第二件事:加入实时监控和告警。这是这回更新的核心。我花了大量时间,设置了心跳包检测。一旦有任何一个子模块超过预定时间没有发送“我还活着”的信号,系统立马触发短信和邮件告警给我。这样我不用等第二天早上,半夜系统出问题,我十分钟内就能收到通知,直接上去修。
第三件事:配置管理集中化。以前平台API变了,我要进代码里改参数。这回我把所有需要调整的参数全部扔进了一个独立的配置文件里。就算下次平台大改版,我只需要动动那个配置文件,重启一下服务,整个“超人”就能立刻适应新的环境,完全不用动代码。这大大降低了我的维护成本。
这个《超人_更新日志_最新》版本,从根本上改变了我的生活。
我现在每天早上七点半醒来,习惯性地看一眼手机收到的报告。收入、支出、项目进度、潜在风险,一目了然。我不需要再面对我老婆的灵魂拷问,因为她现在可以直接看系统推送给她的那份简洁报告,她比我还清楚我们赚了多少钱,进度到哪一步了。
前几天有个大客户突然要审计过去半年所有项目的费用明细。放在以前,我得花两天时间去翻箱倒柜找Excel和银行记录。我直接登录“超人”的后台,点了几下鼠标,所有的历史数据和报表,清晰、准确、按要求格式导出。整个过程只花了不到二十分钟。客户那边看完都惊了,说我这效率比他们公司财务部还高。
这就是我实践出来的成果。工具是为了让我们更像人,而不是更像机器。只有把机器该干的活儿彻底丢给它,我才能腾出时间来,去琢磨更值钱的事,或者,多睡一会儿。这个更新日志,记录的不是代码变动,记录的是我终于从维护地狱里爬出来的自由。