为同一“请求”

时间:2017-01-24 10:46:49

标签: scala logging akka actor scalapb

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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 ... => 
}

每当你向另一个actor发送消息时,你需要用UUID包装它:

def send(actor: ActorRef, message: Any) = actor ! MessageWithUuid(message, uuid.get)