3

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

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

生产者收到的请求使用 CompleteableFutures 异步持久化到数据库中。

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

另外如何跨异步调用转发traceId?

谢谢

4

1 回答 1

0

这是一个有趣的问题。我认为您可以做的是将请求与其标头一起保留。然后在消费者方面,您可以SpanExtractor像我们在这里一样使用界面 - 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#L351Span parent = spanExtractor().joinTrace(new HttpServletRequestTextMap(request));)。这意味着HttpServletRequest我们正在从中提取值来构建跨度。然后,一旦您检索到Span,您可以Tracer#continueSpan(Span)在处理之前使用方法,然后Tracer#detach(Span)在 finally 块中。例如

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); 
}
于 2018-01-03T08:09:06.087 回答