由于对健康的定义,这很难实施
您在这里回答了自己的问题。健康检查的定义将有所不同,因为健康的内容有所不同。它还取决于发出健康检查的内容。
一个好问题要问自己:“从问询者的角度来看,受检查的服务是否按预期工作?” 如果是您,则可以对其进行定义。如果是其他团队/服务,则需要确定健康检查的标准/规格。
可能在大型组织中,您将对健康检查应执行的操作制定某种标准。弄清楚。
特别是在这里,您的webapp示例意味着它不应恢复正常,因为该webapp不正常。但也许您对“健康”的定义会将其包括为“好”。这是上述需求讨论的一部分(同样,即使只是您自己的代码)。
我的建议是假设没有在其他地方指定,则应该具有与不同故障相关的某种状态代码。当您查询Web应用程序时,它可能会返回一个错误,指出“相关服务已死”,因此您的客户端(或执行运行状况检查的任何操作)可以知道客户端已死的原因。
对于已编辑的问题:
如果业务流程系统报告任务正在运行,则认为服务正常是否足够好?
不,仅仅是因为一个进程正在运行并不意味着它没有被挂起,完全无法运行或存在其他多种可能性。
还是我们应该手动ping每个服务?
这可能有效,具体取决于应用程序功能的范围。如果验证服务响应“您还活着吗?” ping,那么这可能就是所需要的。但是,如果该服务可以轻松地“活跃且响应迅速,但实际上却无法正常工作”,那么也许您还需要检查其他事项。
还是应该走得更远,并尝试确保网络应用按照显示网页的目的进行操作?
您的健康检查需要确保所需的预期功能可以按预期运行。
如果您的应用程序返回“正常”,并且不能做它需要做的,你可能也摆脱了整个健康检查的,因为它会产生假阳性(更不用说混淆赫克出来的人试图调试问题- “嘿我们的网络服务器显示正常,为什么我们看不到该页面?')。
运行状况检查是否还必须检查某些依赖服务是否也在运行?就像数据库或业务流程系统本身一样。还是其他健康检查的责任?
这在某种程度上取决于。如果您的服务依赖于另一项服务,则该交互的性质应反映在应用程序中发送给它的API /网络调用中,并整合到运行状况检查中。
例如,从数据库读取的Web服务器需要具有有关内置数据库的状态信息-否则,如果API调用失败,则Web应用程序将完全崩溃。您可以简单地修改这些调用以将其合并到您的健康检查中。
但是,如果您的服务将事件发送给未经监听而直接监听的使用者,那么使用者的应用对应用程序的功能就不那么重要了。您的应用“正常”正在发送消息,但实际上并未接收到消息。
基本上,如果您的服务需要与其他服务进行对话并验证它们的运行状况,则至少应对此服务的运行状况检查进行基本检查。考虑到我刚才所说的内容,从概念上讲这应该是有意义的,因为您的应用程序已经在处理此问题(或者我认为是随机崩溃)。
最后,如果其中一项从属服务失效,并且Web应用程序随后发生故障,那么Web应用程序应该报告不良运行状况还是良好运行状况,因为这不是Web应用程序的故障?
上面已经基本回答了。我的建议是让您的健康检查返回提供此信息的代码/消息/任何内容。这两条信息都很重要:确保您的服务所需的依赖服务已失效,并且因此服务将无法正常工作。