![Amazon EC2 中的区域之间随机超时?](https://linux22.com/image/583475/Amazon%20EC2%20%E4%B8%AD%E7%9A%84%E5%8C%BA%E5%9F%9F%E4%B9%8B%E9%97%B4%E9%9A%8F%E6%9C%BA%E8%B6%85%E6%97%B6%EF%BC%9F.png)
我在 EC2 中的两个实例之间遇到了 TCP 连接问题。当我在代码中看到如下异常时,我起初以为是我使用的工具(JRuby on Rails 堆栈 + MongoDB)出了问题:
A Mongo::OperationFailure occurred in foo#bar:
Mongo::OperationFailure
.bundle/jruby/1.8/gems/mongo-1.6.2/lib/mongo/util/tcp_socket.rb:76:in `read'
所以我认为这是一个软件问题,所以我没有想到 ServerFault。经过一番研究,我认为 JRuby 中的 IO 类可能会被阻止,但这并不准确。我继续安装了 Ruby 1.9.3,并将整个堆栈移至它。果然过了一段时间,出现了类似的异常:
A Errno::ETIMEDOUT occurred in anotherfoo#anotherbar:
Connection timed out
mongo (1.6.2) lib/mongo/util/tcp_socket.rb:70:in `readpartial'
我之所以向 serverfault 寻求帮助,是因为我确实认为这可能是 Amazon 基础设施中的一些区域间超时问题,我想知道是否有人可以验证或给我建议如何进一步调试这个问题,因为我的解决方案已经用完了。我的应用服务器位于 us-east-1a。mongodb 服务器位于 us-east-1c。也许这可能是原因?为什么我可能会使用默认的 Amazon Linux AMI(64 位,XLARGE)来获得这些超时?
答案1
新闻快讯:网络不可靠。无论是 EC2 还是本地托管,有时您的网络性能可能不如您所愿。如果您的代码无法处理这种情况,那么无论如何您都会遇到问题在哪里你主持。
话虽如此,EC2 可用区域是地理上分散,因此期望网络像 LAN 一样可靠(甚至在同一个 AZ 内)是不合理的。将事物移动到同一个 AZ可能提高可靠性,但不要希望代码不考虑偶尔出现的网络故障。因此,请修复代码,以便它能够捕获适当的异常并重试失败的操作。