ユーザーが選択した時間に、カスタマイズされたメールを1日中ユーザーに送信するWebアプリがあります。そのため、1日のどの時間帯でも、何もする必要がないか、最大1万通の電子メールを送信する必要があります。
以前は、1分ごとに起動する単一のcronジョブでこれを解決していました。送信する必要のある次の1000通の電子メールを見つけるスクリプトを呼び出します。スクリプトは、それらすべてを「進行中」としてマークしてから、それらをループして送信しようとします。ループは重いです-リモートAPIを呼び出して電子メールを送信し、レコードを「送信済み」に更新し、アクションをログに記録します。私が見つけた問題は、時々、ループが壊れて失敗し、サーバーが点滅し、何百もの電子メールが「進行中」としてマークされてスタックすることです。
ループを書き直して、送信する必要のある1つのメールを取得し、「進行中」としてマークし、送信し、「送信済み」としてマークし、ログに記録してから、次のメールを取得します。必要な数のループを1分間実行します。しかし、これは本当にCPUを集中的に使用し、多くのdb呼び出しがあるため、非常に非効率的です。
私は今、毎日の電子メールにはそれぞれ独自のcronジョブが必要だと考えています。次に、 http://mydomain.com/email/123/sendのような特定のURLを呼び出す1万以上のジョブが発生します。ここでの私の懸念は、タイムゾーンやユーザー設定の更新などのためにcronジョブを更新する必要があることです(「午前10時ではなく午後6時にメールを送信してください」)。だから私はプログラムでcrontabを書き直していて、おそらく頻繁に書き直しています。
この問題をどのように解決しますか?余談ですが、この問題を解決するために設計されたWebサービスを知っていますか?