【问题标题】:Web client polls backend to check it's upWeb 客户端轮询后端以检查它是否已启动
【发布时间】:2018-09-27 08:33:30
【问题描述】:
Web 客户端应仅在后端 API 启动并运行时公开某些功能。因此,我正在寻找一种干净的方法来监控此后端的可用性。
作为快速修复,我创建了一个基于计时器的函数,该函数在 API 根上执行基本 GET。它不是很干净,会产生大量流量,并且会因错误而污染 javascript 控制台(以防服务器停机)。
这种情况应该如何处理?
【问题讨论】:
标签:
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 来发布后端状态。
如果您的后端托管在云平台上,它可能已经存在。