2016-10-15 2 views
0

간단한 소켓 js & 소켓 채팅 모델을 체크하고 있었고 약간 변경했습니다. 사용자가 서버와 소켓 연결을 만들면 250,000 개의 메시지 이벤트가 발생합니다. 서버는 모든 다른 참여자에게 해당 메시지를 보내 응답해야하며 작동합니다. 문제는 어떤 이유로 첫 번째 사용자가 250,000 개의 메시지를 모두 마친 후에 만 ​​다른 사용자가 첫 번째 메시지를 받게된다는 것입니다. 원하는 결과는 사용자와 서버 모두의 일종의 병렬 실행입니다.소켓이 루프를 지연 시키면 서버 응답이 지연됩니다.

저는 localhost/3000 및 크롬 개발자 콘솔을 사용하여 테스트했습니다. 아이디어가 있습니까? 덕분에 .

server.js :

var PORT = process.env.PORT || 3000; 
var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.use(express.static(__dirname + '/public')); 

io.on('connection', function (socket){ 
    console.log('user connected via socket.io'); 

    socket.on('message', function(message){ 
     console.log('Message received: ' + message.text); 
     socket.broadcast.emit('message', message); 
    }); 

    socket.emit('message', { 
     text: 'welcome to chat app' 
    }) 
}); 

http.listen(PORT, function(){ 
    console.log('server started'); 
}); 

app.js :

var socket = io(); 

socket.on('connect', function(){ 
    console.log('Connected to sockets.io server'); 

    for(var i = 0; i <250000; i++){ 
     socket.emit('message', { 
      text: 'welcome to chat app' 
     }) 
    } 
}); 

socket.on('message', function(message){ 
    console.log('New message ' + counter); 
}); 

답변

0

MDN에서 :

자바 스크립트 런타임 메시지 목록에이 메시지 큐를 포함 처리되어야한다. 함수는 각 메시지와 연관됩니다. 스택이 비어 있으면 메시지가 대기열에서 꺼내 져 처리됩니다. 처리는 관련 함수를 호출하여 이루어 지므로 초기 스택 프레임을 만듭니다. 스택이 다시 비게되면 메시지 처리가 종료됩니다.

루프백 인터페이스를 통한 전송은 매우 빠릅니다. 해당 콜백을 처리하고 대기열에 broadcast.emit 이벤트를 추가하기 전에 websocket message 이벤트로 node.js 메시지 대기열을 채울 수도 있습니다. 실제 네트워크를 시뮬레이션하기 위해 클라이언트에 10-100ms 지연을 추가하십시오.

관련 문제