Web日志出现Broken pipe错误:如何重现问题
最近Go项目的程序日志出现Broken pipe错误,这种错误并不多,对应的Web日志是这样的:
可以查到当请求报Broken pipe错误,对应的Web日志的http状态码是499,可以断定是客户端(浏览器)还在请求接口的时候就主动断开了连接,但是奇怪的是随后的连接,客户端的端口居然没有变。猜测到因为请求是基于http 2.0的,因此tcp连接并没有断开,只是本次请求的stream断开了。
于是使用nodejs进行了模拟请求,nodejs的http2的使用文档参考这里,代码如下:
const http2 = require('node:http2');
const {NGHTTP2_CANCEL} = http2.constants;
const TOKEN = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9';
function get(se, url, timeout) {
let req1 = se.request({
':path': url,
'Token': TOKEN,
});
req1.setTimeout(timeout, () => req1.close(NGHTTP2_CANCEL));
req1.end();
req1.on('data', (chunk) => {
console.log(timeout, chunk.length)
});
}
function init() {
const session = http2.connect('https://example.cn');
session.on('error', (err) => console.error(err));
get(session, '/read6/userGuideStatus?activityId=360&type=2', 1000);
get(session, '/read6/readResourceList?activityId=360', 1); // 这里模拟499的场景
get(session, '/read6/readResourceList?activityId=360', 1000);
get(session, '/read6/getActivityInfo?organizationUserId=6292471', 1000);
}
for (let i = 0; i < 5; i++) {
init();
}
最终可以重现此问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: