在vertx的多个模块中执行日志时,基本要求是我们应该能够将单个请求的所有日志关联起来。
由于vertx是异步的,因此保留logid,conversationid和eventid的最佳位置。
我们可以实现任何解决方案或模式吗?
最佳答案
在基于线程的系统中,当前上下文由当前线程保存,因此MDC或任何ThreadLocal都可以。
在基于角色的系统(例如Vertx)中,您的上下文就是消息,因此您必须在发送的每条消息中添加一个关联ID。
对于任何处理程序/回调,您都必须将其作为方法参数传递或引用最终的方法变量。
为了通过事件总线发送消息,您可以将有效负载包装在JsonObject中,然后将相关性ID添加到包装对象中
vertx.eventBus().send("someAddr",
new JsonObject().put("correlationId", "someId")
.put("payload", yourPayload));
或者您可以使用
DeliveryOption
将相关ID添加为 header //send
vertx.eventBus().send("someAddr", "someMsg",
new DeliveryOptions().addHeader("correlationId", "someId"));
//receive
vertx.eventBus().consumer("someAddr", msg -> {
String correlationId = msg.headers().get("correlationId");
...
});
还有更多更复杂的选择,例如在事件总线上使用Interceptor,Emanuel Idi曾使用该拦截器来实现对Vert.x的zipkin支持,即https://github.com/emmanuelidi/vertx-zipkin,但我不确定此集成的当前状态。
关于logging - 如何在分布式Vertx系统中关联日志事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45045621/