Web日志出现Broken pipe错误:如何重现问题

最近Go项目的程序日志出现Broken pipe错误,这种错误并不多,对应的Web日志是这样的:

Web日志出现Broken pipe错误:如何重新重现问题

可以查到当请求报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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!