1月25号就开启休假模式了,图为1月24号晚上就马不停蹄地开启了自驾游,到达了第一站温州,和女儿为辛苦劳作的一年一起画一个句号。
技术
记一次稀奇古怪的优化
potree/potree 是一个开源的点云展示库,用于展示大规模的点云数据,但是团队在使用过程中发现了一个问题。 由于使用的人数较多,同时使用的BIN数据过大,因此对网络的带宽造成了比较大的影响,因此需要对数据进行压缩。 由于点云数据文件是从外部系统加载的,因此无法直接修改外部系统,团队首先想到了使用nginx做代理,再在代理层对数据进行压缩。但是并没有成功。 因为potree在加载数据的时候会对数据进行解析,因此会先读取一个文件的Header,后面使用的过程中按需取加载需要的分段数据。 而浏览器对于带Range的请求并不会带上Accept-Encoding: gzip,因此即使nginx强制对数据进行了压缩,浏览器也不会自动解压缩。 参考current HTTP/2 spec prevents gzip of response to “Range” request
经过分析potree的源码,potree是通过fetch来加载数据的,因此想到了使用fetch的interceptor来对数据进行解压缩。参考下图:
- 在浏览器端使用js 可以把 window.fetch 重写为自己的 fetch。在访问特定的资源时,可以对Range的请求进行拦截,然后在请求头中加上Accept-Encoding: gzip。并将Range的请求头中的范围复制到一个自己定义的请求头中,比如X-Range,这样浏览器和中间的代理看起来这都是一个不带Range的常规GET请求。
- 在反向代理侧,将代理的请求头中的X-Range复制到Range中,然后再将请求头中的Accept-Encoding: gzip去掉,将请求发送到真正的应用服务器,这样应用服务器就会返回部分的资源数据,当然是未压缩的。
- 在反向代理侧,将应用服务器返回的数据进行压缩,然后再以200 OK的状态返回给浏览器,浏览器会自动解压缩。
- 在浏览器端,fetch的interceptor中,将返回的解压缩后的数据,丢给potree处理。
这样就实现了避免对potree的代码和第三方系统修改实现中间压缩数据的目的。当然中间的代理层需要自己实现,这里使用了OpenResty来实现。依赖Nginx的lua模块,实现了对请求头的修改和对数据的压缩。
整个概念性的代码可以参考 matrixji/fetch-with-encoding-and-range
再一次说明了软件自主可控的重要性,如果软件的源码是开源的,那么就可以通过修改源码来实现自己的需求,而不是被动地等待第三方的支持。即使不修改,通过外部的Hack也是需要在软件的源码是开源的前提下会简单很多。
随笔
探班公司钱塘工厂
放假前趁着工厂人少,特地去了趟杭州钱塘的工厂。
汽车制造业真的是太不容易了,庞大的生产线、高度的自动化、复杂的工艺流程。对B10 25年大卖充满了期待。因为信息安全的原因不能拍太多照片。
估计2025年的家属日,大家就有机会参观钱塘工厂了。
- 左图:食堂的午餐,10元,目前还比较简单。
- 右图:车间外景,内部真的非常壮观。