ウェブベースのIMAPクライアントを構築する場合、ウェブサーバをIMAPサーバに直接接続する必要がありますか、必要なときに同期されるデータベースを中間に配置する必要がありますか?ウェブベースのIMAPクライアントには独自のデータベースが必要ですか?
答えて
あなたが質問しているという事実は、ウェブメールのフロントエンドがIMAPバックエンドで効果的に機能しないことを心配していることを意味します。私はいくつかの理由を考えることができ、私が間違っている場合は、私を修正してください:
- ウェブメールクライアントは、ステートレスであること、IMAPサーバー上の呼び出しのたくさんを行いますと、それらの多くは次のようになります本質的に繰り返す(例えば、ユーザが画面をリフレッシュするとき)。サードパーティ製のIMAPプロバイダとの大規模なネットワーク/データ/ SLA法案をラックIMAPサーバを圧倒、または
-
- :あなたは、どちらかのコールの数、およびそれらのほとんどの厳密に不必要な性質がなることを懸念しています、または
- が直接DBアクセス
- よりもはるかに遅くなりIMAPサーバは外部にあり、時には自分のデータセンターに使用できない場合があり、そしてあなたは、ウェブメールクライアントは、あなたの顧客にサービスを提供し続けることを確認する必要があります。
重要な決定事項が必要ですが、私は接続する必要があるIMAPサーバーが組織の内外にあるかどうかによって異なります。
- 内部:
- ネットワーク帯域幅またはIMAP:Webメールコンポーネントの
- パフォーマンスは、IMAPサーバ
- 外部に待ち時間に被る可能性がありあなたセージは、金銭的コストがかかる
- パフォーマンスで
- 上記のようにして、 メインIMAPサーバがオフラインの間、メールデータをミラーリングする必要があります。このような背景から
- ネットワーク帯域幅またはIMAP:Webメールコンポーネントの
データベースずに逃げることができれば、あなたが検討している、あなたは、この層を追加することになることを知っているので:
- 高価
- は、プロジェクトにかなり追加タイムライン(設計、開発、テスト用)
- プロジェクトに技術的リスクと配信リスクを追加し、
- 主要なアーキテクチャcomあなたがそうでなければやらなければならないかもしれない秘密。
内部IMAPサーバー - パフォーマンス
まず、それは実際にパフォーマンスヒットがあるかどうかを確認するために、ベンチマークにはおそらくシステムをお勧めします。私の腸は、そこに多くの応答性の高いウェブメールシステムがあるので、1つである必要はないと言います。
まず、非常に優れたIMAPプロキシサーバーが多数あり、IMAP接続を維持して待ち時間を大幅に短縮できます。例としては、
を第二に、あなたはシステムとして、IMAPサーバとウェブメール、Webアプリケーションを見れば、それはおそらく理にかなっている、あなたドンIMAPデータをさらに別のデータベースにキャッシュします。 IMAPサーバーからデータベースへのデータ待ち時間を導入し、データとデータベースの管理に手間がかかり、新たな障害点が多数発生するシステムの複雑性が導入されます。
代わりに、ウェブメールアプリで使用するためにIMAPサーバーを最適化できますか?これには、追加のサーバーを購入するか、現在のサーバーをアップグレードすることが含まれますが、同時にWebメールサーバーはそれほど小さくなく、データベースサーバーを購入する必要はありません。
IMAPサーバは、ほぼ確実にパフォーマンスのための内部キャッシュを持ち、ほぼ確実に(独自のキャッシュなどで)データベースを使用しています - 多くの手で長年にわたって調整とデバッグされて。あなたはその経験と成熟を使用することができます。
はのは、仮想的な問題を想像してみましょう - システムが大規模に成長し、パフォーマンスの問題に苦しむを開始します。それを調整する方が簡単ですし、カスタムDBのテーブルを使用してカスタムアプリケーションをスケーリング、またはそれが利用可能であり、良好な商業的サポートで広く使われている商用またはオープンソースのIMAPサーバを拡張する方が簡単です、ドキュメントをテストしましたか?
外部IMAPサーバー - トラフィックを最小限に抑え、この懸念でパフォーマンス
を最大限に彼らは時間(ネットワーク遅延)やお金に高価であるため、その目的は、IMAPプロトコルの呼び出しを最小限に抑えることです。
まず、(上記のように)あなたのネットワークが生き続けることを確認するためにIMAPProxyを使用することができますし、ユーザーがログインし。また
、私はあなたがデータベースを使用する必要があると主張するだろうが、キャッシュのモードで完全なデータモデルではなくです。
- ストアオブジェクト(メッセージ、フォルダのメタデータ、添付ファイル、など)ではなく非正規化データ
- :たとえば、NoSQLのDB(キーと値またはオブジェクトDBのいずれか)ではなく、SQL DBを使用することができますACIDの動作は、おそらく必要とされていない - それは、オブジェクトIDまたはクラスによって、ない句このように実装する
は、タスクが非常に特定またはユーザーストーリーケースを使用するようになります複合体による
データとデータベースの管理も非常に簡単になり、完全なユーザーのメールボックスが保存されません。
外部IMAPサーバ - 非接続モデル
これは、外部IMAPサービスのウェブメールクライアントを提供している、とあなたは、外部IMAPサービスがオフラインになることを定期的にそれを知って、まだあなたはまだ電子メールを提供する必要が前提ユーザーに通知します。
はここで、あなたは明らかにローカルデータベースにユーザーのメールをミラーリングする必要があります。私はあなたがローカルのIMAPサーバーを使用している建築ソリューションを見て、サードパーティのIMAPサーバーをミラーリングするために多くのオープンソースのIMAP同期ツールのいずれかを使用することをお勧めしたいです。ここでの利点は次のとおりです。
-
ウェブメールアプリに
- 、ローカルIMAPサーバーが正確に
- 同期は多くのエッジケースを持つタフな問題であるウェブメールクライアントを簡素化し、他のIMAPサーバと同じに見えます。これらのすべては以前に解決されました
- 完全なローカルIMAPサーバーを使用することで、開発コストなしでオプションのサポート付きの完全に管理可能なコンポーネントが得られます
- 一部のユーザーに外部IMAPサーバーに直接接続したり、このアーキテクチャを使用して - それはちょうどURLです
欠点は以下のとおりです。潜在的
- ラグ時間の重複メールの保存に大きなコストユーザーは新しいIMAPサーバーで最初に検出され、次にローカルに再度検出される必要があるため、新しい電子メールを表示する必要があります。
ローカルに多くのIMAPサーバのいずれかを使用することができ、同期のために、ここにいくつかの可能性がある:
(免責事項 :私はこれらのツールを使用していないmysel f)
これは完全に提供されるサービスの重要性と、あなたは私がヤフー、メールがランドンのタイミングで再ダウンロードされたrediffmailのIMAPで例を見てきました;-)
を持っている時間の量、要件によって異なり(あなたの情報のために、ブラックベリーメールサービスは最初にすべてのメールをIMAPサーバーから自分のサーバーにダウンロードし、それをデバイスに配布します)。
中間サーバーを使用すると、メールのフェッチエラー、ランダムなバグやサーバークラッシュなどの関連する問題。たとえ運命のIMAPサーバーがダウンしていても、メール関連の活動でさえ、メールの読み取り、削除、別のフォルダへの移動などの処理がより迅速になります。
問題はそれより少し複雑です。実際のメッセージを同期させることは本当の問題ではありません.UIDを使用してウェブサイトと他のクライアントが同期していることを確認できるからです。 問題は、フォルダにはUIDがないことです。毎回ダウンロードする必要があり、時間がかかることがあります。 (enterを押すとSOがポストされます。これは愚かなUXです。続行:) imapフォルダとデータベースのメッセージを複製するのは私にとっては間違っているようです。特にストレージコストが急上昇するからです。 –
私はimapからデータベースへのすべてのメッセージを複製することは良い考えではないことに同意します。しかし、データベース上の最近のメッセージをキャッシュすることは間違いありません。また、データベース内にインデックスを作成して、Webイマップクライアントが検索をより迅速かつ迅速に行うことができます。 – howanghk
私は、ユーザーがデータベースアプローチのメリットが大きく、データベースに格納されている最近のメッセージの数を制限することでストレージコストを削減できたと思います。これにより、ユーザーにはうってつけの初期ロードが与えられ、IMAPサーバーの同期を待つことなく最新の電子メールを読んで出て行くことができます。最後に接続したときにダウンロードしたものをキャッシュして、バックグラウンドで更新することで、ユーザーがサーバー同期を待つことを防ぐことができるため、データベースアプローチはフォルダの問題の解決策になる可能性があります。要するに、ユーザーはデータベースのアプローチに満足していて、それが重要です。
- 1. データベース設計:ネストされたオブジェクトには独自のテーブルが必要ですか?
- 2. Zabbixプロキシには独自の静的IPが必要ですか?
- 3. 網膜デバイスには独自のメディアクエリが必要ですか?
- 4. 関係表には独自のモデルが必要ですか?
- 5. 各パブ/サブトピックに独自の接続GCPが必要ですか?
- 6. PHP MVC - 各ページに独自のクラスが必要ですか?
- 7. モバイルウェブサイトに独自のサブドメインが必要ですか?
- 8. クライアントが独自のJWTを作成する必要があります
- 9. すべてのスレッドで独自の自動解放プールが必要ですか?
- 10. 独自のクラウドインストールのドメインを変更するには何が必要ですか?
- 11. 複数のクライアントに1つのプロジェクトのコピーが必要ですか、またはすべてのクライアントに独自のコピーがありますか?
- 12. 複雑なタッチコードのビューには独自のビューコントローラが必要ですか?
- 13. 私のドッカーイメージには独自の領事クライアントインスタンスが必要ですか?
- 14. Glassfish/JMS:各Destinatation Resourceには独自のConnection Factoryが必要ですか?
- 15. すべてのfmxlファイル(シーン)に独自のコントローラが必要ですか?
- 16. すべての派生テーブルには独自のエイリアスが必要です。エラー?
- 17. エンティティは独自のデータベーステーブルにマップする必要がありますか?
- 18. IMAPクライアントは、IMAPサーバーが受信するメッセージを自動的にフィルタできますか?
- 19. データベース内の独自のフィールドにパスワードの塩を保存する必要がありますか?
- 20. IMAPで各コマンドの前にタグが必要なのはなぜですか?
- 21. 自分のデータベースにアクセスするには何が必要ですか?
- 22. クライアントJavaScriptは独自のHTTPプロキシを使用できますか?
- 23. プロパティリストを独自のモデルオブジェクトで管理する必要がありますか?
- 24. 各コンポーネントに独自のmapDispatchToPropsを設定する必要がありますか?
- 25. インターフェイスに独自のコールバッククラスを含める必要がありますか?
- 26. 独自のGridView実装を作成する必要がありますか?
- 27. 独自のFirefox CSSを実装する必要がありますか?
- 28. C++標準では、独自のイテレータがmove/copy constructableを無効にする必要がありますか?
- 29. ウェブベースのデータベース/フォームRADツール
- 30. Xcode 4:単体テストに独自の別の方式が必要なのはなぜですか?
少なくとも、メッセージヘッダーを格納するデータベースがあります。私の経験では、IMAPサーバからヘッダを取得することで、多くのことが望まれます。また、IMAPサーバーにぶつかることなく、ユーザーがデータベース内のヘッダーのみを保管している場合は、メッセージ本体の検索以外の検索も実行できます。 –