2011-04-14 15 views
2

フォーラム/ Q &のビルドの末尾にあります。コミュニティベースのアプリケーションです。電子メール通知を追加したいと思います。アプリケーションには、スレッド、質問、プロジェクト、写真など、いくつかの異なるエンティティがあります。ユーザーは、これらのエンティティの任意の数に「購読」し、エンティティが新しいコメントやアクティビティを受信するたびに電子メールをキューに入れることができます。この機能は、Facebookやフォーラムと非常によく似ています。RoRアプリケーションを使用して電子メールを送信する

私はActionMailer(レーキタスクと遅延したジョブ)、MailChimp API(とプラグイン)、その他のアプリケーションメーラ(PostageAppPostmark)を調べました。

私はActionMailerに傾倒しています。これは、メモリの混雑とサーバーの過負荷の問題があるためです。アプリはHerokuで動作しますが、数分ごとに数百のメールが送信されるとサーバーが簡単に圧倒されることがあります。

もう1つの複雑さは、ユーザーの好みに基づいてさまざまなタイプのサブスクリプション(インスタント電子メール通知、毎日の電子メール通知)が存在することです。

このような機能の電子メールを管理するにはどうすればよいでしょうか?どのようなヒント/アイデアも大歓迎です!

答えて

2

ActionMailerを使用すると、SendGridまたはPostmarkで送信できます。 PostageAppは依然としてSMTPサーバーを必要とし、追加の依存関係を追加しますが、持っているのはうれしいことです。 MailChimpは、私が信じているニュースレターのためのものです。だから、おそらくここであなたにはあまり役に立ちません。ここでは、高レベルの概要を与える

は、いくつかのことが重要である:

  1. 乱雑コントローラからメーラーロジックを保管してください。
  2. ユーザーの要求に対する応答の遅延を防止します。
  3. 「アプリケーションのオーバーロード」に関する問題を回避してください。
  4. イベントベースの電子メールと定期的な電子メールを処理します。

#1にアドレスするには、オブザーバーを使用して、イベントベースの電子メールをいつ送信するかを決定します。 #2と#3を説明するために、DelayedJobをドロップすると、メールがバックグラウンドで送信されます。 HerokuのActionMailerで簡単にSendGridを使うことができます(特にPonyをドロップした場合)。 #4の場合、ObserverのようなDJタスクとして送信ジョブを電子メールとキューに入れることを決定するビジネスロジックを処理するレーキタスクを作成するだけです。

DelayedJobは別のプロセスでジョブを実行します。 Herokuの場合、実際には別のDynoで各DelayedJobワーカーを実行しています。これは完全に別のスタック/環境です(おそらく別の物理サーバー上にあります)。もちろん、あなたのデータベースがジョブの追加に追いついていない限り(この場合、RedisをDJストアとして使用することはできません)、アプリケーションがこのように過負荷になることはありません。必要に応じてさらに多くのDJワーカーを追加することで、水平方向に簡単に拡大縮小することができます。

0

クラウドベースのバックグラウンド処理/ワーカーキューであるSimpleWorkerを見てください。

これは、Herokuのアドオンで、1回限りの投稿や予定されたメールのセットを処理するために拡大縮小できます。 (たとえば、マスタージョブをスケジュールすることができます。スケジューリングを実行するスケジュールから外れると、スケールアウトされたインフラストラクチャ全体で同時に実行されるジョブが10秒、100秒、1000秒間キューイングされます。)

Herokuの従業員は別々のプロセスとして実行されますが、可変負荷の場合は、ジョブによって規模が拡大され、規模が縮小されるサービスが必要です。 b)バーストトラフィックとバッチ出力を処理できます。

(開示:会社の仕事です)

関連する問題