上下文传递
在传统的同步 RPC 调用时,业务往往通过线程变量来传递上下文,例如:TraceID、会话 Session、IP 等信息。异步化之后,由于潜在的线程切换和线程被多个消息交叉复用,通常不建议继续使用线程变量传递上下文。
异步化之后,上下文传递的建议策略:
- 如果是 Lambda 表达式,可以直接引用局部变量,通过变量引用的方式将上下文信息传递到 Lambda 表达式中,后续可以通过方法传参等层层传递下去。
- 在所有发生线程切换的地方,显式的进行上下文信息的拷贝和清理,特别需要注意的是隐式线程切换,例如 Hystrix,底层会自己启线程池。
- 建议通过调用级的消息上下文来做参数传递,每个上下文都关联一次 RPC 调用,调用完成之后自动清理掉。
- 异步化之后,需要排重点查所有使用 ThreadLocal 的地方,通常情况下都会存在问题,需要做改造。