Эта проблема относится конкретно к Nodejitsu, но подобные эффекты, похоже, происходят и на других VPS. У меня есть игра в режиме реального времени с использованием socket.io, и одна вещь, которую я заметил, - это то, что иногда сервер будет ждать чрезмерного количества времени, прежде чем отвечать. Если в течение этого таймфрейма отправляется несколько запросов, они ведут себя так, как будто все они были поставлены в очередь и обработаны сразу. Я подозреваю, что он смутно коррелирует с присутствием других пользователей на общем оборудовании (как в случае с любым VPS).
В любом случае, чтобы проверить это (и убедиться, что это не из-за моего кода игры), я построил минимальный тестовый пример:
express = require('express')
http = require('http')
app = express()
server = http.Server(app)
io = require('socket.io').listen(server)
io.sockets.on('connection', function(sock){
sock.on('perf', function(data, cb){
cb([Date.now()]); //respond with the current time
})
})
app.get('/', function(req, res){
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Methods", "HEAD,GET,PUT,POST,DELETE")
res.header("Access-Control-Allow-Headers", "X-Requested-With")
res.end(JSON.stringify([Date.now().toString()])); //http equivalent of perf function
})
server.listen(process.env.PORT || 6655, function(){
console.log('listening now')
})
У меня была простая пустая HTML-страница с socket.io, которая периодически отправляла событие perf
и время, необходимое для срабатывания обратного вызова. И это все равно показывает одно и то же:
Обратите внимание, что длина бара представляет собой квадратный корень времени, а не линейную величину.
Вместо того, чтобы полагаться на socket.io, я использую XHR для выполнения аналогичного измерения текущего времени отклика, результат довольно схож, много ответов с низкой задержкой (хотя и с более высокой базой, чем с websockets, как и ожидалось) и некоторые случайные всплески, которые, похоже, накапливаются.
Странно, что если вы откроете его в нескольких окнах браузера и разных браузерах, похоже, существует корреляция между разными браузерами (и тот факт, что он полностью отсутствует или значительно реже на некоторых серверах), что, кажется, подразумевают, что это явление на стороне сервера. Тем не менее, для некоторых браузеров есть латентные всплески, но не другие, и два окна Chrome одного и того же сеанса кажутся практически точными дубликатами, что говорит о том, что это происходит локально (на каждом компьютере или в браузере, сети мудрый).
Слева направо: Chrome Incognito, Chrome (обычный), Firefox, Chrome (обычный)
В любом случае, это несколько сбивало меня с толку, и я очень хотел бы понять, что вызывает его и как его исправить.