2017-02-07 3 views
0

Голый со мной, поскольку я полностью newb для кластера, и документация не щелкает меня.Node.js Cluster для обработки данных как можно чаще

if (cluster.isMaster) 
{ 
    for (let i = 0; i < numCPUs; i++) 
    { 
    cluster.fork(); 
    } 

    for (const file in files) 
    { 
    cluster.workers.send(file); //*** 
    } 
} 
else if (cluster.isWorker) 
{ 
    process.on("message", (msg) => 
    { 
    //...Process data here... 
    }); 
} 

*** это то, что я хочу. Что-то вроде cluster.workers.send (...), которое отправляет сообщение рабочим, а тот, кто не занят, примет сообщение. Если все рабочие заняты, сообщение будет ждать отправки, пока не появится свободный рабочий.

+0

кластер узлов создаст несколько экземпляров ваших приложений. если вы хотите разрешить только одному кластеру выполнять одну задачу, вы можете использовать его с помощью redis и redlock npm module. используя этот модуль, вы можете разрешить только одному кластеру выполнять одно задание один раз среди нескольких кластеров. –

+0

Я проверю redis и redlock, но есть ли способ, которым я могу достичь этого, не добавляя дополнительной зависимости? Это было бы предпочтительнее, если возможно, с не слишком большим шаблоном. – Arman

ответ

2

Вам нужна база данных для управления очередью, если у вас будет большое количество задач, а redis будет хорошим выбором для этого, как предлагает Vinay Pandya.

Вы хотите предотвратить дополнительные зависимости, вы можете использовать массив очереди в основном процессе кластера и нажимать/перемещать задачи в/из этого массива. Чтобы определить свободный узел, вы можете поддерживать объект «узлы» и получать обратную связь от каждого узла, чтобы завершить его задачу, чтобы обновить его. Обратная связь может быть выполнена с помощью process.send.

+0

Да, вы правы, но я предлагаю вам использовать redis вместо объекта памяти, потому что если вы перезапустите приложение, весь объект исчезнет. поэтому для этого Redis Redis так быстро, как кэш-память. –

+0

Абсолютно. У меня небольшая зависимость от очень хорошего решения, это не повредит :) –

+0

Итак, я думаю, что получил то, что ожидал, не используя redis через слушателей и process.send, как предложил Bulent Vural, однако я понял, что кластеризация использует гораздо больше памяти, чем я я смогу позволить себе свою задачу. Знаете ли вы, если кластеризация с Redis сохранит память? В идеале, если у меня 10 ГБ JSON, я хочу сохранить это в памяти как 10gb, а не 10gb x (# разветвленных процессов), которые, как я думаю, сейчас происходят. Другими словами, могут ли мои процессы совместно использовать один экземпляр Redis? Огромное спасибо. – Arman

Смежные вопросы