这两天遇到一个问题,ajax请求有时会连接中断,提示error:abort错误。
但是,大多数时候都正常,或者重试后正常。
经过一段时间的分析,排除对前后端程序的怀疑。
发现一个线索,如果用Charles工具重复模拟请求不会出错,而网页的请求有时会出错,为什么呢?
继续研究,现有6台前端机,一台负载均衡设备。打开网页后,ajax请求会集中于一台服务器,然后出错,又正常集中于另一台服务器。而Charles工具每次请求的服务器随机。
比较后,关注到HTTP头中的一个设置Connection:Keep-alive。
当有这个设置,网页会保持一个较长的连接,以后的ajax请求会复用这个连接,集中于一台服务器。Charles工具忽略了这个设置。
如果保持了连接,负载均衡设备又切换了服务器,连接会断开,这时的请求就会报错。
验证后,查到取消保持连接的方法:
1. jsp中:
response.setHeader("Connection", "Close");
2. nodejs中:
var express = require('express');
var app = express();
app.use(function(req, res, next) {
res.setHeader("Connection", "Close");
return next();
});
现在,ajax请求基本正常。