如何查找与同一“事件”相关的所有日志——例如,假设一个 api 调用导致 5 个服务被调用——我们如何在这些服务中跟踪这个调用。这里的典型解决方案是在第一个服务上生成唯一的请求 id,然后通过所有服务传播这个 id。
如何重新组装跨节点的调用顺序。从“理论”的角度来看——这个问题是关于总订单的——我们需要能够获取任意两个日志事件并说出哪个先发生。在这里我们不能使用时间戳,因为它们不够准确。对我们来说幸运的是,有一个众所周知且简单的算法来处理这个问题:Lamport 时间戳。当然,开发人员必须将其添加到代码中才能使其正常工作。它可以是服务代码,也可以是日志代理代码(日志代理是聚合所有日志的工具)。值得一提的是,如果您的分布式系统具有类似树的调用结构,那么总顺序可能是一种过度杀伤力,例如服务 A 总是接收来自用户的请求,然后调用服务 B 和 C - 在这种情况下,保留请求 id 就足够了 - 因为你已经知道顺序了。
我来说两句