新的方式传递链路追踪上下文(NodeJS)
最近一个多月都在忙于项目,没有时间记录新的知识。我们起了一个全新的前端项目,技术选型是React + SSR + Dva。要求的起点也比较高:用户导航首屏SSR,其它时候CSR;代码要求SSR与CSR复用;所有的请求经过Node层;页面显示、接口请求均要求小于1秒。
为了容易定位调用链路的性能点,我们加入了Jaeger Open Tracing,这就涉及到链路追踪上下文的传递。
在代码层面上,方案如下:
- React视图层,使用React Context传递Trace Context。
- Dva模型层,设计增强Dva的功能。提供更高级的runEx、put、putResolve函数;在Redux中间件中给Action自动附加Trace Context.
- 网络请求API层,由runEx调用起来,自动添加Trace Context参数;请求准备出口时,拦截器自动添加tracing header。
为什么不使用Async hooks方式?原因是现在前端或Node层到处都是异步编程、await非常多,Async hooks在高并发场景下性能低劣。
使用Jaeger Open Tracing,我们发现部分的调用链太长,必需优化才能达到小于1秒的要求。经过优化之后,集群内耗时100ms,其余时间消耗在客户端网络延时与额外静态资源请求。