在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/

10-12 22:15