sql >> データベース >  >> RDS >> Mysql

電子メールの解析と処理のアーキテクチャ

    多くの「全体像」のアーキテクチャに関する質問と同様に、最善の解決策は実際にはそれらの1つです...状況によって異なります。展開環境を制御できますか?つまり...好きな電子メールサーバーを使用できますか、それともすでにインストールされてホストされている電子メールサーバーを使用するように制限されていますか? SMTPサービスと同じマシンでコードを実行できますか?これらの質問、および他の多くの質問は、(ほぼ)最適なアーキテクチャを考え出すことを検討する必要があります。

    それを踏まえて、私はいくつかの仮定を立て、調査する価値があると思ういくつかのアイデアを提供します...

    高性能のメッセージングシステムを調べる必要があります。具体的には、RabbitMQ をご覧ください。 。 RabbitMQは信頼性が高く効率的であり、非同期の着信イベントに基づくワークロードの分散は、(私の意見では非常に優れた)チュートリアルで具体的に説明しているパターンです。

    このようなメッセージングサーバーでは、受信メールを受信するプロセスが1つあります。できれば、これはSMTPプロセスの一部として、または少なくともそれに非常に近い方法で実行されます。特に、前述の作業負荷を使用して実行されます。他に選択肢がない場合は、今のところ、cronを使用してPOPまたはIMAPを介してメッセージを収集するというアイデアが機能する必要があります。

    次に、電子メール収集プロセスはメッセージをRabbitMQキューにプッシュします。 (それは可能性はありますが、おそらく文字通りの電子メール自体ではありませんが、私は電子メールが効率的に保存されている場所への参照のように考えていました)。次に、名前付きメッセージキューにサブスクライブされている複数のワーカープロセスを実行します。次に、RabbitMQ(またはユーザーが決定したメッセージングサービス)は、これらのメッセージをラウンドロビン方式で個々のサブスクライバーに配信します。すでにロードされている場合、ワーカープロセスはメッセージをNACKするか、独自の制御フローメッセージをサービスに送り返すことができます。非常に高いワークロード(これもあなたが提案したように)では、分散システムの全体的な状態を監視するある種の管理プロセスを強くお勧めします。マネージャーは実行時の統計を収集し(将来の成長計画、最適化、およびシステム全体のリファクタリングに非常に役立ちます)、新しいワーカープロセスを起動およびシャットダウンする機能を備えています。その非常に高いワークロードに到達する前に、ワーカープロセスが安定していて、メモリの断片化などがなくても長期間存続できると仮定すると、メッセージサーバーを使用して作業を分散するだけで十分です。

    その価値については、私は電子メールプロセッサ(具体的には xmail )を作成した経験があります。 -プロジェクトを始めたばかりで、初期段階を十分に制御できる場合は、これをお勧めします)。また、私は現在、RabbitMQを使用して、主要な科学計算グリッド用のマルチエージェント結果キャッシングシステムを構築しています。

    とにかく...あなたのプロジェクトで頑張ってください!




    1. 1つの行内で異なる値を一致させる

    2. MySQLの結果とPHPforD3.jsツリーから階層JSONを作成しますか?

    3. 時系列データベースの概要

    4. MySQLiは動的更新クエリを使用してステートメントを準備しました