Я бы в данном случае воспользовался Futures API. При этом, саму реализацию построчного чтения файла оставил бы асинхронным.
function readFileByLinesAsync(path, callback) {
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
callback(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
callback(remaining);
}
// End
callback(null);
});
}
//----------------
// My sync code
var Sync = require('sync');
Sync(function(){
// My sync code
var future = new Sync.Future();
readFileByLinesAsync('text', function(data) {
// resume
if (data === null) return future();
//add data to mysql if data.type = foo
//...
});
// wait until we read all lines
future.yield();
// do something else..
})
(почему-то комментарии автоматически сдвигаются вправо..)
Ну а если очень хочется «синхронную» реализацию readFileByLinesAsync, тогда:
function readFileByLinesSync(path, fn) {
var future = new Sync.Future();
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
fn(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
fn(remaining);
}
// End
future();
});
future.yield();
}.async(); // < — important
//----------------
// My sync code
var Sync = require('sync');
Sync(function(){
// This will block until all lines will be passed
readFileByLinesSync('text', function(data) {
//add data to mysql if data.type = foo
//…
});
По умолчанию с реплики вообще читать нельзя. Только если принудительно указать slaveOk=1.
А Mongodelay вообще просто в списке серверов нет (для клиента).
Я тоже особо не сильно мерял, почему именно он тормозит. Интуитивно — это все их StateMachine.
Созбать объект/провалидировать/сохранить — ок. Но выбрать 100 объектов, каждый из которых содержит вложенные коллекции — лучше делать на mongodb-native.
> Кстати, сходу вопрос, а вот не пожалели что связались с нодой? Стоило ли потраченное время полученной отдачи?
Не жалею. Но и не скажу, что особо рад.
> Кстати, а чего связались со статикой на ноде против того же nginx, это хоть как-то оправдано?
Статику отдает nginx. На node написаны скрипты, которые ее собирают.
Не имею однозначного ответа на этот вопрос. Исторически так сложилось.
Когда-то были на амазоне, потом оказалось, что Rackspace дешевле и саппорт лучше + OpenStack открытая и знакомая платформа. Сейчас CDN как-то странно лагает, может переберемся обратно на Amazon.
Я работал с MemcacheQ, Amazon SQS, Active MQ… Все они неплохие. Но зачем добавлять еще одну технологию в стэк, если Redis справляется с этой задачей просто идеально?
> кто добился чего-то на Ноде и может немного позволить расслабится
Они гипер-вальяжные.
> P.S. А не много ли 300мс в среднем при такой масштабной подготовке?
Есть минимум, ниже которого отклик не может быть быстрее физически, как не масштабируй. 300ms — это золотая середина. И это не много.
> Простите, а какая нагрузка на ваш проект в целом? (сколько примерно пользователей, сколько уников в день)
~2к хостов в день
~300-500 человек онлайн
> Тот же вопрос по-другому: нужна ли вся эта чехарда с масштабированием и т.п.
А вы попробуйте без «чехарды» поднять такой проект и держать хотя бы 100 онлайн :)
(почему-то комментарии автоматически сдвигаются вправо..)
Ну а если очень хочется «синхронную» реализацию readFileByLinesAsync, тогда:
function readFileByLinesSync(path, fn) {
var future = new Sync.Future();
var input = fs.createReadStream(path);
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
fn(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
fn(remaining);
}
// End
future();
});
future.yield();
}.async(); // < — important
//----------------
// My sync code
var Sync = require('sync');
Sync(function(){
// This will block until all lines will be passed
readFileByLinesSync('text', function(data) {
//add data to mysql if data.type = foo
//…
});
// do something else…
})
А Mongodelay вообще просто в списке серверов нет (для клиента).
Там все сказано по поводу целостности и атомарных операций в mongo.
Денормализации много, на каждое денормализованное значение есть функция пересчета/починки.
Созбать объект/провалидировать/сохранить — ок. Но выбрать 100 объектов, каждый из которых содержит вложенные коллекции — лучше делать на mongodb-native.
> Если у вас не взлетела вторая, значит, не стоит переходить на нее?
Было бы время, я бы вообще выбросил mongoose из стэка.
Не жалею. Но и не скажу, что особо рад.
> Кстати, а чего связались со статикой на ноде против того же nginx, это хоть как-то оправдано?
Статику отдает nginx. На node написаны скрипты, которые ее собирают.
> < 0ms это сколько
0.9 ms
Ключевой момент — «волшебность» mongoose, а именно его StateMachine.
Когда-то были на амазоне, потом оказалось, что Rackspace дешевле и саппорт лучше + OpenStack открытая и знакомая платформа. Сейчас CDN как-то странно лагает, может переберемся обратно на Amazon.
С него чтение не происходит — это бэкап.
Mongodb journaling, Mongodelay 4h, redis slave + snapshots.
Я сам написал этот проект за 8 месяцев.
Потому что записи приходят через ajax в виде html, и нужно проассоциировать json данные с каждой конкретной записью. Через атрибут оказалось удобнее.
Они гипер-вальяжные.
> P.S. А не много ли 300мс в среднем при такой масштабной подготовке?
Есть минимум, ниже которого отклик не может быть быстрее физически, как не масштабируй. 300ms — это золотая середина. И это не много.
Поиск, например, 10-50ms.
~2к хостов в день
~300-500 человек онлайн
> Тот же вопрос по-другому: нужна ли вся эта чехарда с масштабированием и т.п.
А вы попробуйте без «чехарды» поднять такой проект и держать хотя бы 100 онлайн :)