2012-05-25 4 views
10

私は、サードパーティのWeb APIからリアルタイムデータを取得し、それをMySQLデータベースに入れ、HTTP/JSON APIで利用できるようにするWebバックエンド/ APIプロバイダを開発中です。イベントレット/一般的な非同期入出力タスク精度

私はフラスコでAPIを提供しており、SQLAlchemy Coreを使用してDBを操作しています。

リアルタイムデータ取得のために、リクエストを送信し、返されたxmlをPythonのdictに解析して返し、サードパーティのAPIをラップする関数を持っています。これらのAPIラッパーを呼び出します。

これらの関数を、それぞれのデータを取得する他のメソッド内で呼び出し、必要に応じて(タイムゾーン変換など)処理してDBに格納します。私たちはこれらのプロセッサーを呼び出します。

私は特に非同期I/Oとイベントレットについて読んできました。私は非常に感銘を受けました。

私は、コードをつかんで自分のデータでそれを組み込むつもりですが、私は最初のいくつかの質問を持っている:それはモンキーパッチのすべてに私のために安全な

  1. のですか?私はフラスコ、SQLAlchemyと他のlibsの束を持っていると考えて、猿のパッチ(不本意なバインディングがないと仮定)の欠点はありますか?

  2. タスクを分割する必要がある粒度はなんですか?私はプロセッサを定期的に起動するプールを作成することを考えていました。次に、プロセッサーがAPIラッパーを呼び出す部分に到達すると、APIラッパーは、eventlet.green.urllib2を使用して実際のHTTPデータを取得するためのGreenPileを開始します。これは良いアプローチですか?

  3. タイムアウト - greenthreadsがハングしていないことを確認したい。イベントレットを設定するのは良いアプローチですか?グレープフルーツごとに10-15秒の時間がかかりますか?

参考までに約10種類のリアルタイムデータがあり、プロセッサは5〜10秒ごとに生成されます。

ありがとうございます!

答えて

3

私は、Flask/SQLAlchemyを非同期スタイル(またはイベント駆動型)のプログラミングモデルと混ぜるのは賢明ではないと思います。

しかし、あなたはRDBMS(MySQL)を中間ストレージとして使用していると述べているので、サードパーティのWebサービスからの結果をRDMBSに保存する非同期ワーカーを作成し、フロントエンド/ SQLAlchemy)同期?

その場合は、FlaskまたはSQLAlchemyをmonkeypatchする必要はありません。

粒度に関しては、mapreduceパラダイムを使用してWeb APIの呼び出しと処理を実行することができます。このパターンは、連続したステップを論理的に分離する方法と、関連するプロセスを制御する方法についてのいくつかのアイデアを提供します。

個人的には、これを行うために私は非同期フレームワークを使用しません。マルチプロセッシングCelery、またはHadoopのような実際のmapreduceの種類のいずれかを使用するほうが良いかもしれません。

ちょっとしたヒント:小さなものから始めて、単純でモジュラーな状態にしておき、より良いパフォーマンスが必要な場合は後で最適化してください。これはまた、情報がどのようにリアルタイムに求められるかによって大きく左右されることがあります。

+0

ご意見ありがとうございます。私はFlaskとAsync I/Oを混在させないことに同意します。私の質問からは明らかにならないはずですが、API(Flask)は非パッチ非同期I/Oプロセスで動作します。データグラバーは、単純化の目的のためにSQLAlchemy Core(ORMではなく)を使用してdbに書き込む、パッチ適用されたプロセスで実行されます。 – user1094786

+0

この場合、あなたはすでにこのようにしています。私はあなたが本当にデータグラバーのための非同期を必要とするかどうか思います。並行性の他の方法(マルチプロセッシング、セロリなど)を使用する方がよい場合があります。特に、データグラバーがCPUを大量に使用する場合は特にそうです。セロリの場合は –

+0

+1。タスクはそれのための良い候補のように見えます。 – Tisho

-1

純粋なpythonと標準のlibを使って書いたモジュールにパッチを当てても安全です。

  • いくつかの純粋なMySQLのアダプタがありますPyMysqlはSQLAlchemyのテストスイートを持ってい
  • 、あなたのケースのためのテストを実行することができます。
  • symalchemyにdialectを提供するモジュールpymysql_saがあります
  • Flaskは純粋なpythonと100%WSGI 1.0に準拠しています。サービスを提供するには、eventlet.wsgiを使用してください。

可能な限り緑色のモジュールを使用してシングルフェッチでタスクを分割します。ジョブをキューに入れます。キューはキューからジョブをフェッチし、フェッチ完了後に結果をdbに保存したり、イベントを送信したりします。または、2つのプロセスの両方。

eventlet公式文書が強く、メインモジュールの拳ラインでパッチを使用することをお勧めして、それを複数回monkey_patch呼び出すために安全です:

を更新しました。続きを読むhttp://eventlet.net/doc/patching.html

いくつかの緑色のモジュールは、イベントレットで動作することができ、それらはすべてeventlet.greenにあります。リストはbitbucketです。 標準のlibを使用する3番目のモジュールをインポートする前に、コードで緑色のモジュールを使用するか、パッチを当ててください。

monkey_patchはほんのわずかのモジュールしか受け付けません。グリーンモジュールを手動でインポートする必要があります。

def monkey_patch(**on): 
    """Globally patches certain system modules to be greenthread-friendly. 

    The keyword arguments afford some control over which modules are patched. 
    If no keyword arguments are supplied, all possible modules are patched. 
    If keywords are set to True, only the specified modules are patched. E.g., 
    ``monkey_patch(socket=True, select=True)`` patches only the select and 
    socket modules. Most arguments patch the single module of the same name 
    (os, time, select). The exceptions are socket, which also patches the ssl 
    module if present; and thread, which patches thread, threading, and Queue. 

    It's safe to call monkey_patch multiple times. 
    """  
    accepted_args = set(('os', 'select', 'socket', 
         'thread', 'time', 'psycopg', 'MySQLdb')) 
    default_on = on.pop("all",None)