观察今天谷歌在网络中断的影响让我想到了如何在未来阻止这种情况。这可能是一个愚蠢的问题,但有一个很好的方法来包含外部API(例如,谷歌的AJAX库),以便如果API不可用,包含页面仍可以在没有它的情况下继续进行攻击吗?一般来说,使用托管在外部服务器上的库通常是个坏主意吗?
答案 0 :(得分:7)
使用脚本标记加载跨域JavasScript文件是不可避免的(如果它发生故障,这将导致超时)。但是,在您的代码中,检查API对象是否为null以避免错误:
E.g。而不是:
<script type="text/javascript">
google.load("maps", "2");
// Use Maps API
</script>
使用:
<script type="text/javascript">
if(google != null)
{
google.load("maps", "2");
// Use Maps API
}
else
{
// Fallback
}
</script>
我认为罕见的停电不值得拒绝外部API批发。
答案 1 :(得分:3)
您将希望设计您的应用程序以优雅地降级(正如其他人所说),并且实际上有一个设计模式可以用来这样做。正确实现时Proxy Pattern可以用作网守来检查服务是否可用(在许多其他用途中)并适当地向应用程序返回正确的数据,缓存数据或通知应用程序该服务是不可用。
答案 2 :(得分:2)
我能给出的最好的一般答案是, 美丽而优雅地退化。避免发送错误 。如果该服务无法使用,请期待并尽力做到最好。 乙 我不认为这是一般可以回答的问题。这取决于您的网站的功能,您正在使用的外部库/ API等等。
您可以进行某种缓存,以便仍然使用旧数据提供页面。如果允许,您可以在自己的服务器上运行API引擎。或者您可以向用户发送状态消息。
依赖外部API并不是一个坏主意,但其中一个主要缺点是你几乎无法控制它。如果它消失了?欢迎来到一个大问题。停机?你不能做多,只能等待。
答案 3 :(得分:1)
我认为使用外部库是一个好主意,因为它为我节省了带宽(读取$$)。但它很容易防止这种api中断。保留服务器和JavaScript检查是否已成功加载api。如果没有加载服务器上的那个。
我在这里考虑jQuery和YUI。其他人在使用像map这样的实际服务时是对的。
答案 4 :(得分:1)
缓解问题的一种可能性(仅在您的网站动态生成时才有效):
设置一个每10分钟/小时运行一次的cronjob,具体取决于您的关注程度。是否尝试下载您所包含的外部文件,对您依赖的每个外部主机进行一次尝试。让它在数据库中设置一个标志,表示每个外部主机当前是否可用。
生成页面时,请检查外部主机标志,并打印源属性,如果它已启动,则指向外部主机,如果它已关闭则打印本地副本。
对于奖励积分,将来自cronjob的成功下载文件变为本地副本。然后当一个人关闭时,你的本地副本代表了来自外部主机的最新版本。
答案 5 :(得分:0)
很多时候您需要通过网络访问第三方库。你需要问自己的问题是你需要多少钱,你可以缓存任何一个。
如果你的正常运行时间需要尽可能接近100%,那么你应该看看你对这些第三方的依赖程度。
如果您所获得的只是每小时一次的天气,那么您可以缓存它,以便事情继续进行。如果您要求第三方提供仅对该毫秒有效的数据,那么您可能需要查看错误处理以涵盖它可能不存在的事实。
问题的答案完全基于你的具体情况。
答案 6 :(得分:0)
在您的应用程序中包含一个开关,使用Google或本地Web服务器切换为您的YUI,JQuery或类似库提供服务,以便您可以切换提供程序,这当然相当容易。