【问题标题】:How to decouple application with 3rd party API's to handle downtime?如何将应用程序与 3rd 方 API 解耦以处理停机时间?
【发布时间】:2013-01-22 00:49:53
【问题描述】:

目前我有一个应用程序进行 3rd 方 API 调用,返回的数据是我在网页上显示的主要数据。

如果 API 出现故障,我的网站当前会出现故障(因超时而崩溃,并最终导致 IIS 出现故障)。

我可以采取哪些措施来防止网站宕机?

我倾向于某种监控服务,如果 API 出现故障,我会重定向到说明我的应用程序也出现故障的页面。

【问题讨论】:

  • 您如何使用您的第 3 方 API?普通的 HTTP 请求、SOAP、烟雾信号?
  • @istepaniuk 在这种情况下真的重要吗?
  • @istepaniuk 纯 http 请求。

标签: c# asp.net api design-patterns


【解决方案1】:

使用Circuit Breaker pattern。请参阅here,了解有关在 C# 中实现的一些建议。

还有read Michael Nygard’s bookthis Netflix blog post 提供很好的建议,这里有一个关于断路器的StackOverflow question

【讨论】:

    【解决方案2】:

    如果可能的话,我会亲自存储信息并根据您的要求每 X 分钟同步一次。

    如果 API 出现故障,那么您仍然有最后一批同步数据,这意味着没有停机时间。

    编辑

    如果您需要实时数据并希望在网络服务不可用时转发到页面,那么您可以执行以下操作:

    internal bool WebServiceAvailable()
    {
        bool Result = false;
        string Url = {ENTER URL}
        try
        {
            HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(Url);
            Req.Timeout = 3000;
    
            using (HttpWebResponse Rsp = (HttpWebResponse)Req.GetResponse())
            {
                if (Rsp.StatusCode == HttpStatusCode.OK)
                {
                    Result = true;   
                }
            }
        }
        catch (WebException) { }
    
        return Result;
    }
    
    if (!WebServiceAvailable() 
    {
        //Redirect to Not Available page
    }
    

    我使用它,它似乎运作良好。

    【讨论】:

    • 必须是实时结果,这就是问题所在。
    • 这不是一个好主意。即使服务关闭,您也将始终尝试发出请求。为了让您的应用程序在服务关闭期间更具响应性,您需要以某种方式限制请求。
    • 除非您检查它,否则您不会知道它已关闭……一个简单的 http 请求不会造成大问题,是吗?它没有进行任何 Web 服务调用,因此没有处理开销。
    • 如果您查看断路器模式,您会发现一种处理方式 - 您基本上限制了请求,直到有请求通过为止。此外,如果您继续使用请求(即使超时)锤击第 3 方 api,它实际上可能会因为不允许它恢复而使问题变得更糟。
    【解决方案3】:

    使用HttpWebRequest.Timeout (on MSDN) 等待一段合理的时间,捕获异常以了解何时向用户提供“稍后再试!”等信息。默认超时时间太长(100 秒) .

    如果您的业务允许,您甚至可以在失败的情况下向用户提供旧的/缓存的数据。

    【讨论】:

      【解决方案4】:

      您能否在您的网页中通过 AJAX 调用调用您的服务器端代码(我假设它调用了第 3 方 API)(也许使用 jquery 方便)。这样,如果您从 AJAX 响应中收到错误或超时,您可以相应地更新您的页面,而不会破坏您的网站。

      您可以为您的端点设置一个常规的 AJAX 轮询(反过来轮询 API 以获取心跳)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多