0

「イベント」(会議、誕生日パーティーなど)レコードのデータベースがあり、各イベントにはendTimeフィールドがあります。イベントが終了したら、過去のイベントごとに 2 ~ 3 通のメールを送信したいと考えています。

現在、1 時間ごとに cron ジョブを実行して、過去 1 時間以内に終了したすべてのイベントを検索すると、次のようになります。

  • 午後 2 時 1 分: 午後 1 時から午後 2 時までの間に終了するすべてのイベントを検索し、メールを送信します。
  • 午後 3 時 1 分: 午後 2 時から午後 3 時までの間に終了するすべてのイベントを検索し、メールを送信します。
  • 午後 4 時 1 分: 午後 3 時から午後 4 時までの間に終了するすべてのイベントを検索し、メールを送信します。
  • 午後 5 時 1 分: ...

ただし、午後 3 時 1 分のジョブが何らかの理由で失敗した場合 (Heroku が残りの API をクラッシュさせた、メール サービス プロバイダーがダウンしたなど)、午後 2 時から 3 時の間に終了したイベントはメールを受信しません。

現時点ではnotified、メールが正常に送信されたかのようにデータベース レコードがマークされていません。cronスクリプトを変更して、「現在時刻より前のすべてのレコードを検索するnotified=false」(以前に送信されていないすべてのレコードをキャッチする)ようにする必要がありますか?次に、正常に送信する電子メールの種類ごとにフラグを設定しますか?

または、フラグの設定を回避するより賢い方法はありますか?

(この質問のタイトルとタグを考えるのは地獄でした — 提案/編集を歓迎します!)

4

2 に答える 2

0

フラグの問題は、 1notifiedを効率的にするためだけにインデックスが必要であるにもかかわらず、クエリで二度と使用されないにもかかわらず TRUE 値がインデックスに残ることです。WHERE notified = FALSE

やがて、インデックスに小さな FALSE 部分 (便利です) と巨大な TRUE 部分 (スペースを浪費するだけ) ができます。DBMS でサポートされている場合は、ある種の部分インデックスを使用して、インデックスから TRUE を削除します。

または、正確に 1 つの行と 1 つのフィールド ( LAST_SENT 2 ) を持つ追加のテーブルを作成し、一連の通知が正常に送信されるたびにそのフィールドを更新します。もちろん、これにより、通知を順不同で送信することはできなくなります。失敗した通知をスキップすることはできないため、部分的な失敗を慎重に処理する必要があります。


1 FALSE をデータベースに適したものに置き換えます。

2テーブルで主キーとして自動インクリメントされた整数を使用している場合は、タイムスタンプの代わりに LAST_SENT にそれを使用することを検討して、タイムスタンプが一意でない可能性があるエッジ ケースを回避します。

于 2013-06-12T10:41:44.940 に答える