在讲故事之前,我先普及一下微服的系统和背景,请大家耐心看完,因为这是非常有意义的。
然后我们在这个有意义的基础之上,我们再通过微服开发过程中的真实故事来传授给你们超复杂软件工程正确的调试技巧。
很多人说懒猫微服就是 NAS,如果你只是从一个局部看,能用网盘相册,能跑应用服务来说,这个切面看确实很像。
但是当你真的拥有一台微服后,你探索里面的小细节,你就会从底层明白它的确不是 NAS。
微服从商业上要解决的根本问题是什么?是要解决复杂终端环境下的互联互通。
不管你是苹果手机,安卓手机,微软笔记本还是苹果笔记本,华为平板还是 iPad, 特斯拉还是比亚迪汽车。在我创建 deepin linux 做操作系统的那些年,明白一个道理,巨头为了建立品牌全家桶,从芯片,编译器,操作系统到硬件和 APP,他们建立了非常深的技术护城河,就是为了让用户用全家桶的硬件。
最著名的就是苹果生态,国内跟班就是小米和华为,我不是说全家桶生态不好哈,而是人做为 “好奇” 的物种,天生就喜欢探索不同品牌的硬件和产品。而巨头绑定大家的隐形护城河就是他们云服务,因为云服务器在巨头家里,所以你想让苹果 iCloud 支持小米和华为就很难,反之安卓云服务要支持苹果也很难。而这种巨头之间的操作系统和终端战争的硝烟是永无止境的。
所以,我花了很多年的时间去做战略思考,不变的是什么?巨头之间的终端硝烟战争。需求是什么?好奇用户买不同终端设备后,希望有一个统一的云服务,不管在什么设备上都可以享受体验一致的云服务,而不是因为单一品牌绑定不能使用不同品牌的设备。
所以微服技术架构选择了工程量最大的一条路:3 层操作系统架构保证各种折腾不会挂,9 大终端小程序框架实现跨操作系统 API 底层调用,自带网络穿透的 Linux 服务器实现跨品牌终端的互联互通。
今天因为篇幅关系,我们只讲网络穿透开发过程中的那些小故事。
在讲小故事之前,大家记得我们 CTO 的一个调试原则:跟着数据流向来调试
故事 1,5G 或者公司的上传速度很快,反而家里局域网上传很慢。
这个标题就是反研发直觉的。最开始百思不得其解,一个奇异的 bug 在公司流程转了一周没结果,APP,客户端,操作系统端都看日志很奇怪,现象稳定但是不知道原因。我当时带着 4-5 个工程师说,不要在公司猜了,要不这个锅会在公司甩几圈都掉不下来。今天都去我家办公。
我们首先要做广泛的测试,排除家的干扰,我在家开 5G 很快,局域网不行,排除后端代码瓶颈,要不是不会因为切换网络就稳定快和稳定的慢。
排查完后端,我们打开 chrome 调试工具,看每个网络请求,5G 和 WiFi 环境下,前端没有阻塞和报错,排除前端。
前后端都排查了,我们估计是网络链路出现了问题,然后我们带了一个公司 WiFi 路由器嫁接到我家光猫上,测试公司的 WiFi 路由器 ipref 跑数据上传速度正常,我手机连我家路由器上传速度掉了 1/10,测试很多次都稳定复现。但是原因是什么?公司路由器到底和我家路由器之间有啥本质的不同?当你遇到一个玄学问题的时候,千万不要死磕原来的代码逻辑,因为那样没用,视野小的地方你是天才也没用,原因一定在思维框架外。
这时候我这条鲶鱼就放开思路了,既然我家 WiFi 上传稳定慢,还缺少一个维度,空间。我就在我家不同的地方频繁的飞行模式到 WiFi,测试家里不同的上传网速,我在家外面走廊和入口卧室上传很快,但是在客厅和主卧很慢,是不是网络波动和测试偏差?我那时候就像孙悟空一样来回在家里转,反复测试了很多遍,都符合这个规律,奇了怪了?家里不同位置还有 10 倍速度差别。做了硬件后,我自己有个原则,凡是在软件上随机不可解的玄学问题都和硬件有关系。
我就坐在那里思考,家外走廊好,公司路由器正常,5G 正常,网速速度有明显的空间特征。想了很久,我猜测是家里不同空间链接了不同 AP,我在走廊连接的是主路由,我在客厅和卧室连接的是子 AP,基于这个猜想我们用网络信道工具去调试,不同的路由器发出的信道是唯一的。果然,上传网速和信道差异吻合了,找到 100% 的逻辑匹配现象就成功一半,我们接着网络搜索看了很多文章,最后我们找到合理的解释。
现在家里多 AP 的设备,特别是子 AP 不像主路由那样是全双工的,子 AP 功率小,它是为了下载速度优化的,当你手机链接了子 AP,同时让它做下载和上传的事情,它就会因为功率不足而降低传输速度。
破案后,解决方式很简单,在微服的 WiFi 设置界面加一个测速功能,在不同 WiFi 信道测试实际的下载速度,让客户端选择功率最大,速度最快的信道,而不是传统无线设备会选择 ping 最低的,通过绑定 WiFi 传输信道来实现终端和微服的高速传输。