年前最后一场技巧盛宴 | 1.27与京东、日记易、假贷宝技巧大年夜咖畅聊智能化运维成长趋势!
Intro
前阵子在公司内搭建了一个 Log Service,用来记录前端的报错信息,代码一顿乱写搞的七七八八之后实现了第一版的功能。
流程很简单,前端将以下格局的信息用 get 发到 Log Service:
{ "url": "https://www.arkie.cn/scenarios", "channel": "frontend", "level": "FATAL", "crashId": "02x32f3", "stack": "base64 string ......", ...}
[ { "filename": "https://arkie-public.oss-cn-hangzhou.aliyuncs.com/js/main.c3600f3f.js", line: 1, column: 334222 }, { "filename": "https://arkie-public.oss-cn-hangzhou.aliyuncs.com/js/common.752d2f13.js", line: 1, column: 113242 },]
然后 Log service 会根据文件对应的 sourcemap (前端各项目 deploy 的时刻已经上传到私有 CDN 了) 解析出原始报错地位。比如:
{ filename: './src/modules/design/design.container.tsx', line: 102}
优化
做完第一个脆弱的版本后发明时光仅仅以前了一天半,所以开端推敲优化的工作了。
第一个版本有两个问题,第一个问题是在后端处理 log 的流程太长导致机能消费有点大年夜,第二个问题是及时处理 Log 在后面用户增多之后办事器会不堪重负,而其实 Log Service 的及时性请求并没有那么高。
对于第一个问题,可以优化代码机能(能优化才怪),分拆步调(这个靠谱)来解决,第二个问题也可以经由过程分拆数据处理步调来解决。
而分拆处理步调这个解决筹划可以经由过程在 Log Service 中参加一个 queue 来解决。比如接收到前端请求后,直接将原始数据塞到 queue 中,然后有一个 consumer 按一个最赶紧率大年夜 queue 中掏出原始日记,处理之后再放入 LogHub,这一部分的细节就不赘述了,要写的话展开又是一个长篇大年夜论。
而优化机能这方面,我本来没有抱什么欲望,因为实袈溱是看不出有啥可优化的。 base64 decode
--> JSON.parse
--> sourcemap parse
都用的是最底层的标准库调用( sourcemap parse
用的是 Mozilla 出品的 https://github.com/mozilla/source-map )
Log Service 接收到这个请求今后,将 Stack
解析成 JSON : JSON.parse(decodeURIComponent(Buffer.from(query.stack, 'base64').toString()))
, 解析后的 stack 是如许的 :
然而在上线的前夕,我忽然想起了前不酒揭捉?习 Rust 的时刻看到的一个库 neon-bindings
Rust!Rust!
是不是可以用更快的说话来竽暌古化 Sourcemap 处理的过程呢,同时大年夜部分重要的繁琐的营业照样应用 TypeScript 编写。
调研了一圈发明,已经有国内的公司在项目琅绫擎用 neon 写营业了: https://www.zhihu.com/question/19903210/answer/207779913
并且大年夜家熟悉的 sentry 在临盆情况中也是应用 Rust
来 parse Sourcemap https://segmentfault.com/a/1190000007299177,固然他们是 binding 到了 python 上,但他们已经把 Rust 代码开源出来了: https://github.com/getsentry/rust-sourcemap
也就是说我只须要把这部分的 Rust
代码经由过程 neon-bindgs 封装成 NodeJS 可调用的模块就行了,不像 sentry 还要 port 出 C API 再经由过程 python 调用 C 的代码,美滋滋。
写代码的过程和道理就省略了,代码可以在: https://github.com/Brooooooklyn/sourcemap-decoder 看到,重要分享一些数据和踩的坑:
Benchmark
所以 Rust 比 JavaScript 代码在处理同样的 Sourcemap 时 parse 快若干呢?
我做了一个简单的 benchmark, 测试结不雅如下:
$ node benchmarkJavaScript parse time 50794 microsecondsRust parse time: 39 microsecondsJavaScript parse result,
推荐阅读
年前最后一场技巧盛宴 | 1.27与京东、日记易、假贷宝技巧大年夜咖畅聊智能化运维成长趋势!
这几天来,我(Eric Raymond)在思虑那些正在挑衅C说话的体系编程说话领心肠位的新潮说话,尤其>>>详细阅读
地址:http://www.17bianji.com/lsqh/40443.html
1/2 1