問題:
私はLaravel 6.2でサービスを書いています。このサービスは、指定された時間に分単位でプッシュ通知をさまざまなユーザーに送信します。ユーザーは、月、週に何回を選択するか、または日付とその時刻に通知を受け取りたいと思っています。最初は、曜日(0〜6)とUTCタイムスタンプ(16:00:00)を保存し、Artisanコマンドを毎分実行して、その分のスケジュールを確認してください。
私が知る限り、私が取ることができる2つの主要なルートがありました:
アイデアと探査:
ステップ1:ユーザーの操作
ユーザーがスケジュールを保存するときに、 CRONタブ形式 で保存してみてください。 「0 0 1 * *」のようなもの。
このストリングをエンコード/デコードしてタイムスタンプを提供できる多くのPHPライブラリが見つかります。これは、最も柔軟なスケジュール方法です。将来的には、いくつかの利用可能なライブラリの場合、このスケジュールをライブラリが期待する形式に変換するのは簡単です。
そのスケジュールをデータベーステーブルに保存します-notification_schedules
と言うと、ユーザーの操作は完了です。このステップでは計算はありません。
ステップ2:現在の時刻に一致するスケジュールを計算するためのスクリプト
次に、notification_schedules
からすべてのレコードをスキャンし、その時点で通知を送信するのに適したレコードを見つけるスクリプトを毎分実行します。レコードが適格である場合は、別のテーブルにレコードを作成します-notification_delivery
など。 rabbitmqのようなメッセージングアーキテクチャがある場合は、メッセージを作成することをお勧めします。
ステップ3:配信パイプラインを生成するスクリプト
notification_delivery
を読み取って通知を送信する2つ目のスクリプトを追加します。通知が送信されたら、フラグを付けてレコードを更新するか、レコードを削除します。このnotification_delivery
には、配達予定の場合にのみアクティブレコードがあります。
ここでは、作業を3つの非同期部分に分割しています。柔軟で疎結合にします。