
受信メールを処理し、それを受信メールを処理する Rails アプリに渡すシステムのアーキテクチャについて考えています。そのようなことを行うための最良の方法がわかりません。
次のように動作するはずです:
- メールはcontact@user_id.myapp.comのような宛先に送信されます
- メールサーバーはメールを受け取り、それを Rails アプリに渡します (またはそれを保存し、Rails アプリがそれを取得します)
- Rails アプリはメールを処理します (分析してから DB にスローします)
基本的には queque のように動作するはずです。メール トラフィックの突然のピークによって Rails アプリが停止することはありません。
私は完全な解決策を求めているわけではありません。ただあなたの意見を聞きたいだけです。考えられる選択肢は 3 つあります。
- Rails は Pop3 経由でメールサーバーに接続し、メッセージをダウンロードするだけです (おそらく遅い)
- メールサーバーは、POST リクエストを使用してメールを Rails APP にパイプします (おそらくこれも遅すぎるため、メール爆弾に遭遇すると Web サーバーが停止する可能性があります)
- maildir は、Rails アプリケーション サーバーのファイル システムに仮想的にリンクされており (メール サーバーとアプリケーション サーバーは別々である必要があります)、Rails はそこから直接読み取ります。
パフォーマンスとセキュリティの観点から、最善のアプローチは何だと思いますか? 何か見落としているのでしょうか? もっと良い方法はありますか? ベスト プラクティスのリソースをご存知ですか?
ありがとう!
答え1
答え2
私は、POP3 でこれを実行するアプリを見たことがあります (Spiceworks は私が思いつく 1 つの例です)。これは、アプリ サーバーをメール サーバーから分離する適切な方法であり、メール サーバーが得意とする処理に集中できるようにして、クライアントをメッセージのキューイングや保存の作業から解放できると思います。
セキュリティについて
POP3 で頭に浮かぶ問題は、デフォルトでクリアテキストの資格情報を使用することです。SSL (メール サーバーに依存) 経由で実行できれば、その懸念を軽減できます。
パフォーマンスとスケーリングについて
POP3 アクセスがそれほど遅くなるかどうかはわかりません。ファイルシステム レベルでの統合には注意が必要です。新しいメールが届くと、競合やロックの問題が発生する可能性があるからです (うーん、楽しいファイルシステム競合問題の例として、NFS 経由で maildir をマウントすることを考えてみてください)。POP3 は、メールボックス内のアイテムにアトミックにアクセスする優れた方法を提供します。
複数のコンシューマーを同じ POP3 メールボックスで同時に実行することは、おそらく問題になります (より多くのメッセージ トラフィックを処理するためにスケール アウトしようとしている場合)。そのためには、メール サーバー側でスクリプトを作成して、受信メッセージをメールボックスのグループにラウンドロビンで配布し、各コンシューマーを特定のメールボックスに結び付ける必要があります。(複数のコンシューマー アーキテクチャには IMAP の使用を検討することもできますが、これは私がよく考えずに思いついたことです。)
確かに、SMTP をコードに直接受け入れるだけの場合よりも、レイヤーが増え、ボトルネックが発生する可能性がありますが、メール サーバーの作成者がすでに行った作業をすべて活用できます。ただし、カスタム SMTP サーバー コードのスケーリングの問題よりも、メール サーバーのスケーリングの問題のほうがましです。
答え3
Rails はおそらくこの作業には適さないツールです。おそらく、stdin でメールを受け取り、それをデータベースに挿入する小さなスクリプトを書くことになるでしょう。同じ ActiveRecord コードを使用してこれを行うことができるかもしれません。その後、スクリプトにパイプしてメールを配信するように MTA を設定する必要があります。
もう少しパフォーマンスが必要な場合は、スクリプトを LTMP 経由で電子メールを受け入れるデーモンに書き直すと、メールごとにプロセスを開始するという非効率性が軽減されます。
答え4
POP の代わりに (その方法を選択する場合)、IMAP(S) を使用します。 こうすることで、操作が完了したらサーバー上で内容を「既読」のままにしておくことができます。