5

Web アプリケーション (ASP.NET / SQL Server) の 1 つにIMAP 電子メール統合を追加しようとしています。最も重要な IMAP 機能 (フォルダー リストの取得、メッセージ ヘッダーの取得、MIME メッセージの取得など) を公開する商用ライブラリを既に使用しています。)

IMAP サーバーから「ライブ」で電子メール データを取得することは非常にうまく機能します。しかし、ここで難しい作業が発生します。メール/フォルダーキャッシュ SQL データベースを IMAP サーバーと同期させておく必要があります(さまざまな基準を適用してデータを表示する必要があります)。

私たちのデータベース スキーマには、基本的に "Folders" テーブルと "Emails" テーブルが含まれています。「メール」テーブルには、主に「FromAddress」、「FromName」、「IsRead」、「IsAnswered」、「IsForwarded」、「HasAttachments」などのヘッダー情報が含まれます (メールの内容や添付ファイルは含まれません)

2 つの主要なシナリオを検討する必要があります。

  1. すべてのメッセージを初めて取得する (またはユーザーがフォルダーを再編成した後)
  2. 新しい/最近のメッセージを取得する

パフォーマンスが主要な設計基準であることを考えると、メールサーバーとデータベースサーバーを最新の状態に保つための適切な同期戦略は何でしょうか (見つけるために、接続するたびに何千ものメッセージを照会/比較することはできません)ユーザーがいくつかの古い電子メールを移動または削除した場合)。

ありがとう!

4

1 に答える 1

2

ライブラリの機能リストから:

UniqueId のサポートの向上: メッセージの一意の ID を要求するためのオプションがさらに追加されました。IMAP サーバーへの往復旅行のメッセージの DataTable で UniqueId を返すことができるようになりました。

と:

  • 新しいメッセージのみを取得する
  • フラグ付きメッセージの検索
  • メッセージを既読としてマーク/マーク解除

ライブラリには、SQL サーバーの同期を維持するために必要なすべてのサポートが備わっているように見えます。プログラムでメッセージを既読としてマークすることができ、ライブラリは新しいメッセージのみの取得をサポートします。これで 2 番目の項目が処理されます。

戦略は、ソリューションがどのように機能するかによって部分的に異なります。あなたの質問を正しく読んだ場合、同期の観点から、ユーザーは IMAP サーバーで電子メールを管理し、SQL サーバーは IMAP サーバーに「サブスクライブ」されています。

これが正しければ、同期は実質的にバックグラウンド タスクです。私のアプローチは、ユーザーごとにイベント モデルを使用して同期することです。可能であれば、ユーザーのアクティビティ (新規/削除された電子メール) があるときに同期プログラムに「通知」します。同期ジョブをまとめてバッチ処理するバックグラウンド プロセスに同期「ジョブ」を追加します。通知モデルにより、同期プログラムが同期を必要とするユーザーに対してのみ機能することが保証されます。

小さな新しい/削除された電子メール同期ジョブは 1 つの「プロセッサ」に送られ、完全な再同期やフォルダの再編成などの大きなジョブは別の「プロセッサ」に送られます。全体的なスループットを高く保つために、非常に大きな再同期ジョブを分割する必要がある場合があります。「小さなジョブ」と「大きなジョブ」のプロセッサは、パフォーマンスと設計上の考慮事項に応じて、2 つの異なるサービスまたは 2 つの異なるスレッドになる可能性があります。

于 2009-03-02T17:31:20.493 に答える