我们有一个TCP应用程序,它接收我们没有设计并且不能控制的协议中的连接。 该协议将假设如果它可以建立TCP连接,那么它可以发送消息并确认该消息。
如果直接连接到计算机,这可以正常工作,如果计算机或应用程序关闭,tcp连接将被拒绝或丢弃,客户端将尝试重新发送消息。
当我们使用AWS弹性负载均衡器时,ELB将与客户端建立TCP连接,无论是否有可用的后端服务器来满足请求。 因此,如果我们的应用程序或服务器崩溃,那么我们将丢失消息。
此后不久ELB将关闭TCP连接,但这还不够好。
有没有办法制作ELB,只有在可以到达后端服务器的情况下才建立连接? 我们有什么选择(在AWS生态系统内),平衡基于TCP的服务,同时如果无法提供连接,仍然拒绝连接。
答案 0 :(得分:1)
我不认为通过ELB可以实现这一目标。按照设计,负载均衡器将管理2组连接(前端 - LB和LB - 后端)。负载均衡器将尝试最小化服务其接收的流量所花费的时间。这意味着当LB寻找要使用/重用的后端连接时,将建立FE-LB连接。所有后端主机都已死的情况就是这样一个边缘情况,你最终会看到你所看到的行为。通常情况下这并不是什么大问题,因为一旦LB发现它无法为流量提供服务,请求就会断开连接。
回到你的协议:对我而言,你将解释建立连接的能力与消息传递等同起来似乎很奇怪。听起来您正在使用TCP但不等待确认消息实际上是在目的地收到的。对我而言似乎是错误的,无论有没有负载均衡器,最终都会让你陷入困境。
并不是听起来过于悲观(我明白我们不是生活在一个理想的世界)我会在这个特定场景中做什么,如果你可以在客户端上部署其他软件,那就是使用tcp代理每当负载均衡器运行状况不佳/无法提供流量时,将自动禁用的客户端。指示客户端连接到此代理。远非理想,但它应该成功。
答案 1 :(得分:0)
您可以从ELB创建运行状况检查,以验证后端EC2实例是否在TCP端口上进行响应。见ELB Health Checks
然后,您将监视ELB发送到CloudWatch的EC2实例的运行状况。
确定TCP端口上没有任何EC2实例响应后,您可以从ELB中删除TCP侦听器。见Delete ELB Listeners
希望在那时ELB停止接受TCP连接。
注意,我还没有测试过这个解决方案。