1

毎分タスクを実行したいので、cron を選択しました。現在、クラスターモジュールを使用してノードを実行しており、4 つのプロセスを生成していますが、1 分間にプロセスごとに 1 回だけ cron を実行したいと考えています。

これに対する1つの解決策は、マスターで実行することです。ただし、各インスタンスでクラスターを使用して複数のインスタンスを起動すると、それは役に立ちません。

そこで、ロック機構を探すことにしました。redlock を見つけました。これがサンプル コードです。

const redlock = new Redlock([redisClient], {
    driftFactor: 0.01, // time in ms
    retryCount: 2,
    retryDelay: 200 // time in ms
});

redlock.on('clientError', function (err) {
    console.error('REDLOCK REDIS ERROR: ', err);
});

const LOCK_KEY = "GOHAN_REMINDER_LOCK";
const LOCK_KEY_TTL = 10000;


const job = new CronJob({
    cronTime: '* * * * *',
    onTick: function () {
        /*
         * Runs every minute
         */
        redlock.lock(LOCK_KEY, LOCK_KEY_TTL).then(function (lock) {

            return Bluebird.try(function () {
                const currentMilitaryTime = moment.utc().format("HH:mm");

                return ChildReminder.getRemindersByDate(currentMilitaryTime).then(function (reminders) {
                    console.log("REMINDERS FOR TIME " + currentMilitaryTime + " :", reminders);
                });
            }).then(function () {
                return lock.unlock()
                    .catch(function (err) {
                        console.error("REDLOCK UNLOCK ERROR: ", err);
                    });
            });
        });

    },
    start: false,
    timeZone: 'UTC'
});

job.start();

私が得るログ:

REMINDERS FOR TIME 06:08 : [ anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 4,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399630',
    created_at: 2016-11-29T06:07:12.296Z,
    updated_at: 2016-11-29T06:07:12.296Z,
    time: '06:08',
    repeat: '1111111',
    on: true },
  anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 5,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399638',
    created_at: 2016-11-29T06:07:19.385Z,
    updated_at: 2016-11-29T06:07:19.385Z,
    time: '06:08',
    repeat: '1111111',
    on: true } ]
REMINDERS FOR TIME 06:08 : [ anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 4,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399630',
    created_at: 2016-11-29T06:07:12.296Z,
    updated_at: 2016-11-29T06:07:12.296Z,
    time: '06:08',
    repeat: '1111111',
    on: true },
  anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 5,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399638',
    created_at: 2016-11-29T06:07:19.385Z,
    updated_at: 2016-11-29T06:07:19.385Z,
    time: '06:08',
    repeat: '1111111',
    on: true } ]
REMINDERS FOR TIME 06:08 : [ anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 4,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399630',
    created_at: 2016-11-29T06:07:12.296Z,
    updated_at: 2016-11-29T06:07:12.296Z,
    time: '06:08',
    repeat: '1111111',
    on: true },
  anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 5,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399638',
    created_at: 2016-11-29T06:07:19.385Z,
    updated_at: 2016-11-29T06:07:19.385Z,
    time: '06:08',
    repeat: '1111111',
    on: true } ]
REMINDERS FOR TIME 06:08 : [ anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 4,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399630',
    created_at: 2016-11-29T06:07:12.296Z,
    updated_at: 2016-11-29T06:07:12.296Z,
    time: '06:08',
    repeat: '1111111',
    on: true },
  anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 5,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399638',
    created_at: 2016-11-29T06:07:19.385Z,
    updated_at: 2016-11-29T06:07:19.385Z,
    time: '06:08',
    repeat: '1111111',
    on: true } ]
REMINDERS FOR TIME 06:08 : [ anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 4,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399630',
    created_at: 2016-11-29T06:07:12.296Z,
    updated_at: 2016-11-29T06:07:12.296Z,
    time: '06:08',
    repeat: '1111111',
    on: true },
  anonymous {
    user_id: '764418c2-a874-495c-b8c1-cc555ce9b202',
    child_id: '8c8a273f-3a84-4a66-9fa7-bb9e6c5fcf0a',
    reminder_id: 5,
    label: 'textvoice1',
    mode: 'textvoice',
    text_message: 'How you doin\'',
    voice_message: '1480399638',
    created_at: 2016-11-29T06:07:19.385Z,
    updated_at: 2016-11-29T06:07:19.385Z,
    time: '06:08',
    repeat: '1111111',
    on: true } ]

基本的に、ジョブは4〜5回実行されますが、これは望ましくありません。どんな助けでも大歓迎です。ありがとう。

編集 #1: をretryCount0 に変更して TTL を増減しようとしましたが、必要な結果が得られませんでした。

パッケージへのリンク:

  1. レッドロック
  2. クロン
4

1 に答える 1

1

インスタンスがロックを取得し、2 番目のインスタンスがロックを取得しようとする前にそれを解放すると、両方が実行されるようです。もう少し頑丈なものが必要になります。

ノードcronivo用の小さなモジュールを作成しました。これは、laterJs と redis を使用します。少なくともいくつかのアイデアが得られるはずです。

于 2016-12-07T18:34:38.003 に答える