0

複数の国 (日本、香港、シンガポールなど) に複数のデータセンターがあります。

これらの各場所の複数のホストでアプリケーションを実行します。おそらく合計で約 50 ~ 100 のホストです。

私は、各アプリケーションのステータスを照会し、さまざまなトリガーをそれらに送信し、実行時にそれらから他のものを取得する Python スクリプトに取り組んでいます。このスクリプトはおそらく中央サーバーにクエリを実行し、中央サーバーは各ホストで実行されているエージェントにリクエストを送信します。

要件の 1 つは、スクリプトが可能な限り応答性が高いことです。たとえば、すべての場所にあるすべてのホストのアプリケーションのステータスを照会する場合、20 ~ 30 秒ではなく、1 ~ 3 秒以内に結果を返したいと考えています。

したがって、特に必要な WAN ホップを考慮すると、各ホストを順番にクエリするのは遅すぎます。

各ホスト自体のクエリはかなり自明であると想定できます (たとえば、プロセスが実行されているかどうかなど)。

私は並行プログラミングまたは非同期プログラミングにかなり慣れていないので、ここでの入力はまったく価値があります。この問題に取り組むための「最善の」アプローチは何ですか?

  • マルチスレッドまたはマルチプロセスのアプローチを使用します。たとえば、ホストごとに新しいスレッドを生成し、それらをすべて送信してから応答を待ちますか?
  • 非同期コア、ツイスト、トルネードを使用してください - ここで適切なコメントはありますか? (asyncore はあまり人気がないように感じます。Tornado は試すのが楽しいかもしれませんが、ここでどのように使用できるかわかりませんか?)
  • ある種のメッセージ キュー (Kombu/RabbitMQ など) を使用しますか?
  • どうにかしてセロリを使って?必要な応答時間に対して十分な応答性がありますか? (例えば、上記の場合は 3 秒未満)。

乾杯、ビクター

4

2 に答える 2

1

を使用しgeventます。

どのように?

from gevent import monkey; monkey.patch_socket() # So anything socket-based now works asynchronously. 
#This should be the first line of you code!
import gevent

def query_server(server_ip):
    # do_something with server_ip and sockets

server_ips = [....]
jobs = [gevent.spawn(query_server, server_ip) for server_ip in server_ips]
gevent.joinall(jobs)
print [job.result for job in jobs]

なぜわざわざ?

  • すべてのコードは、1 つのプロセスと 1 つのスレッドで実行されます。これは、ロック、セマフォ、およびメッセージ パッシングを気にする必要がないことを意味します。
  • あなたの仕事はほとんどネットワークに縛られているようです。Gevent を使用すると、ネットワークにバインドされた作業を非同期で実行できます。つまり、コードはネットワーク接続でビジー待機せず、代わりに、データを受信したときに OS に通知させます。
  • 個人的な好みですgeventが、1 回限りの作業を行う場合に使用する最も簡単な非同期ライブラリだと思います。reactor(同様に、 a-laを開始する必要はありませんtwisted)。

それはうまくいきますか?

応答時間は、最も遅いサーバーの応答時間になります。
使用geventしてもうまくいかない場合は、ネットワークを修正する必要があります。

于 2012-12-20T11:56:06.223 に答える
0

multiprocessing.Pool、特にmap()またはmap_async()メンバーを使用します。

引数を 1 つ取る関数を作成します (例: ホスト名、またはホスト名とその他のデータのリスト/タプル)。その関数がホストにクエリを実行し、関連するデータを返すようにします。

ここで、入力変数 (ホスト名) のリストを作成し、multiprocessing.Pool.map()ormultiprocessing.Pool.map_async()を使用して関数を並列実行します。バリアントはasyncより早くデータを返し始めますが、コールバックで実行できる作業量には制限があります。

これにより、マシンが関数を並行して処理する必要があるのと同じ数のコアが自動的に使用されます。

ただし、ネットワークの遅延がある場合、python プログラムがそれについてできることはあまりありません。

于 2012-12-20T11:53:30.470 に答える