20

事情是这样的:

  1. 我们已经实现了一个 C++ RESTful API 服务器,带有内置的 HTTP 解析器,没有像 apache 或任何类似的标准 HTTP 服务器
  2. 它已经在亚马逊结构中使用了几个月,使用普通和 SSL 通信,没有发现与亚马逊基础设施相关的问题
  3. 我们正在使用 Amazon ELB 部署我们的第一个后端
  4. Amazon ELB 有一个可定制的健康检查系统,但也作为一个自动系统,如此处所述
  5. 我们没有发现健康检查系统发送了哪些数据的文档
  6. 后端简单挂在套接字读取指令上,最终关闭连接

我不是在寻找问题的解决方案,因为后端不是基于标准的 Web 服务器,只要有人知道 ELB 健康检查系统正在发送什么样的消息,因为我们没有找到关于此的文档,任何地方。

非常感谢您的帮助。谢谢你。

4

2 回答 2

34

Amazon ELB 有一个可定制的健康检查系统,但也作为一个自动系统,如此处所述

通过可自定义,您可能指的是通过 AWS 管理控制台(请参阅配置健康检查设置)或通过 API(请参阅ConfigureHealthCheck)配置的健康检查。

HealthCheck数据类型文档的字段Target中概述了通过这种方式配置的运行状况检查的要求:

指定被检查的实例。协议是 TCP、HTTP、HTTPS 或 SSL。有效端口的范围是一 (1) 到 65535。

笔记

  • TCP 是默认值,指定为 TCP: 端口对,例如“TCP:5000”。在这种情况下,健康检查只是尝试在指定端口上打开与实例的 TCP 连接。未能在配置的超时时间内连接被认为是不健康的。

  • SSL 也被指定为 SSL: 端口对,例如 SSL:5000。

  • 对于 HTTP 或 HTTPS 协议,情况有所不同。您必须在字符串中包含一个 ping 路径。HTTP 指定为 HTTP:port;/;PathToPing; 分组,例如“HTTP:80/weather/us/wa/seattle”。在这种情况下,将向给定端口和路径上的实例发出 HTTP GET 请求。超时时间内除“200 OK”之外的任何回答都被认为是不健康的。

  • HTTP ping 目标的总长度需要为 1024 个 16 位 Unicode 字符或更少。

[强调我的]

使用自动,您可能是指在为什么健康检查 URL 与 API 和控制台中显示的 URL 不同的原因中的段落中描述的健康检查?

除了您为负载均衡器配置的运行状况检查之外,服务还会执行第二次运行状况检查,以防止实例在未取消注册的情况下终止而导致的潜在副作用。要执行此检查,负载均衡器会在运行状况检查配置使用的同一端口上打开 TCP 连接,然后在运行状况检查完成后关闭连接。[强调我的]

段落解决方案在这里澄清了有效负载为零,即类似于上面为可配置的健康检查描述的非 HTTP/HTTPS 方法:

这种额外的健康检查不会影响您的应用程序的性能,因为它不会向您的后端实例发送任何数据。您不能禁用或关闭此运行状况检查。

总结/解决方案

假设您的RESTful API 服务器,内置 HTTP 解析器应该只服务于 HTTP,您将需要处理两个健康检查:

  1. 您将自己配置为 HTTP:port;/;PathToPing的第一个- 您将收到一个HTTP GET请求,并且必须200 OK在指定的超时期限内回答才能被认为是健康的。
  2. 第二个由服务自动配置——它将在上面配置的 HTTP 端口上打开一个 TCP 连接,不会发送任何数据,然后在健康检查完成后关闭连接。

总之,您的服务器似乎已经表现得非常好,而您只是对第二次健康检查的行为感到恼火——ELB 是否真的认为您的服务器不健康?

于 2012-04-13T12:06:49.917 回答
1

据我所知,这只是一个寻找 200 OK http 响应的 HTTP GET 请求。

于 2012-04-13T11:03:06.603 回答