【发布时间】:2017-01-24 10:46:49
【问题描述】:
我正在为日志记录问题寻找一种方法或最佳/更好的设计决策。 我在集群中使用 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 系统,而不会给我的业务逻辑处理带来太多噪音?
【问题讨论】:
-
"ugly" 选项是我所知道的唯一一个。
-
您可以根据httprequest确定您的id生成,这样您的所有系统在登录时都会简单地生成相同的id?
-
@C4stor 我不太确定如何做到这一点。事实上,除了系统 A 上的入口点,所有其他参与者系统都使用 protobuf 序列化接收,我想我并不清楚,对此感到抱歉。
-
如果他们收到相同的有效负载,您可以将其作为重要有效负载字段的哈希值(如果有基于时间的字段,则可以加分,以避免冲突)。当然,如果没有对您的工作流程的实际见解,这只是一个疯狂的猜测。
-
@C4stor 我明白你的意思。然而,情况并非如此。对于代表微服务的不同服务/Actor 集群,有效负载可能有不同的形式。
标签: scala logging akka actor scalapb