@
aababc 你列举的正是问题所在之一。
API 数量上升之后,服务治理将是一个非常头痛的问题,稍有不慎服务状态就和基础设施状态耦合进去了。你使用 http 状态码会加剧这一过程。
举个例子,http 504 是 gateway timeout ,但业务逻辑执行超时是很常见的现象,现在微服务框架都具备在链路超时 quota 超过后主动取消请求的能力,并且返回 deadline exceed 错误。按照你的想法,那它应该被设定为返回 http 504 。
ok ,记住上面的结论。
现实中,微服务和微服务间存在非常多的 middlebox ( router/Switch/L4/L7 LB ),他们会透明化的按照某些规则转发 http 请求。
假设,有一天中间某个 L7 负载均衡故障,造成 http 转发产生 504 超时。
请问:你怎么判断这个 504 是基础设施故障还是你业务逻辑故障?
以上是可观测问题,下面继续说深刻点。关于 SLO 治理。
正确的方式是让对的人去处理对的事情,而不是服务故障牵一发而动全身。因为你已经混淆了业务响应和基础设施问题,那服务出现故障告警时,运维和开发都会被拉进去。告警噪音将彻底击溃整个系统开发和 SRE 的基本信任。
ok ,到这都还是只讲了 http 。
那如果引入更多的应用层协议,使用 gRPC ,使用 thrift 时,虽然他们都是使用 http transport ,但并不遵守你那套 http status 要求,那你的告警和观测系统要各自做一套吗?
综上,最好的办法是,业务独立使用一套自己定义的错误观测体系,所有的应用层协议都按 transport 层处理。明确基础设施和业务边界