1718总结与计划
2018年已经悄然到来,回望过去一年,收获很多,感恩很多;未来一年,内心充满了期待,无论是工作还是生活,将会发生很大变化。大年初一的晚上,将自己的所思所想记录下来,与大家分享,激励自己18年更努力。
17年总结
我目前就职于小米,在『小米网智能客服项目』从事开发工作,项目主要包含在线客服、智能机器人、智能数据分析三大块,另外还包括热线、邮件、工单等模块。
16年3月份,我加入这个团队,当时就4个人,每个人负责多个子项目。经过了解,项目初期想做的功能很多,设计的比较大,很多人投入进来,形成了很多个子服务。所以17年上半年之前,我一直在维护项目,解决线上的一些问题,实现业务的一些小需求。另外,当时小米的管理比较扁平化,项目管理和团队管理也不是很规范,自己也比较松散,技术和团队协作能力提升的都比较少。
17年下半年,小米发展增速明显,国内和国外的业绩都有了很大提升。管理上也开始重视起来,招了很多项目经理,『小米网智能客服项目』有了产品功能规划,开发团队也慢慢扩大,慢慢变得好起来。
还有一点对我影响很大,我们团队的开发负责人,17年中旬加入进来,有10多年的开发、管理经验,从他身上,在任务规划、执行力、团队协作上学到了很多。
下面从主要工作、线上问题处理、规划执行能力、家庭几个方面总结自己过去的一年。
主要工作
我主要负责在线客服,使用到的主要技术点:
- NIO
- 多线程
- WebSocket协议
- 会话状态管理
- CAS单点登录
- Shiro权限控制
使用到的主要框架和组件:
- SSM
- Redis
- RabbitMQ
- ZooKeeper
- Thrift
消息平台
在线客服最重要的一点是保证用户和客服能够在线沟通,类似于IM。现有系统缺少消息确认、重发机制,多终端消息同步也不支持,17年在技术负责人的指导下,重构了『在线实时聊天』模块,进行了抽象,变为通用的『消息平台』:
- 长连接接入层还是使用netty实现的websocket通道,比之前更通用,扩展其他协议也很方便,另外可支持多实例部署,随时重启;
- 消息存储层,为了方便,使用MySQL+Redis进行存储,保证了消息的有循序,实现了消息确认和重发机制;
有点遗憾的是,17年下半年规划需求比较多且比较紧急,人也比较少,没能够正式上线,18年一定要推进上线。
maven依赖统一管理&工具类封装
前面说到,项目有很多子服务,每个服务maven的配置都很相似,更新维护都要修改所有的服务,不是很方便。经过调研和思考,决定将公共的依赖、版本声明、构建过程、maven插件统一管理,抽象出一个parent pom。
maven本身就支持parent pom,每个子项目只需声明下继承父pom,就可以直接声明需要的依赖,不需要再声明版本,构建过程。
另外,将公司其他组的一些工具类,也声明在父pom中。客服项目特有的一些工具类移到父pom所在项目,并在父pom中声明。
国内和海外代码分支合并
因历史原因,国内和海外代码分支是不同的分支,海外的功能较国内相对较少,而且海外有近1年未更新了。一次,业务提出一个海外需求,该需求在国内分支已经实现。经过确认,海外有的功能,国内都有,而且交互和操作都相同,只是一些基础存储组件不同。最终决定,合并国内和海外分支,方便以后功能扩展,节约开发时间和维护成本。
升级过程熬了2个通宵(不是连续的),过程在此就不详细描述了,简单总结下:
- 大的变更上线前,一定要做好回滚预案, 升级失败可及时回滚,不影响现有业务;
- 条件允许,最好有预上线环境,尽量完全模拟线上,因为海外网络结构比较复杂,虽然测试环境测试正常,上线后可能出现各种问题;
- 上线时,相关人都要在场,有问题时及时协调处理;
推进协作开发规范
相信大部分团队都在使用git进行代码版本控制,但真正用好git,多人协作开发一个项目,需要规定一套工作流规范。
我借鉴网上比较流行的git flow规范,形成了相关规范,对各种场景的使用进行了说明,并做了一次分享,现在已经在项目中试运行,明年会加强推进。
扩展阅读:
线上问题处理
问题处理也是很重要的能力,更能提现一个人的能力,遇到问题时,首先不要排斥,它是提升自己能力的一个机会,问题解决后,要进行总结回顾,下次遇到相似问题时可以快速定位和处理。
17年遇到了不少问题,下面列举2个问题总结(当时总结的)。
测试环境-客服端无法访问
- 问题描述
- 浏览器访问测试环境客服端时,直接提示502错误,后台服务不可用;
- 排查过程
- 查看resin服务器日志和程序日志,未发现异常;
- 查看cpu指标,未发现异常;
- 查看jvm内存使用情况、垃圾回收情况,未发现异常;
- 查看jvm栈,发现有好多线程在同一处等待数据库资源,可能数据库资源已被耗尽;
- 重点关注“线程等待的代码”,打开数据库连接池日志,在本地尝试复现;
- 同事在本地复现,发现调用snaker(一个开源的工作流框架)的一些方法时,占用很多连接, 用完后并没有释放;
- 同事通过review代码,发现,在Service类加上Spring事务管理器后,问题解决;
- 通过查看snaker源码,snaker在处理工作流时,旨在最后一次操作还回连接,如果未开启事务管理, 会获取多个连接,但仅释放最后一次连接,导致连接泄漏;
- 总结
- 排查问题时,不应太着急,理清思路,一步步进行排查;
- 珍视排查问题的机会,从中会学到很多;
海外正式环境-ip白名单问题
- 问题处理过程
- 2018/02/04,发现时常有提示【ip禁止访问】的问题,当时觉得可能自己的网络不稳定,没有在意;
- 2018/02/05,业务开始反馈多个客服出现【ip禁止访问】的问题,我和同事开始介入排查;
- 尝试重启服务解决这个问题,但无效;
- 临时关闭ip白名单功能,让业务可以正常使用;
- 2018/02/06上午,我尝试开启ip白名单功能,但还是出现【ip禁止访问的问题】;但发现服务端打印的访问者(我的内网机器)ip和我真实的不同;(curl cip.cc)
- 把发现的情况告诉运维,运维开始排查;
- 2018/02/06下午,4点半左右,运维定位到问题:信息部将某个域名公网IP转发到专线出口,说是为了解决国内到新加坡走国际链路慢的问题;
- 5点半左右,我添加对应的网段到ip白名单中,开启ip白名单功能;
- 后续观察,问题解决;
- 总结
- 不放过一个异常的现象,也不排斥和害怕处理这些问题;
- 明确:线上问题处理能力是很重要的能力;
- 整体上分析问题出现的可能原因;
- 如果线上一直运行正常,突然某个功能不可用,就要考虑外部的一些因素了,尤其是网络;
- 不放过一个异常的现象,也不排斥和害怕处理这些问题;
规划执行能力
从团队负责人身上,获益最大的就是规划执行能力,让我做事有条不紊,有始有终,更充实、更有效。
下面分享下我们团队和我的规划执行过程
- 每月初进行月度总结和规划;
- 每周四下午填写周报,我会详细总结上周计划完成情况、下周计划;(特别重要,会特别认真填写)
- 每周五进行进行周会;
- 每周五,我会把下周主要工作同步到outlook日历中,细分每一天的任务;
- 协作过程
- 接到需求后,产品先进行分析,给出产品文档和初步的原型设计;
- 开发阅读和理解产品文档,记录下疑问;
- 产品和开发一起参加需求确认人,对一些细节和疑问进行讨论,确定最终的需求和原型;
- 其他
- 团队任务使用teambition进行管理,可查看团队所有任务;
- 重点任务,每天下班前会进行沟通,确保任务按计划执行;
我严格执行了上面的过程,获益良多。
家庭
篇幅原因,就不多说了,总结两点:
- 老婆辛苦了,怀了小宝宝,我没能好好照顾你,感谢你的包容;
- 感谢丈母娘,专门辞去工作照顾你的女儿,辛苦了;
18年计划
技术学习
我会深入学习以下相关技术:
- 即时通讯
- NIO
- 消息系统
- 分布式缓存
- spring boot
- 数据分析
管理能力
18年,我将带个小组,多花精力在管理上,阅读相关数据,向身边优秀的人多学习,加强小组、部门间的协作沟通。
家庭
3月份,我的宝宝就要出生了,我会多花点时间学习如何与她沟通。
老婆会更辛苦,我会多包容她,陪着她。