0

我正在为日志记录问题寻找一种方法或最佳/更好的设计决策。我在集群中使用 Akka actor 来提供后端服务,并在前端使用 Play 来接受 HTTP 请求。我的问题是从让整个应用程序日志可识别的旧问题扩展到相同的 HTTP 请求,这些请求只是使用大多数当前日志记录框架中存在的 MDC,方法是在开头生成一个 UUID 并将其放入上下文中。

我们的数据流示例可能如下所示:

“Http 请求/系统 A” -> “Actor1/Cluster B” -> “Actor2/Cluster C” -> “回复系统 A 并完成请求”

这意味着该过程中至少涉及 3 个独立的系统。我所有的日志都转到 Logstash。我可以从系统 A 的请求开始生成一个 UUID。但是,我希望 UUID 可以被携带/搭载到所有子系统,这些子系统都使用 Protobuf 序列化来相互通信,处理属于的作业到同一个http请求。

我知道我总是可以在我的所有消息中添加一个 id 字段,但这非常难看。

我想知道是否有更好的方法或更好的机制将信息传送到所有其他调用 Akka 系统,而不会给我的业务逻辑处理带来太多噪音?

4

1 回答 1

1

您可以将原始消息包装到容器中UUID

case class MessageWithUuid(message: Any, uuid: UUID)

然后,在你的receive你应该打开它并保存uuid以供记录:

var uuid: Option[UUID] = 
def receive: Receive = {
  case MessageWithUuid(message, uuid) =>
    this.uuid = Some(uuid)
    //TODO: put UUID to MDC logging context
    receive(message)
    //TODO: remove UUID from MDC
    this.uuid = None
  case ... => 
}

并且每当您向另一个参与者发送消息时,您都需要使用 UUID 包装它:

def send(actor: ActorRef, message: Any) = actor ! MessageWithUuid(message, uuid.get)
于 2017-01-25T09:55:38.987 回答