Sep 21, 2004

Webメールの実現方法について考えてみた。

Gmailを使っていて思うところがあったのでちょっと長めですが、書いてみます。

既存のWebメールシステムは、SMTPサーバ、POP3/IMAP4サーバにadd-onする形で実現されているために、ファイルシステムをスプールとして利用します。基本的にこれらのWebメールシステムでは、ユーザの要求に応じてメッセージファイルを読み込んでメッセージをパーズし、インデックスを生成することになるため、どうしても動作が遅くなってしまいます。中には独自にインデックス情報をキャッシングするものもありますが、キャッシングのタイミングは依然としてユーザがインデックス生成を指示した時点に制限され、操作中にメールが届いた場合にはそれなりのコストを払って再度インデックス生成する必要があります。また、メッセージボディの表示は単に<pre></pre>で囲んだだけのものになることもしばしばで、もっと凝ったマークアップをしようとすれば当然の結果として動作速度が遅くなることは避けられません。

つまり、Webメールの実装上の問題点とは、インデックス生成、あるいはビュー生成のトリガーがユーザの表示要求時まで遅らされているということに他ならりません。こうした既存のWebメールの実現方法はスプールの大容量化とともに限界を迎えており、単なるadd-onサービスではなく、真っ当なWebアプリケーションサービスの実現という意味では拙過ぎると言えるでしょう。

上ではWebメールとメールスプールの関係に限って述べてきましたが、他のアプリケーションでも同様のことが当てはまります。例えば、SpamフィルターやVirusスキャナーは本質的にメッセージヘッダのパーズ処理を必要としますが、これはWebメールでも必要です。しかし、現状のようにファイルシステムをスプールとして使うことはアプリケーションごとにパーズ結果を捨ててしまうことを意味します。また、仮にある種のWebメールの実装のようにアプリケーションが独自にインデックス情報をキャッシュしたとしても、よほど工夫しない限り他のアプリケーションからはそれを利用できません。

これは結局、スプールがファイルシステム上に実現されており、かつ一義的にはSMTPサーバやPOP3/IMAP4サーバに特化されたものになっているため、あらかじめアプリケーションに適した処理の追加・変更を施せないことに起因していると考えるべきでしょう。

こうした制約をなくすには、MySQL/PostgreSQLのようなRDBMSをスプールとして利用するメールシステムを使うことが一つの解決法になります。もちろん構造データを複数アプリケーションから安全かつ高速に扱えさえすればよいわけでRDBMSには限られませんが、MySQL/PostgreSQLが現状最も安価なソリューションとして存在するという事実は認めないわけにはいきません。

さてRDBMSをスプールとして利用したとすると例えば、メッセージをスプールに蓄積する際にDateやSubjectやFrom、Toアドレスなどでインデックス化しておけば、Webメールでのインデックス生成は、処理のほとんどをSQLサーバにオフロードしてしまうことができるため、格段に容易で柔軟であるだけなく、高速化することも可能になるはずです。また、マークアップされたメッセージボディのビューもあらかじめメール受信時に生成しておけば実行時のオーバーヘッドにはなりません。Spamフィルタの類はインデックスに対する問い合わせ条件にマッチしたらそのレコードをdropするとかupdateするような単純なSQLサーバ上の操作に置き換え可能です。Gmailのようなメッセージボディの検索サービスはあらかじめ特徴語を抽出などの処理を行っておき、あと定期的にインデックスを再生成するとかすれば、受信時の処理とインデックス生成のオーバーヘッドの均衡化が図れそうです。

また、ユーザに一度に提示してみせるべきメールボディは高々数件ですし、POP3/IMAP4サーバなどが要求するスループットはサーバ・クライアント間の転送速度に束縛されますから、RDBMSがファイルシステムに比べてスループットに関して劣るとしても問題にはなりません。

こう考えてきてみると、メールシステムとRDBMSの相性は実に良いように思えます。実際、DBMailのように実装例はあります。が、比較的monolithic作りになっていて私が意図したようなフレームワークとしては設計されていないようです。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com