为了账号安全,请及时绑定邮箱和手机立即绑定

回溯微服务架构中的异常

回溯微服务架构中的异常

斯蒂芬大帝 2021-09-12 16:53:34
我想问一个和建筑有关的问题。这个问题是在一次采访中问我的,但我无法回答,也无法在网上找到任何令人信服的答案。问题是:- 假设您有 4 个相互通信的微服务,并且数据流的工作方式如下:-微服务 1 --> 微服务 2 --> 微服务 3 --> 微服务 4 --> 微服务 1现在假设微服务 3 中有一个异常,你如何追踪这个异常并告诉微服务 1 这是异常并且它发生在微服务 3 中。提前致谢!
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

一种常见的方法是 - 将所有异常报告给集中式异常跟踪服务,该服务聚合和跟踪异常并通知开发人员。

这种模式的好处是 - 更容易查看异常并跟踪其解决方案。

这种模式的缺点是——异常跟踪服务是额外的基础设施。

Careem 中,我们使用ELK 堆栈——我们使用 Logstash,它是一个服务器端数据处理管道,可以同时从所有微服务中摄取数据,对其进行转换并将其发送到ElasticsearchKibana允许我们通过图表和图形来可视化数据,并具有广泛的过滤、搜索等功能。

而且,如果是Microservice 1 --> Microservice 2 --> Microservice 3同步的通信方式,你总是可以在Microservice 1from Microservice 3through 中生成和接收一些自定义的错误响应Microservice 2。但是要获得异常的完整堆栈跟踪,最好将异常日志聚合在某个集中的地方。


查看完整回答
反对 回复 2021-09-12
?
www说

TA贡献1775条经验 获得超8个赞

微服务架构的特性之一是分离关注点,这意味着在理想情况下,微服务 1 不应该知道微服务 3 的存在。它适用于 M2 并且唯一重要的事情是它的响应是否有效。

无论如何,如果您想跟踪呼叫,可能有多种方法:

当 M3 生成异常时,它会将其发送回 M2,M2 将其按原样传播到 M1(或在不丢失信息的情况下包装它)。

另一种变体是对trace信息有单独的存储,所以M1会生成唯一的ID,发送给M2,M2发送给M3,表示是单次请求。然后每个服务使用这个 ID 来存储有关执行或任何其他指标的信息(通过调用一些 X 服务)。


查看完整回答
反对 回复 2021-09-12
?
弑天下

TA贡献1818条经验 获得超8个赞

首先,您需要在开始处理的第一个服务时或之前分配一个唯一的请求 ID。

您如何为分布式跟踪生成唯一的请求 ID?使其结合实例 ID/名称和时间戳。

如果微服务正在同步通信,那么您可以将其作为 http 响应发送。但是如果微服务通过像 kafka 这样的流异步通信,那么您可以使用流来提供回调机制。流可能是例外,请求 id 成为分区键。


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信