通过RabbitMQ维护相关性ID

潘泰

我一直在考虑使用RabbitMQ进行跨服务消息传递。我已经能够使用Spring注释配置我们的Exchange /队列/ DLX等。示例(简单)队列侦听器:

@RabbitListener(queues = RabbitMessageType.QueueNames.SMS_NOTIFICATIONS)
public void receive1(Message message) throws Exception {
    RabbitMessageDto messageDto = OBJECT_MAPPER.readValue(message.getBody(), RabbitMessageDto.class);
    SmsNotificationDto payload = OBJECT_MAPPER.readValue(messageDto.getPayload(), SmsNotificationDto.class);
    log.info(payload.getMessage());
}

我正在使用spring-cloud-sleuth来生成correlationIds / traceIds,当使用HTTP请求与其他服务进行对话时会保留这些信息,从而使我们能够在各种微服务的日志中跟踪给定的ID。

虽然可以获取当前的traceId并将其插入我的DTO中:

@Autowired
private Tracer tracer;

private RabbitMessageDto createRabbitMessageWithPayload(String messageType, 
                                                        String messageVersion, 
                                                        Object payload) {
    return new RabbitMessageDto.Builder()
        .withTraceId(tracer.getCurrentSpan().getTraceId())
        .withDtoName(messageType)
        .withDtoVersion(messageVersion)
        .withPayload(payload)
        .build();
}

我找不到在接收方法中设置traceId的方法。

谷歌搜索不断将我带到spring-cloud-stream和spring-cloud-stream-starter-rabbit;文档似乎表明可以自动插入/设置traceId,但是我对spring-cloud-stream一点都不熟悉,并且发现该文档没有特别的帮助。

因此,我希望回答以下问题:

  • 使用SpanAdjuster或Tracer等;我可以根据DTO中的值设置traceId吗?
  • 使用spring-cloud-stream,我可以自动插入/检索traceId,该从哪里开始?
潘泰

因此,如果有人遇到这种寻找设置侦探traceId上下文的想法,我们提出了以下解决方案:

@Autowired Tracer tracer;

private void someMethod(long traceId) {
    Span span = Span.builder()
        .traceId(traceId)
        .spanId(new Random().nextLong())
        .build();
    tracer.continueSpan(span);
    // do work
    tracer.closeSpan(span);
}

应当注意,所有文档都说,跨度一旦完成就应该关闭。上面的do work部分应该用try / catch / finally块包装,以确保将其关闭。

在span仍然打开的情况下调用的任何方法都将继承traceId。

编辑

我还应该说,似乎更好的解决方案是将Spring AMQP库替换为spring-cloud-stream;据我所知,这应该自动在兔子消息中包含traceId(correlationId),并将其设置在另一端。但是,我还没有机会进行测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章