3

ユーザーが選択した時間に、カスタマイズされたメールを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サービスを知っていますか?

4

2 に答える 2

1

10,000のcronジョブにより、10,000の実行可能ファイルが実行されます。それがあなたが利用できる最もスケーラブルでないオプションになると思います。

于 2012-10-04T11:38:54.513 に答える
0

それはあなたの正確なニーズに依存しますが、10kのcronジョブは何があっても本当に悪いように見えます。並列処理を実現し、下部でのメール送信の遅延を回避するために、それぞれが送信するメールのバッチを選択するいくつかのcronジョブを持つことができますか?

また、「プログラムでcronを書き直す」部分については、cronライブラリを利用できます。私は通常、この種の目的でQuartzを使用していますが、ニーズに対して肥大化しすぎている可能性があるため、より軽いライブラリを使用することをお勧めします。

于 2012-10-04T11:46:48.127 に答える