【问题标题】:Web client polls backend to check it's upWeb 客户端轮询后端以检查它是否已启动
【发布时间】:2018-09-27 08:33:30
【问题描述】:

Web 客户端应仅在后端 API 启动并运行时公开某些功能。因此,我正在寻找一种干净的方法来监控此后端的可用性。

作为快速修复,我创建了一个基于计时器的函数,该函数在 API 根上执行基本 GET。它不是很干净,会产生大量流量,并且会因错误而污染 javascript 控制台(以防服务器停机)。

这种情况应该如何处理?

【问题讨论】:

  • 您使用的是服务器端 Javascript?
  • 这个问题似乎更适合Software Enginnering StackExchange 网站。但是,我想:如果 API 没有按预期响应,您可以使用 AJAx 拦截器来关闭服务。您还可以在应用程序启动时运行手动检查以确保服务已启动。
  • @ChiragRavindra 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
  • @gnat 对此一无所知。感谢您的提示!

标签: javascript http server backend


【解决方案1】:

您可以在需要时触发此行中的某些内容:

function checkServerStatus()
{
    setServerStatus("unknown");
    var img = document.body.appendChild(document.createElement("img"));
    img.onload = function()
    {
        setServerStatus("online");
    };
    img.onerror = function()
    {
        setServerStatus("offline");
    };
    img.src = "http://myserver.com/ping.gif";
}

使ping.gif 变小(1 像素)以使其尽可能快。 Ofc 你可以通过访问返回 true 并保持非常短的响应时间的 API 来更顺利地做到这一点,但这需要你在后端进行一些编码,这只需要你将 1 像素的 gif 图像放在正确的目录中在服务器上。您可以使用服务器上已经存在的任何图片,但随着图片变大,预计流量和时间会更多。

现在把它放在一些延迟调用它的函数中,或者当你需要检查状态时简单地调用它,这取决于你。

如果您需要服务器在应用关闭时向其发送通知,那么您需要实现此功能: https://en.wikipedia.org/wiki/Push_technology

理想情况下,您将拥有高可靠性服务器,该服务器具有快速响应速度,并且确实可靠地在某个时间间隔内 ping 所需服务器以确定它是否启动,然后使用推送将该信息获取到您的应用程序。这样,如果您的应用服务器的状态发生了变化,第三台服务器只会向您发送推送。理想情况下,此服务器的请求在您的应用服务器队列中具有高优先级,并且服务器连接良好且彼此靠近,但不在同一网络上,以防出现故障。

推荐:

第一种方法应该对您有好处,因为它易于实施并且需要的知识最少。

在以下情况下考虑第二个: 您需要非常短的检查间隔,使您的应用程序变慢并且网络流量更高 您有多个需要相同的应用程序 - 使每个应用程序、网络和服务器上的负载都变得更重。第二种方法让您可以使用单个 ping 来确定所有应用的真实性。

【讨论】:

    【解决方案2】:

    为了限制请求的数量,可以使用服务器发送事件的简单解决方案。该协议在 HTTP 之上使用,允许服务器推送多个更新以响应同一个客户端请求。

    客户端代码(javascript):

    var evtSource = new EventSource("backend.php");
    evtSource.onmessage = function(e) {
        console.log('status:' + e.data);
    }
    
    evtSource.onerror = function(e) {
        // add some retry then display error to the user
    }
    

    后端代码(PHP,其他语言也支持)

    header("Content-Type: text/event-stream\n\n");
    while (1) {
        // Each 30s, send OK status
        echo "OK\n";
        ob_flush();
        flush();
        sleep(30);
    }
    

    在这两种情况下,它都会限制请求的数量(每个“会话”只有 1 个),但您将打开每个客户端 1 个套接字,这对您的服务器来说也可能很重。

    如果你真的想降低工作量,你应该把它委托给外部监控平台,它可以暴露 API 来发布后端状态。 如果您的后端托管在云平台上,它可能已经存在。

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多