我有两个API:A和B,我可以控制这两个API,并且两个API都有可读性和可用性的健康检查。 A依赖于B。
A
/foo - This endpoint makes a call to /bar in B
/status/live
/status/ready
B
/bar
/status/live
/status/ready
由于依赖关系,A的就绪健康检查是否应调用API B的就绪健康检查?
我有两个API:A和B,我可以控制这两个API,并且两个API都有可读性和可用性的健康检查。 A依赖于B。
A
/foo - This endpoint makes a call to /bar in B
/status/live
/status/ready
B
/bar
/status/live
/status/ready
由于依赖关系,A的就绪健康检查是否应调用API B的就绪健康检查?
如果Service A能够处理业务请求,那么它就已经准备好了。所以,如果能够到达B是其需要完成的一部分(看起来确实是这样),那么它应该检查B。
让A检查B的一个优点是你可以在错误的滚动升级时快速失败。假设A被错误配置,以至于升级功能包含了B的错误连接细节 - 可能B的服务名称被注入为环境变量,而新版本有一个拼写错误。如果A实例在启动时检查B,那么你可以更容易地确保升级失败,并且没有流量进入新的错误配置Pods。有关更多信息,请参见https://medium.com/spire-labs/utilizing-kubernetes-liveness-and-readiness-probes-to-automatically-recover-from-failure-2fe0314f2b2e
通常情况下,A只需要检查B的存活性端点或任何最小可用性端点,而不是B的准备就绪端点。这是因为Kubernetes将会为您检查B的准备就绪探针,因此A可以访问的任何B实例都将是就绪状态。如果B的准备就绪端点执行的检查比存活性端点多,则调用B的存活性端点而不是准备就绪可能会有所区别。请记住,Kubernetes将定期调用这些探针 - 准备就绪和存活性 - 它们都有一个周期。区别在于Pod是否从服务流量中撤出(如果准备就绪失败)或重新启动(如果存活性失败)。您不是在尝试进行端到端事务检查,您希望这些检查包含最少的逻辑并且不使用太多负载。AddUrlCheck
方法,如下例所示:// Startup.cs from the MVC web app
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<AppSettings>(Configuration);
services.AddHealthChecks(checks =>
{
checks.AddUrlCheck(Configuration["CatalogUrl"]);
checks.AddUrlCheck(Configuration["OrderingUrl"]);
checks.AddUrlCheck(Configuration["BasketUrl"]);
checks.AddUrlCheck(Configuration["IdentityUrl"]);
});
}
}
强调是我的
因此,更直接地回答你关于
由于依赖关系,A 的可读性健康检查是否应该调用 API B 的可读性健康检查?
我想说是的。特别是如果依赖关系 B
的健康状况直接影响到 A
的稳定性。
有准备和活性。我认为没有明显的答案,只有一个指导方针。
“Alive”表示服务仅仅是响应的,例如能够回复200 / OK的消息。
“Ready”表示服务正在按照预期工作。(最常用的API)
举个例子,在启动阶段,由于依赖组件/服务尚未准备好或处于运行状态,因此服务可能已经处于“alive”状态,但尚未准备就绪(例如DB尚未连接)。
因此,我会说,对于“ready”状态,您可能需要确保其他必要组件也处于“alive”或“ready”状态。 您需要决定的只是哪些是检查准备就绪的必要组件。
不需要在其他微服务上检查健康状况。单个微服务应该可以独立工作(根据微服务定义)。如果一个微服务依赖于另一个微服务,则可以使用fallback、断路器模式来对抗其他微服务,以使其在不失败的情况下工作。