Python / Djangoおよびメッセージキューに関するアドバイス
-
19-08-2019 - |
質問
Djangoには、さまざまなユースケースでユーザーに大量のメールを送信する必要があるアプリケーションがあります。明らかな理由で、これをアプリケーション内で同期的に処理したくありません。
Pythonとうまく統合できるメッセージキューサーバーに関する推奨事項はありますか、またはDjangoプロジェクトで使用しましたか?スタックの残りはApache、mod_python、MySQLです。
解決
これまでのところ、<!> quot; nice <!> quot;は見つかりませんでした。これに対する解決策。より厳密なソフトリアルタイム要件(ラベリングされている段ボール箱から写真を撮る)がありますので、おそらくアプローチの1つで十分に高速です。メールは数分待つことができると思います。
- <!> quot; todo list <!> quot; cronジョブによって処理されたデータベース内。
- <!> quot; todo list <!> quot;デーモンによってポーリングされた永続的に処理されたデータベース内。
- UDPパケットを介してWebサーバーから通知されるカスタムデーモンを使用する(現在の運用環境)。基本的に、キューを処理するためのIPスタックを備えた自分のキューイングシステム。
- メッセージブローカーとしてActiveMQを使用-これはしませんでした安定性の問題のために解決します。私にとっても、Javaデーモンは一般的に少しふっくらしています
- CouchDBでの更新トリガーの使用。素晴らしいですが、更新トリガーは重い画像処理を行うためのものではないため、私の問題にはあまり適していません。
これまでのところ、RabbitMQとXMPP / ejabebrdを問題の処理のために試したことはありませんが、次に試すべきリストに載っています。 RabbitMQは、2008年に適切なPython接続を取得し、XMPPライブラリが大量にあります。
ただし、おそらく必要なのは、ローカルマシン上で正しく構成されたメールサーバーだけです。これにより、メールをローカルメールサーバーに同期的にダンプできるため、ソフトウェアスタック全体がはるかにシンプルになります。
他のヒント
特定の場合、それは単なるメールキューであるため、簡単な方法でを使用します。 django-mailer 。良い副次的な利点として、django-mailerをスタックで見たときに活用できるほどスマートなプラグ可能なプロジェクトが他にもあります。
より一般的なキューソリューションについては、これらのいずれもまだ試すことができませんでしたが、ここで私にとってより興味深いもののリストを示します。
- pybeanstalk / beanstalkd
- ギアマンへのPythonインターフェース(これはおそらくギアマンのCバージョン) のリリースにより、おそらくはるかに興味深いものになります。 >
- memcacheQ
- stomp
- セロリー
Stompserverは適切なオプションです。軽量で、インストールが簡単で、Django / pythonから簡単に使用できます。
電子メールの送信と他のジョブの非同期処理のために、運用環境でstompserverを使用するシステムがあります。
Djangoはデータベースに電子メールを保存し、Djangoのmodel.post_saveハンドラーはstompserverにイベントを送信し、stompserverは非同期タスクを実行する(電子メールを送信する)コンシューマープロセスにイベントを渡します。
実行時に消費者プロセスを追加できるため、非常にうまくスケールアップします。2人の消費者が2倍の電子メールを送信でき、消費者は別々のマシン上にいることができます。少し複雑なのは、各コンシューマが独自の名前付きキューを必要とするため、Djangoは利用可能なコンシューマの数を把握し、ラウンドロビン方式で各キューにイベントを送信する必要があることです。 (同じキューでリッスンしている2人のコンシューマーは、両方とも各メッセージ=複製を取得します)。 1つのコンシューマプロセスのみが必要な場合、これは問題になりません。
以前は、ジョブのためにデータベースを継続的にポーリングするプロセスがありましたが、何も処理する必要がない場合でも、システムに多大な負荷がかかることがわかりました。
電子メールをデータベースに追加し、タスクスケジューラユーティリティ(cronが思い浮かぶ)が実行する別のスクリプトを作成して、電子メールを送信します。
pymq をご覧ください。 Pythonで書かれており、クライアントとHTTPで通信し、キューの監視および管理オプションのホストを許可します。
メールインフラストラクチャを使用してこれを解決するのに問題はありますか?同様に、ローカルで送信されたメールをキューに入れる独自のメールデーモンを実行するすべてのアプリサーバーは、メールを大量に処理できる集中型メールサーバーに転送しますか?
http://www.snakemq.net/ も同様に機能する可能性があります
MySQLがすでにインストールされている場合、<!> quot; todo list <!> quot;として使用するテーブルを作成できます。種類。
スレッドは同期してジョブをテーブルに追加し、バッチタスクは完了時にジョブを削除します。
この方法では、追加のソフトウェアをインストールして学習する必要はありません。また、たくさんのメールを送信しない限り、永続的なジョブストアとして正常に機能するはずです(<!> gt ; 10 / sec)。
これは、怠butだが正しい、適切な解決策です。次のデータベーステーブルをキューとして使用します。
drop table if exists mailqueue;
create table mailqueue (
id bigint primary key,
subject text not null,
body mediumtext not null,
from varchar(255) not null,
to varchar(255) not null
);
送信者は、このテーブルの最後に新しい行を挿入する必要があります。
ワーカースレッドをセットアップして、相手側(最低ID)から一度に1つずつメールをポップし、送信を試みます。