繁体   English   中英

Socket.io 在节点服务器上发送过多请求后挂起

[英]Socket.io hang after sending too many request on node server

我正在使用Node js、socket.io、React js开发一个聊天应用程序,我在其中向节点服务器发送套接字事件,它调用另一个 API(节点 js)来将数据(消息)保存在 DB 上。 当我尝试非常快速地发送消息时,之后节点服务器挂起并且套接字断开连接并频繁连接 有时(大约 5 分钟)节点服务器会完美运行。 请告诉我我做错了什么。

目前,我只测试 2 个用户。

这是一个代码片段。

io.on('RequestSendNewMessage', (message)=>{
        // console.log('message', message);
        headers['wh-user-id'] = message.user_id;
        makeRequest({data: message, method: 'POST', url: `${workstream}/v1/workstream/send-message`, headers})
        .then( async (response) => {
            const message_count = await makeRequest({params: {}, method: 'GET', url: `${workstream}/v1/workstream/message-count`, headers})
            socket.emit('RespondNewMessageCount', message_count.data.data);
            socket.emit('RespondSendNewMessage', response.data);
        })
        .catch(error => {
            console.log('errror', error.response.data);
            socket.emit('newMessageError', error.response.data)
        })

    })

强烈建议在这些场景中使用消息队列...只要您调用另一个 api 执行一些 DB 操作,它会使您的节点线程忙...

为了避免这种情况,您可以将消息存储在通过套接字接收的消息队列工具(RabbitMQ)中,并关闭连接,这样可以理想地利用节点线程

稍后发布到 RabbitMQ 的消息可以由您的工作人员(单独的节点服务器)使用,它将负责将消息存储到您的数据库中并发送聊天消息....由于工作人员受到消息队列的影响,它会一个接一个(FIFO)消息工作,不会发生混乱

请参考: https://medium.com/better-programming/implementing-rabbitmq-with-node-js-93e15a44a9cc

(注意:最好把worker作为一个单独的服务器)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM