3 回答
TA贡献1876条经验 获得超6个赞
一种常见的方法是 - 将所有异常报告给集中式异常跟踪服务,该服务聚合和跟踪异常并通知开发人员。
这种模式的好处是 - 更容易查看异常并跟踪其解决方案。
这种模式的缺点是——异常跟踪服务是额外的基础设施。
在Careem 中,我们使用ELK 堆栈——我们使用 Logstash,它是一个服务器端数据处理管道,可以同时从所有微服务中摄取数据,对其进行转换并将其发送到Elasticsearch。Kibana允许我们通过图表和图形来可视化数据,并具有广泛的过滤、搜索等功能。
而且,如果是Microservice 1 --> Microservice 2 --> Microservice 3
同步的通信方式,你总是可以在Microservice 1
from Microservice 3
through 中生成和接收一些自定义的错误响应Microservice 2
。但是要获得异常的完整堆栈跟踪,最好将异常日志聚合在某个集中的地方。
TA贡献1775条经验 获得超8个赞
微服务架构的特性之一是分离关注点,这意味着在理想情况下,微服务 1 不应该知道微服务 3 的存在。它适用于 M2 并且唯一重要的事情是它的响应是否有效。
无论如何,如果您想跟踪呼叫,可能有多种方法:
当 M3 生成异常时,它会将其发送回 M2,M2 将其按原样传播到 M1(或在不丢失信息的情况下包装它)。
另一种变体是对trace信息有单独的存储,所以M1会生成唯一的ID,发送给M2,M2发送给M3,表示是单次请求。然后每个服务使用这个 ID 来存储有关执行或任何其他指标的信息(通过调用一些 X 服务)。
TA贡献1818条经验 获得超8个赞
首先,您需要在开始处理的第一个服务时或之前分配一个唯一的请求 ID。
您如何为分布式跟踪生成唯一的请求 ID?使其结合实例 ID/名称和时间戳。
如果微服务正在同步通信,那么您可以将其作为 http 响应发送。但是如果微服务通过像 kafka 这样的流异步通信,那么您可以使用流来提供回调机制。流可能是例外,请求 id 成为分区键。
添加回答
举报