不要让您的微服务超时

作为家长纪律的一种形式,一些孩子被“超时”作为一种行为矫正技术。 为响应某些不可接受的行为,或反复和持续的请求“ Puuhhhleaase”,可能有必要暂时将儿童与环境隔离。 如果您看到某个服务返回了HTTP 408超时错误状态代码,则可能您有相同的感觉。

问题

网络超时可能会以几种方式引起混乱。 这些例子之一也许看起来很熟悉。

Java的Websocket可能会超时并引发如下异常:

java.net.SocketTimeoutException: Read timed out 

当连接断开时间过长时,可能会发生此类套接字超时。 对于文件传输,它应该足够开放以处理最大的文件,但是浪费了更多时间等待不可能出现的答案。 通常,您应该调查系统下游的给定服务API的SLA作为上限。

也许您已经看到Python引发了一个神秘的ECONNRESET异常,例如:

 requests.exceptions.ConnectionError (Caused by : [Errno 104] Connection reset by peer) 

这可能是连接超时,因为服务器正在尝试完成昂贵的操作。 建立数据库连接所花费的时间可能比预期的长。 连接池通常用于缓解问题,但是如果没有强制执行超时,即使从池中获取项目也可能会遇到故障或死锁。

也许您已经从stdout中的JavaScript node.js应用看到以下代理错误:

 ERR proxy: error connecting to 10.131.16.144:8081: dial tcp 10.131.16.144:8081: i/o timeout 

这可能与路由到主机有关。

背景

那么为什么会这样呢? 好吧,对于初学者来说,我想我们大多数人都可以想象网络看起来像这样:

但实际上,它可能更接近于此:

甚至争取以99.999%的正常运行时间达到五个九,也允许一些失败的请求。 添加大量与贝叶斯定理复合的微服务请求,您就有失败的秘诀。

如果您是云计算,Web服务和分布式计算领域的新手,那么您可能会误入其中之一,并因此而看到类似上述的奇怪超时错误。

“我越是看待Sun内部和外部的网络,就越能想到这些假设会给人们带来麻烦。”

–彼得·德意志

对于过去20年来一直困扰该行业的计算机网络的性质,Predix受到一些相同的假设。 Java名望的James Gosling,Bill Joy,Dave Lyon和Peter Deutsch贡献了八个经常被引用的关于理解计算机网络的谬论的例子。

  • 网络是可靠的。
  • 延迟为零。
  • 带宽是无限的。
  • 网络是安全的。
  • 拓扑不会改变。
  • 有一个管理员。
  • 运输成本为零。
  • 网络是同质的。

如果您想对这些谬论有更深入的了解,比我有更好的资源,但是重要的一点是,您需要将超时作为一种普遍现象来处理。

解决方案

有一些通常推荐的方法来处理可能发生的网络故障,尤其是在传输大型数据集时。

  1. 失败后重试
  2. 研究消息传递体系结构
  3. 检查您的代理设置

如果起初你没有成功

如果对服务的请求失败或超时,请重试。 您不会在第一次遇到困难时就放弃,也不要让您的应用程序出现。 许多库默认设置为快速失败,并且不进行任何重试,因此您可能需要调整重试,超时等的配置设置和属性。

例如,使用Apache Jclouds SDK的开发人员可以按以下方式配置其调用。 调整这些属性以在重试之间等待并限制尝试的总数非常重要。

Apache JClouds示例

在Python中,您可能正在使用requests和urllib3 Retry库,并且需要对http和https做类似的事情:

如果您正在编写JavaScript,则可能需要为async.retry库尝试一下node.js应用程序,并使用npm进行安装。

网络不可靠。 您将有延迟。 您将需要做一些额外的研究,以找到正确的方法来为您的框架,库和选择的语言添加弹性,如上面的示例所示。

取一个数字

在编写这些谬论时,我记得在通过28.8kb调制解调器下载3 MB文件时,恐惧与BBS断开了连接。 如果要传输大的二进制文件,或者等待处理大数据问题的长期请求,则可能需要研究消息传递体系结构。

在本文中,我不会对消息传递做过深入的介绍,但是可以将您的服务设计为接受请求,并为请求者提供一个参考ID,以便以后使用它们检查状态。

该请求进入队列进行处理,最终状态将完成并且可以获取结果。 在此类系统中,像EventHub,Redis和RabbitMQ这样的Predix服务可以成为有价值的资源。 您的响应中也可以采用Retry-After标头的形式。

带宽不是无限的,并且存在传输数据的成本。 当您对网络友善时,其他租户将不胜感激,并且仅在需要时使用它。

对墙怎么办

防火墙旨在保护企业的肮脏中心。 许多工业公司和传统公司都会在适当的位置安装防火墙,以阻止流向不受信任网络的任何流量。

如果您看到超时错误,则可能只需要寻找一个代理即可通过隔离墙到达目的地。

具体说明因地而异,但Predix Hello World应用程序入门详细介绍了如何处理代理连接。

尽管有最佳意图,网络也不安全。

结论

有时,事情在复杂的系统中不起作用。

如果您认为服务存在问题,可以查看SLA,检查服务状态并致电支持部门以获取指导。

在您开始之前–我希望一些早期的建议可以帮助您解决分布式计算中的一些陷阱。