2017-08-17 35 views
1

我一直在尋找使用RabbitMQ進行跨服務消息傳遞。我已經能夠使用Spring註釋來配置Exchange/Queues/DLX等。示例(簡單)隊列監聽:通過RabbitMQ維護correlationId

@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()); 
} 

我使用的是彈簧雲偵探產生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。

谷歌搜索不斷給我帶來春季雲流和春季雲流首發 - 兔;文檔似乎表明它可能會自動插入/設置traceIds,但我對Spring-Cloud-Stream完全不熟悉,並且沒有找到特別有用的文檔。

所以,我很想回答以下幾個:

  • 使用SpanAdjuster或示蹤等;我可以根據我的DTO中的值設置traceId嗎?
  • 使用spring-cloud-stream,我可以自動插入/檢索traceId,我將從哪裏啓動?

回答

0

所以,櫃面有人遇到這種期待以設置偵探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工作部分應該用try/catch/finally塊包裝以確保關閉。

任何使用跨度仍然打開的方法將繼承traceId。

編輯

我還應該說,這似乎更好的解決辦法是更換彈簧AMQP庫彈簧雲流;從我所知道的情況來看,這應該會自動在rabbit消息中包含traceId(correlationId)並將它設置在另一端。但是,我沒有機會測試這個。