2017-02-02 7 views
0

イベントがカレンダーに表示されるMeteor.jsアプリケーションを構築しています。Cron-job - 日付の前に[x]日/時間を送信 - ユーザーは[x]を選択できます

一部の機能は、アプリケーションが電子メールでイベントを事前にユーザに自動的に通知することです。これは固定リマインダ期間(例えば3日程度)で簡単には簡単ですが、ユーザが通知間隔を選択できるシステムを構築する必要があります。 3日、7日、3時間、24時間などとなります。

イベント収集を検索し、event date - 3 days > current dateが通知をpingしているかどうかをチェックするcronジョブを設定できますが、各ユーザーにカスタム間隔がある場合、このcronジョブを作成する方法がわかりません。

私は現在、それを処理する方法は、イベントが2つの値で保存されることです:datereminderDate。イベントがデータベースに保存されると、ユーザーが選択した間隔に基づいてreminderDateが計算されます。次に、リマインダーの設定を24時間から1週間に更新すると、すべてのイベントのreminderDateが更新される操作が実行されます。

上記の問題の解決策は、DBに数百から数千のイベントがあると、完了までにかなりの時間がかかる非常に長い操作になる可能性があるということです。より良い方法が必要でしょうか?

これをどのように処理するかアドバイスをいただければ幸いです。

答えて

1

これについてはいくつかの方法があります。特に、イベントの数、ユーザー数、およびユーザーが更新する可能性のある頻度に関する詳細情報がないと通知優先度。

ユーザがこの設定を更新する場合はとなることはほとんどありません。(標準)の場合、通知日を保存する方法が適切です。過去のものではなく将来のイベントを更新するだけで、変更の範囲を減らすことができます。

考えられるリマインダー間隔の数が限られている場合は、別の方法でも十分です。あなたの例では、24時間から1週間です。

const intervals = [1,2,3,4,5,6,7]; // days 

は、その後、あなたの毎日の cronジョブであなただけのこれらの間隔を反復処理することが可能となりましたこれらの+間隔およびアラートに一致するすべてのイベントを探します。我々は可能な間隔であると言ったとします。

let start = new Date(); 
intervals.forEach(interval => { 
    const end = start.setHours(start.getHours()+24*interval); 
    Events.find({date: {gte: start, lt: end}}).forEach(event => { 
    // send notification for each event in the interval 
    }); 
    start = end; // move the start time to the beginning of the next interval 
}); 
+0

マイケルねえ、応答のための おかげで - それは超高く評価です!間隔やイベント、ユーザーはあまりないので、ユーザーが間隔を頻繁に変更するとは思わない。私は最初のオプションのために行くことができる。 最後に数時間で、誰かが間隔設定を更新するときに作成される各ユーザーのために別々のcronジョブを持つという概念を提案しました。それは、通知を送る必要がある日付である文書の日付を保存する必要はないということです。これが可能かどうか知っていますか良いアイデアですか? – Sean

+1

ユーザーあたりのcronジョブは面白いですが、アプリケーションサーバーの再起動のケースに対処する必要があります。 –

+0

こんにちはMichel、サーバーの再起動時にcronジョブが消去されることを意味しますか? – Sean

関連する問題