y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

BASP21一括送信(FlushMail)のパフォーマンス

ユーザ情報からメーリングリストを生成するインタフェース、リスト書き出し処理、作成したメーリングリストの検索、編集機能・・と一通りの機能が組みあがったところで、今度はパフォーマンステストに突入。
詳細な設計をしないまま組み上げ、そそくさとテストしちゃうのが一人プロジェクトの醍醐味。
結果を先に確認してから、ディテールを詰めていくやり方がなかなか楽しい。
個別にメッセージを生成して送信する流れでは、パフォーマンスが出ないのは分かりきったことなので、リストをあらかじめ抽出して外部ファイル化しておき、メッセージ作成時に、利用するSMTPサーバ、メーリングリストファイルを関連付け、FlushMailメソッドで一括送信・・・という流れにしているのだが、結果は如何に?

■条件
すべて同じメールアドレスを持つ15000ユーザを登録し、リストを生成。一括送信
※本来であれば全く異なるドメイン、アドレス宛ての送信になるので、最速のパターン

■結果
15000ユーザのアドレスリスト生成時間→22秒
15000ユーザのメール一括送信時間→957秒(16分)
1000ユーザのメール一括送信時間→76秒

アドレスリストの生成時間は、Webでレスポンスを待てない時間では無い。リクエスタイムアウトの設定次第であるが、仮に1分待てるものとすると5万件程度まではOK。
問題はやはりメール送信中の待ち時間である。16分もブラウザが止まったように見えるのはいただけない。
スケジュール実行&バックグラウンドであれば全く問題ない。
Webでレスポンスを待つ時間としては長いが、15000件のメール送信が16分ということは、1分で1000件。
これはかなり高速だと言える。単純に平均すれば64msで1通送っていることになる。

試験条件で、「同じメールアドレス宛てに15000通」というのは、(やはり)まずかったようだ。
・・・というのも、sendmailというメールサーバーは、宛先アドレスが重複する場合に、マージしてしまうらしいからだ。15000件の送信を1通に代表させてしまう。
ソースはここ
ちなみにメールクライアントで、toに同じアドレスを送っても、やはり一通しか届かないので、sendmailが重複アドレスを除外しているのだろう。
qmailの場合は、素直に複数メッセージを生成するようだ。

試験用だとはいえ、ユニークなメールアドレスを1万とか2万とか作成(メールサーバに登録)するのは勘弁だなぁ。(T_T;)
どうやろうかなぁ。実運用に近い条件でテストしたいもんなー。