gpt4 book ai didi

spring - 跨线程发送 TraceId

转载 作者:行者123 更新时间:2023-12-05 07:38:17 38 4
gpt4 key购买 nike

我们有一个遵循微服务架构的分布式应用程序。在我们的一项微服务中,我们遵循生产者-消费者模式。

生产者接收请求,将其保存到数据库,将请求推送到 BlockingQueue 并将响应发送回客户端。在单独线程上运行的消费者正在监听阻塞队列。一旦它获得请求对象,它就会对其执行特定操作。

生产者收到的请求使用 CompleteableFutures 异步保存到数据库。

这里的问题是如何将 TraceId 转发给在消费者线程中处理 requestObject 的方法。因为消费者线程可能会在响应发送给消费者之后很晚才处理这些对象。

还有如何跨异步调用转发 traceId?

谢谢

最佳答案

这是一个有趣的问题。我认为您可以做的是将请求与其 header 一起保存。然后在消费者端,您可以使用与我们此处类似的方式使用 SpanExtractor 接口(interface) - https://github.com/spring-cloud/spring-cloud-sleuth/blob/v1.3.0.RELEASE/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java#L351 (Span parent = spanExtractor().joinTrace(new HttpServletRequestTextMap(request));)。这意味着我们从 HttpServletRequest 中提取值来构建一个跨度。然后,一旦您检索到 Span,您就可以在处理之前使用 Tracer#continueSpan(Span) 方法,然后使用 Tracer#detach(Span) 在 finally block 中。例如。

Span parent = spanExtractor().joinTrace(new HttpServletRequestTextMap(request));
try {
tracer.continueSpan(parent);
// do whatever you need
} catch(Exception e) {
tracer.addTag("error", doSthWithTheExceptionMsg(e));
} finally {
tracer.detach(parent);
}

关于spring - 跨线程发送 TraceId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035575/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com