休假回来,这个班咋上的来着?
生活
发现旅游回来,饿超快。
学习和折腾
买了个京东 AX1800Pro 亚瑟
- 为啥:便宜。想着家里的路由器还是 K2P 和 Newifi,好多好多年了,也该换换了。
- 没搞好:买来版本稍微有点高,是 2242 版本的,想要刷机必须联网开一个什么「A 插件」,但据说联网会强制自动升级到更高版本,升级后就更没办法刷机了。我又不想拆机刷机……反正搞了一天没成功。
工作
整整被坑了一周,整整一周
- 一个奇葩的事儿:我们要给平台写模型服务。但是平台完全不知道会传给我们什么东西,只有 IDL 约定——哦,看上去是有 IDL,其实 IDL 里面传的自定义 Json 。所以需要你先自己搞个服务出来,让平台给你打一个请求,你把它 dump 出来,然后把自己分析里面有哪些字段。
- 然后呢,我发现 Python 死活不能 dump 这个请求:用公司包了一层的库会直接抛异常,用 thriftpy2 里面的序列化也是不行,用 pickle 也会抛异常——所以这个 IDL 里面是有什么魔法啊!
- 无奈放弃 Python,改用 golang 糊了个假服务,一切正常。
- 然后就回来研究,为啥前面两个地方会报错?发现是序列化/反序列化里面少了对 Binary 的支持,所以遇到 Binary 就挂。那好,就想办法加上这个支持,monkey patch 一下。
- 然后上线,发现,线上报 import 错误,说找不到 thrifypy2 里面一个叫 u 的函数。由于我们的网络权限啥啥啥都被限制,所以用了一个非常慢非常慢但是合规的工具看了代码,哎,thriftpy2 里面确实没有这个函数?看看版本,哦,0.5.0,本地是 0.4.2……那就,降级。
- 然后发现,服务很奇怪。抄的老服务,服务里面为了加速,所以会多线程调用下游服务。同时为了加速,在启动的时候选择使用 gevent+gunicorn 的方式来启动,大概 5 小时后,「多线程」那里完全卡死,上游调用我的服务 100% 超时。又是一通 oncall,发现去掉 gevent 就好了。
- 然后继续上线,这次 docker 镜像死活编译不过了。我是不升级会死星人,所以各种依赖的版本都写得比较高;但是有个依赖,它依赖另一个重要的组件,这个组件依赖了一个 0.4.0 版本的通讯库(大概是三年半之前的版本了,最新版本都到了 2.6.2 了),所以各种依赖冲突……无奈啊无奈,在启动脚本里面,写了个
pip install…… - 然后就想着,啊,我还有个小工里面有个小 bug 。改了一行代码,编译,发现依赖报错——依赖方面明明啥都没动过。查依赖的错误又查了小半天。
- 哦对了,上面说服务是基于一个老服务改的。这个老服务呢,遵从组内一贯的风格:Python 单文件,所有面条逻辑挤在一个 1000 多行的 py 文件内,没有任何注释;config 分布在 5 处:远程配置平台、分出来了个
config.py、 Python 单文件内、启动脚本会给 py 文件传 args 、启动脚本和 py 文件都会读环境变量,到底也不知道是谁把谁给覆盖了。每个请求过来,都会起一个新的线程池来处理调用下游的 RPC 。简直快把我看郁闷了。 - 各种被坑,很难受。不过还好,都解决了。
- 还好这玩意儿只有 0.1QPS……