У меня возникла проблема с отправкой массива информации из моего client.js на сервер узла с использованием запроса http POST. Через пару дней я думаю, что сузил его.
Моя текущая установка следующая:
Сервер
- По прошествии X времени сервер начнет просить клиентов отправить собранные данные.
- Сервер отправляет только один запрос за раз, ожидая получения информации об этом клиенте, прежде чем отправить запрос следующему клиенту.
Клиент
- Клиент получает запрос от сервера
- Настроен HTTP-материал для отправки POST-запроса.
- Данные массива конвертируются в json
- Ожидается 1000 мс перед отправкой почтового запроса http
Сервер
- Почтовый запрос получен, и данные добавляются в локальный массив
Мой сервер.js
var http = require('http')
, connect = require('connect')
, io = require('socket.io')
, fs = require('fs')
, uuid = require('node-uuid')
, _ = require('lodash');
// omitted event handers & pubnub setup
var app = connect().use(connect.static(__dirname)).use(connect.directory(__dirname));
var server = http.createServer(app);
server.listen(8888);
io = io.listen(server);
// Following handles sending request to clients
function phaseTwo() {
var count = 0;
setTimeout(function() {
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
// set up server to listen for http POST
app.use(function(req, res) {
if (req.method == 'POST') {
count++;
req.on('data', function(chunk) {
// add that array into one main array
latencyData.push.apply(latencyData, chunk);
dataCollected++;
});
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
}
}); // end app.use
}, msDuration);
}
клиент
if (message.message == 'measurements') {
console.log(' Received measurements event');
var http = new XMLHttpRequest();
var url = 'http://localhost:8888/';
http.open('POST', url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// http.setRequestHeader("Content-length", latency.length);
// http.setRequestHeader("Connection", "close");
var myJsonString = JSON.stringify(latency);
setTimeout( function() {
http.send(myJsonString);
}, 1000);
}
Проблема в том, что без этой задержки в 1000 мс на стороне клиента сервер не получает все данные клиента. Хуже того, при попытке масштабировать несколько сотен клиентов, http-посты больше не отправляются на сервер после того, как 240 клиентов отправили свою информацию (для них достаточно оперативной памяти)
Без задержки со стороны клиента, делающего запрос POST, сервер должен ждать, пока текущий клиент отправит свою информацию, прежде чем продолжить. Другая проблема заключается в том, что даже при менее чем 240 клиентах, скажем, при тестировании 200 клиентов, даже без задержки принимается только около 10% их данных (эти данные записываются в текстовый файл в конце)
Я очень новичок в использовании http post/get, поэтому я думаю, что проблема в этом. Есть ли что-то сразу неправильное из-за того, что кто-то сталкивался с http или nodejs?
редактировать: я нашел одну ошибку. Вернувшись на серверную сторону, в почтовом запросе любые данные, полученные с сервера, сразу же добавляются в локальный массив на сервере без предварительной проверки того, что это массив. Я не совсем уверен, что это сломает что-то достаточно, чтобы стать источником моей проблемы.