Python -- ZeroMQ を使用したアプリケーションの作成と ZGuide で説明されているMajordomoパターンのバリエーションの実装に忙しい。
私は、労働者とクライアントの仲介者としてブローカーを持っています。入ってくるすべてのリクエストに対して、いくつかの大規模なロギングを実行したいのですが、ブローカーがそのために時間を浪費したくありません。ブローカーはそのロギング要求を別のものに渡す必要があります。
私は2つの方法を考えました:-
その点でどちらがより良いか、より速いかわかりません。最初のオプションでは、通常のワーカーで既に使用している現在のワーカー基本クラスを使用できますが、2番目のオプションの方が実装が早いようです。
上記について、または別の解決策について、アドバイスやコメントをお願いします。
ジョナサンが提案したような標準的なツールを使用するアプローチが好きです。どのOSで作業を行っているかについては触れませんでしたが、同じ精神に従って、Pythonの標準ログモジュールをlogging.handlers.SysLogHandler
と一緒に使用して、ログメッセージを rsyslog に送信することもできます。 =サービス(どのlinux/unixでも利用可能ですが、 windowsオプション もあると思いますが、これを使用したことはありません)。
基本的に、そのシステム全体は、あなたが考えているのと同じものを実装します。ローカルプロセスは、他のユーザーが処理、処理、または書き込むためのログメッセージをキューに入れます。この場合、他の誰か(rsyslog
)は、多くの組み込み機能と柔軟性を備えた有名で実績のあるサービスです。
このアプローチのもう1つの利点は、syslogの上に構築された他のsysadminツールと製品がよりよく統合されることです。また、そのオプションを取得するためにコードを記述する必要もありません。
リモートロギングを実装するための3番目の可能性を検討することをお勧めします。標準のPythonロギングモジュールを使用する場合は、ワーカー、クライアント、ブローカーでlogging.QueueHandler
クラスを使用し、リモートロギングプロセスでlogging.QueueListener
クラスを使用することを検討できます。
アプリケーションプロセスとロギングプロセス間のトランスポートとして通常のPython multiprocessing.Queue
を使用する代わりに、ダックタイピングでZeroMQを使用して独自のQueue
置換クラスを実装し、クラスを標準Python Queue
。このようにして、アプリケーションは、単一のマルチコアコンピューターから分散型データセンターまで、どのような環境でも変更せずに実行できます。
まとめると、すべてのワーカー、クライアント、ブローカーでQueueHandler
を使用して標準のPythonロガーを使用し、QueueListener
と選択したPython logging
ハンドラーに基づいて独立したプロセスを作成して、重い伐採の解除。
これらは根本的に異なるアプローチであり、それぞれに長所と短所のセットがあり、後の開発段階でパンニングする可能性が最も高くなります。
私は2つの方法を考えました:-
- ロギング専用のワーカーを作成し、ZeroMQ IPCトランスポートを使用する
- キューでマルチプロセッシングを使用する
1つの方法は、アプローチ1と同様に、追加のロギングワーカーを用意することです。ワーカーをmemcacheロギングクラスターにログ記録させ、ロギングワーカーは現在のリソース負荷を監視し、特定のリソース負荷パラメーターを超えると、IOPが制限されたデバイス(ハードディスクなど)にログを記録します。
ジョナサンのアプローチも気に入っています。私が主にPython 2.xを使用しているため、独自のロギングバックエンドを設定してパフォーマンスエンベロープを実際にプッシュする必要がある可能性があります。
私が間違っている場合は訂正してください。しかし、私の見方では、ストレージIOPがボトルネックになっていて、本当にデータ集約的なタスクを実行しているということです。
便利な方法は、ブローカーにbrokerage
ロギングを記述された形式で実行させ、中央ブローカーインスタンス。たとえば、ブローカーの需要が非常に高く、memcachedログをストレージに書き戻す余裕がない場合は、別のアプローチをとる必要があります。
最終的にはブローカーレスモデルになる可能性があります。それは彼らの間で彼らの仕事を管理している労働者と一緒です。簡単な例では、分散ラウンドロビンアルゴリズムを使用します。