Pull to refresh
163
0
Send message
Я бы в данном случае воспользовался 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
//…
});

// do something else…

})
Напишите пример того, что вам нужно на callbacks — а я переведу на sync.
По умолчанию с реплики вообще читать нельзя. Только если принудительно указать slaveOk=1.
А Mongodelay вообще просто в списке серверов нет (для клиента).
Поклацайте вот этот доклад spf13.com/post/mongodb-e-commerce-and-transactions
Там все сказано по поводу целостности и атомарных операций в mongo.

Денормализации много, на каждое денормализованное значение есть функция пересчета/починки.
Я тоже особо не сильно мерял, почему именно он тормозит. Интуитивно — это все их StateMachine.
Созбать объект/провалидировать/сохранить — ок. Но выбрать 100 объектов, каждый из которых содержит вложенные коллекции — лучше делать на mongodb-native.
2x.

> Если у вас не взлетела вторая, значит, не стоит переходить на нее?
Было бы время, я бы вообще выбросил mongoose из стэка.
> Кстати, сходу вопрос, а вот не пожалели что связались с нодой? Стоило ли потраченное время полученной отдачи?
Не жалею. Но и не скажу, что особо рад.

> Кстати, а чего связались со статикой на ноде против того же nginx, это хоть как-то оправдано?
Статику отдает nginx. На node написаны скрипты, которые ее собирают.

> < 0ms это сколько
0.9 ms
Хотелось попробовать «сырую и спорную технологию».
Во второй статье собираюсь об этом написать.
Ключевой момент — «волшебность» mongoose, а именно его StateMachine.
Не имею однозначного ответа на этот вопрос. Исторически так сложилось.
Когда-то были на амазоне, потом оказалось, что Rackspace дешевле и саппорт лучше + OpenStack открытая и знакомая платформа. Сейчас CDN как-то странно лагает, может переберемся обратно на Amazon.
Mongodelay это специальная фича, позволяющая принудительно держать slave в 4-х часах.
С него чтение не происходит — это бэкап.
Точно. Сделаю завтра comet.tactoom.com:80
Это там, где «секрет»
Mongodb journaling, Mongodelay 4h, redis slave + snapshots.
Нас двое, но Давид — дизайнер, он не программист.
Я сам написал этот проект за 8 месяцев.
Я работал с MemcacheQ, Amazon SQS, Active MQ… Все они неплохие. Но зачем добавлять еще одну технологию в стэк, если Redis справляется с этой задачей просто идеально?
Раньше было так, дайте-ка вспомню, почему…

Потому что записи приходят через ajax в виде html, и нужно проассоциировать json данные с каждой конкретной записью. Через атрибут оказалось удобнее.
> кто добился чего-то на Ноде и может немного позволить расслабится
Они гипер-вальяжные.

> P.S. А не много ли 300мс в среднем при такой масштабной подготовке?
Есть минимум, ниже которого отклик не может быть быстрее физически, как не масштабируй. 300ms — это золотая середина. И это не много.

Поиск, например, 10-50ms.
> Простите, а какая нагрузка на ваш проект в целом? (сколько примерно пользователей, сколько уников в день)
~2к хостов в день
~300-500 человек онлайн

> Тот же вопрос по-другому: нужна ли вся эта чехарда с масштабированием и т.п.
А вы попробуйте без «чехарды» поднять такой проект и держать хотя бы 100 онлайн :)

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Registered
Activity