本来 19 年 7 月写的,结果一拖再拖,拖了半年。以后还是按年份写吧。
这篇写 2018-07 至 2019-12 的事情。
公司、部门
19 年 1 月,我在年会上拿到了公司级别的优秀员工。
这一段时间内,特别是半年内,人员变动非常大:
18 年 8 月,来了个新同事,后来被孙总称为小可爱。
19 年 4 月底,飞哥离职。少了个强力战友。
19 年 8 月,原组内女同事 4/5
19 年 9 月,产品经理离职。从此木有霸气的产品经理了。原组内女同事 3/5
19 年 10 月,原组内女同事 2/5
19 年 12 月,原组内女同事 1/5
产品经理换了三个,现在处于没有产品经理的状态。
人员是越来越少了,喜提 N+1 的也没几个。拿到 N+1 的各个开心得不得了(羡慕)。
部门每个离职的同事都会请一顿下午茶。外加最近部门几个关系好的小伙伴会比较经常地出去聚餐,以前一季度一次(称为季度总结),现在一个月最少一次。以至于我胖了 6 斤。
项目
分两个时期来写:维护和开发旧系统;设计和开发新系统(重写旧系统)。
旧系统就是 18 年那篇的 A 项目,拥有十年以上的历史。
为了方便,以下在必要时会将旧系统称为 V1,新系统称为 V2。
维护和开发旧系统(18-07 ~ 18-12)
这个时期的压力还算不是很大,没有什么任务是非常赶时间的。大部分都在八点半左右就下班回去了(此时的加班标准是达到八点半)。时间点跟宿舍换到离公司很远有关系,在生活篇中有提到。
比较可以一提的有:
写了套简易的异步任务管理器(18-10)
V1 原先是这样的:发送一个任务给外部系统,然后流程流转到下一步执行检测。如果任务还没完成,就报错,然后每隔 1 分钟尝试一次,直到任务结束。
但是后来碰到一个要发送的任务是在发送任务后,我们会得到一个发送成功的消息。等任务结束,对方会回调我们这边的接口。如果对方超时了,我方提示超时错误。
于是结合 crontab 写了个处理,当对方调用我方接口后,才让流程执行检测步骤。业务上可容忍一分钟的延迟,所以不需要太复杂的组件。引入服务容器(18-11)
原先创建一个类是直接 new 或者使用 get/set 注入,而在 11 月的时候我把 Laravel 的 Container 库引入进来。使用服务容器获取服务对象。以便于测试。优化了个冗长且经常改动的 if-else(18-11)
这是一个根据多个条件判断选取哪些数据的 if-else,它直接嵌在某个业务代码里面,其他地方无法使用。
开早会的时候经常看到需求方又提了个添加条件的需求。于是我请求组长给我点时间把它优化成需求方可以自主配置的形式。
原先需求方提需求的时候,会发一个 Excel 过来,然后把变更点用特殊颜色标记。这个形式就不做变化了。在云云小姐姐的帮助下,与需求方共同确定了数据格式。
我做了个读取 Excel 并转换为 Json 文本的转换器,在需要数据的时候读取 Json 判断。用户上传 Excel 后,会得到新旧的数据差异,确保没有问题。
其实做成界面直接配置更好,然而我们这边没有专门的前端,我也不太想花时间在前端上(Vue 除外)。
设计和开发新系统(19-01 ~ 19-12)
|
|
耗时一个月写 Camunda 的 Adapter,使得它能够满足当前业务的需要。
疑问:
GraphQL 什么时候引入?
RPC Shell Wrapper 什么时候重写?
文档什么时候写?
将 V2 的东西搬到 V1
日志
难度不大,收益明显。不太值得一提,仅作为记录。
V1 的场景:V1 经常会有问题,后台有经常查当天日志的需求。
我们在内部交流工具里有创建一个服务号,项目内的四五个成员一人一天轮流值班。
查业务日志的做法已经很少有一台台服务器去查的了,通常都是将所有服务器日志统一到一个地方。比较常见的是 ELK。
V2 的日志是用 Filebeat 采集然后放到 ELK,但 V1 不是,导致 V1 查日志的体验很不好。
V1 的做法是:把查询请求发送到每台服务器上,对 grep 日志文件,然后返回并汇总结果展示在界面上。
优点:实现简单
缺点:
- 没有实现分页查询和多条件查询(但有某个月内时间范围查询)
因此查日志的时候是用某个字符串查出所有相关日志,再用浏览器上的ctrl + f
查询到想要的数据。 - 查询缓慢,如果想要查半年前的数据,一般要半小时。有时候甚至要查一年前的数据。等得很痛苦。
有时候会有这样的问题排查需求:系统有个数据有问题,但不知道这个数据是什么时候变更的。结果一查日志发现是一年前的变更。不过这种需求极少,通常只需要查当天的日志。 - 日志查询中有个指定日志文件的参数,不能传范围。如果想查半年前的数据,得一个个月去查或者查一整年的日志。
我后来用 rsyslog 把这些日志收集起来,丢到 ELK。由于通常只查当天数据,偶尔查 7 天内的数据,所以 E 和 L 不需要做什么特别的优化,只是设置日志的索引粒度为一天。
为什么不用 Filebeat ?因为 V1 这个项目跑在 CentOS 5 上面,Filebeat 是用 Go 写的,Go 不支持 CenOS 5(内核版本过低,至少要 2.6.23)。
如果只是为了收集日志而把系统升上去了,到时就要面对更多问题,搞了半天却发现已经偏离收集日志这项工作了。
结果是:
- 当天数据查询耗时降低到原来的三分之一
- 一个月内的日志查询耗时降低到原来的三十五分之一
- 半年前的数据查询耗时为原来的三分之一
自从把日志收集到 ES 后,大大地提高了值班体验(虽然仍然很痛苦)。