クラスタモジュールを使用するNode.jsアプリケーションでCronジョブを実行するにはどうすればよいですか?

epidemiya30

Node.jsアプリケーションでタスクをスケジュールするためにnode-cronモジュールを使用していますまた、コアクラスターモジュールを使用して、いくつかのプロセスでアプリケーションを実行したいと思います。

複数のプロセスでアプリケーションを実行すると、各プロセスでスケジュールされたタスクが実行されます(たとえば、タスクが電子メールを送信する場合、電子メールは複数回送信されます)。

クラスタモジュールと一緒にcronジョブを実行するためのベストプラクティス/可能な方法は何ですか?cronジョブのみを処理し、要求を受け入れない別のプロセスを作成する必要があります。はいの場合、どうすれば正しい方法でそれを行うことができますか?

epidemiya30

いくつかの調査の後、私は「Redisを使用した分散ロック」ソリューションに行き着きましたそのためのノードモジュールがあります:node-redis-warlock

この答えが他の誰かに役立つことを願っています。

更新最小限のサンプルコード:

var Warlock = require('node-redis-warlock'),
    redis = require('redis');

// Establish a redis client
redis = redis.createClient();

// and pass it to warlock
var warlock = new Warlock(redis);

function executeOnce (key, callback) {
    warlock.lock(key, 20000, function(err, unlock){
        if (err) {
            // Something went wrong and we weren't able to set a lock
            return;
        }

        if (typeof unlock === 'function') {
            setTimeout(function() {
                callback(unlock);
            }, 1000);
        }
    });
}

// Executes call back only once
executeOnce('every-three-hours-lock', function(unlock) {
    // Do here any stuff that should be done only once...            
    unlock();          
});

更新2より詳細な例:

const CronJob = require('cron').CronJob;
const Warlock = require('node-redis-warlock');
const redis = require('redis').createClient();
const warlock = new Warlock(redis);
const async = require('async');

function executeOnce (key, callback) {
    warlock.lock(key, 20000, function(err, unlock) {
        if (err) {
            // Something went wrong and we weren't able to set a lock
            return;
        }

        if (typeof unlock === 'function') {
            setTimeout(function() {
                callback(unlock);
            }, 1000);
        }
    });
}

function everyMinuteJobTasks (unlock) {
    async.parallel([
        sendEmailNotifications,
        updateSomething,
        // etc...
    ],
    (err) => {
        if (err) {
            logger.error(err);
        }

        unlock();
    });
}

let everyMinuteJob = new CronJob({
    cronTime: '*/1 * * * *',
    onTick: function () {
        executeOnce('every-minute-lock', everyMinuteJobTasks);
    },
    start: true,
    runOnInit: true
});

/* Actual tasks */
let sendEmailNotifications = function(done) {
    // Do stuff here
    // Call done() when finished or call done(err) if error occurred
}

let updateSomething = function(done) {
    // Do stuff here
    // Call done() when finished or call done(err) if error occurred
}

// etc...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

カスタムモジュールを使用してnode-webkitアプリケーションを作成するにはどうすればよいですか?

分類Dev

マルチモジュールmavenアプリケーションを実行するにはどうすればよいですか?

分類Dev

Herokuのnodejsアプリケーションで「アンダースコア」モジュールを使用するにはどうすればよいですか?

分類Dev

SpringアプリケーションでJFrameを実行するにはどうすればよいですか?

分類Dev

HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

分類Dev

HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

分類Dev

HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

分類Dev

nodemonでnodejsアプリケーションを実行するにはどうすればよいですか?

分類Dev

WindowsでAndroidアプリケーションを実行するにはどうすればよいですか?

分類Dev

SwingアプリケーションでJavafxステージ/シーンを実行するにはどうすればよいですか?

分類Dev

特定のJavaバージョンでアプリケーションを実行するにはどうすればよいですか?

分類Dev

特定のブランチでスケジュールされたアクションをトリガーするにはどうすればよいですか?

分類Dev

シェルスクリプトを実行するようにcronジョブを設定するにはどうすればよいですか?

分類Dev

紹介モジュールをAndroidアプリケーションに実装するにはどうすればよいですか?

分類Dev

node.jsのhttpsでのみWebサービス/アプリケーションを実行するにはどうすればよいですか?

分類Dev

Linux AMIでLaravelアプリの年間cronジョブをスケジュールするにはどうすればよいですか?

分類Dev

現在のアプリケーションから別のアプリケーションを実行するにはどうすればよいですか?

分類Dev

リモートsshターミナルからMacでJavaUIアプリケーションを実行するにはどうすればよいですか?

分類Dev

リモートsshターミナルからMacでJavaUIアプリケーションを実行するにはどうすればよいですか?

分類Dev

UMLシーケンス図:cronジョブを描画するにはどうすればよいですか?

分類Dev

アンマネージアプリケーションの優先CLR(<supportedRuntime>)を実行時に設定するにはどうすればよいですか?

分類Dev

Node.jsアプリケーションを独自のプロセスとして実行するにはどうすればよいですか?

分類Dev

サーバーが自動的にDSTを使用する場合、cronを使用してDSTに対応していないアプリケーションで夏時間を実装するスクリプトをスケジュールするにはどうすればよいですか?

分類Dev

Javaプロジェクトをアプリケーションとして実行するにはどうすればよいですか?

分類Dev

SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

分類Dev

SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

分類Dev

SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

分類Dev

Node.jsアプリケーションでsql-injectionパッケージを使用するにはどうすればよいですか?

分類Dev

現在実行中のアプリケーションのタスクバータイトルを変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    カスタムモジュールを使用してnode-webkitアプリケーションを作成するにはどうすればよいですか?

  2. 2

    マルチモジュールmavenアプリケーションを実行するにはどうすればよいですか?

  3. 3

    Herokuのnodejsアプリケーションで「アンダースコア」モジュールを使用するにはどうすればよいですか?

  4. 4

    SpringアプリケーションでJFrameを実行するにはどうすればよいですか?

  5. 5

    HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

  6. 6

    HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

  7. 7

    HerokuでSpringMVCアプリケーションを実行するにはどうすればよいですか?

  8. 8

    nodemonでnodejsアプリケーションを実行するにはどうすればよいですか?

  9. 9

    WindowsでAndroidアプリケーションを実行するにはどうすればよいですか?

  10. 10

    SwingアプリケーションでJavafxステージ/シーンを実行するにはどうすればよいですか?

  11. 11

    特定のJavaバージョンでアプリケーションを実行するにはどうすればよいですか?

  12. 12

    特定のブランチでスケジュールされたアクションをトリガーするにはどうすればよいですか?

  13. 13

    シェルスクリプトを実行するようにcronジョブを設定するにはどうすればよいですか?

  14. 14

    紹介モジュールをAndroidアプリケーションに実装するにはどうすればよいですか?

  15. 15

    node.jsのhttpsでのみWebサービス/アプリケーションを実行するにはどうすればよいですか?

  16. 16

    Linux AMIでLaravelアプリの年間cronジョブをスケジュールするにはどうすればよいですか?

  17. 17

    現在のアプリケーションから別のアプリケーションを実行するにはどうすればよいですか?

  18. 18

    リモートsshターミナルからMacでJavaUIアプリケーションを実行するにはどうすればよいですか?

  19. 19

    リモートsshターミナルからMacでJavaUIアプリケーションを実行するにはどうすればよいですか?

  20. 20

    UMLシーケンス図:cronジョブを描画するにはどうすればよいですか?

  21. 21

    アンマネージアプリケーションの優先CLR(<supportedRuntime>)を実行時に設定するにはどうすればよいですか?

  22. 22

    Node.jsアプリケーションを独自のプロセスとして実行するにはどうすればよいですか?

  23. 23

    サーバーが自動的にDSTを使用する場合、cronを使用してDSTに対応していないアプリケーションで夏時間を実装するスクリプトをスケジュールするにはどうすればよいですか?

  24. 24

    Javaプロジェクトをアプリケーションとして実行するにはどうすればよいですか?

  25. 25

    SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

  26. 26

    SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

  27. 27

    SpringMVCアプリケーションでAngular2ページを実行するにはどうすればよいですか?

  28. 28

    Node.jsアプリケーションでsql-injectionパッケージを使用するにはどうすればよいですか?

  29. 29

    現在実行中のアプリケーションのタスクバータイトルを変更するにはどうすればよいですか?

ホットタグ

アーカイブ