Amazon EC2中的区域之间的随机超时?

我遇到了EC2中两个实例之间的tcp连接问题。 起初我以为是我使用的工具(JRuby on Rails stack + MongoDB),当我在代码中看到以下exception时:

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' 

我来到服务器故障的原因是因为我相信这可能是亚马逊的基础设施的一些区域间超时问题,我想知道是否有任何可以validation或给我的build议,如何进一步debugging,因为我用尽了解决scheme。 我的应用程序服务器在我们东 – 1a。 mongodb服务器位于us-east-1c。 也许这可能是一个原因? 为什么我可以打赌使用默认的Amazon Linux AMI(64位,XLARGE)来获取这些超时?

快讯:networking是不可靠的。 无论是EC2还是本地可变色,有时您的networking将无法正常工作。 如果您的代码无法处理,无论您在哪里托pipe,都会遇到问题。

也就是说,EC2可用区域地理上是分散的,所以期望networking和局域网一样可靠(甚至在同一个区域内) 不合理的。 将东西移动到同一个AZ中可能会提高您的可靠性,但是不要指望您可以避开代码,避免偶尔出现的networking呃逆。 所以,修正你的代码,以便捕获适当的exception并重试失败的操作。