【发布时间】:2018-06-16 10:27:15
【问题描述】:
我运行一个带有 3 个节点的兔子 HA 集群,并且在它们前面有一个经典的 AWS 负载均衡器 (LB)。有两个应用程序,一个发布,另一个通过 LB 消费。 当发布者应用程序开始发送 300 万条消息时,在很短的一段时间后,它的连接就会进入流控制状态。发布完成后,在发布者应用程序日志中,我可以看到所有 300 万条消息都已发送。另一方面,在消费者应用程序日志中,我只能看到 500K - 1M 条消息(运行之间有所不同),这意味着大量消息丢失了。
所以发生的情况是,在运行过程中,经典 LB 决定更改其 IP 地址或断开连接,从而丢失大量消息(有关详细信息,请参阅我的更新)。
如果我跳过 LB 并直接命中节点,在应用端进行负载平衡,则不会出现此问题。当然,在这种情况下,我失去了 ELB 的所有好处。
我的问题是:
- 为什么 LB 会更改 IP 地址并丢弃连接,这与来自发布者或流控制状态的高消息率有关吗?
- 如何配置LB,才不会出现这个问题?
更新:
这是我对正在发生的事情的理解: 我使用 AMQP 0-9-1 并在没有“publish confirms”的情况下发布,因此消息一经连接就被视为已发送。此外,rabbitmq 节点上的连接是 LB 和节点之间的连接,而不是 Publisher 应用程序和节点之间的连接。
然后LB与节点的连接进入Flow Control,Publisher App连接不被阻塞,继续以相同的速率发布。这会导致消息堆积在 LB 上。
-
然后LB决定更改IP(s)或出于任何原因断开连接并创建一个新的,导致所有堆积的消息丢失。这从 RabbitMQ 日志中清晰可见:
=警告报告==== 2018 年 1 月 6 日::10:35:50 === 关闭 AMQP 连接 (10.1.1.250:29564 -> 10.1.1.223:5672): 客户端意外关闭 TCP 连接
=信息报告==== 2018 年 1 月 6 日::10:35:51 === 接受 AMQP 连接 (10.1.1.22:1886 -> 10.1.1.223:5672)
【问题讨论】:
标签: amazon-web-services rabbitmq load-balancing amqp amazon-elb