6

その時点で送信されるはずの電子メールを毎分データベースでチェックするアプリケーションがあります。これを、毎分 cron ジョブによって実行される rake タスクにすることを考えていました。これに対するより良い解決策はありますか?

私が読んだことから、これは理想的ではありません。なぜなら、レーキは毎分レール環境全体をロードする必要があり、これは高価になるからです。

考え?

ありがとう。

4

4 に答える 4

11
  1. 使用できますbackgroundrb。ただし、これはメインの Rails アプリからメモリを消費します。これは、.NET 専用の Ruby インスタンスが 1 つ生成されるためbackgroundrbです。
  2. SystemControllerアプリケーションが実行する必要があるさまざまな家事タスクに対応するさまざまなアクションを使用して、メイン アプリケーションで (または同等の) を定義することもできます。またはをcrontab使用して「生成」できます。利点は、メイン アプリケーションとリソースを共有することです。あなたがどれほど偏執的であるか、または DOS (またはその他の種類の攻撃) に対して脆弱であるかに応じて、そのようなコントローラーをおそらく外の世界に公開するかどうかに応じて、ループバック (理想的にはリバース プロキシで、代わりにコントローラー自体から)。wgetcurl
于 2009-03-18T00:38:49.270 に答える
1

本当に簡単な方法の 1 つは、スクリプトを作成することです。

while true do
    check_and_send_messages()
    sleep 60
end

..つまり、Rails 環境を常に再生成しているわけではありません。

明らかにさまざまな欠点がありますが、いくつかの利点もあります (たとえば、1 分ごとに 1-Rake の場合、Rake タスクに 1 分以上かかる場合、Rake は一度に複数回実行されます)。

また、Railscasts のエピソードRake in BackgroundStarling and Workling、およびCustom Daemonでいくつかのアイデアが得られるかもしれません (これらはまさにこのタスクを説明しています)。

于 2009-03-21T04:34:49.077 に答える
1

実際には、これだけのために構築されたものがあることがわかりました: ar_mailer ar_mailer は電子メールを DB のキューに入れ、ar_mailer コマンドを使用して定期的に送信します。毎分 ar_mailer を呼び出すことができます。

ar_mailer の優れた点は、基本的に、既に電子メールを送信する方法をほとんど変更する必要がないことです。ActiveMailer の代わりに ar_mailer から継承する必要があるだけです。この方法を使用すると、rake タスクをバックグラウンドで実行したり、プロセスをフォークしたり、またはそのようなことを心配する必要がなくなります。つまり、メールが実際に送信されたときに削除される、キューに入れられたメッセージを持つ実際のメール サーバーを取得できます。この機能は、大量の電子メールを大量に送信するシステムを使用している場合に重要です。私は ar_mailer を使用してソーシャル ネットワークを構築しました。その堅牢性を証明できます。

これは、ar_mailer について詳しく説明している優れた記事です。エリックがこの問題に対する定評のあるソリューションを構築したため、独自のソリューションをここに展開しないことを強くお勧めします。

于 2009-03-21T04:44:13.750 に答える
0

私は Vlad が提案したこと (#2) を実行し、ローカル リクエストのみを受け入れます。また、特定のクエリ文字列を URL に追加する必要があるほど偏執的です。

このようにいくつかの定期的なアクションを設定しています。

于 2009-03-21T03:15:54.163 に答える