10

私は、サードパーティの Web API からリアルタイム データを取得し、それを MySQL データベースに入れ、HTTP/JSON API 経由で利用できるようにする Web バックエンド/API プロバイダーに取り組んでいます。

API にフラスコを提供し、SQLAlchemy Core を使用して DB を操作しています。

リアルタイム データ取得部分については、リクエストを送信し、返された xml を解析して Python dict に変換し、それを返すことによってサード パーティ API をラップする関数があります。これらの API ラッパーを呼び出します。

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

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

これをデータ取得コードに組み込むつもりですが、最初にいくつか質問があります。

  1. すべてにモンキーパッチを適用しても安全ですか? 私がフラスコ、SQLAlchemy、および他の多くのライブラリを持っていることを考えると、サルのパッチ適用にマイナス面はありますか (遅延バインディングがないと仮定します)?

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

  3. タイムアウト - グリーンスレッドがハングしないようにしたい。greenthread ごとに eventlet.Timeout を 10 ~ 15 秒に設定するのは良い方法ですか?

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

ありがとう!

4

2 に答える 2

3

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

ただし、RDBMS (MySQL) を中間ストレージとして使用していると述べているため、サードパーティの Web サービスからの結果を RDMBS に格納し、フロントエンド (Flask/SQLAlchemy) の同期を維持する非同期ワーカーを作成してみませんか? ?

その場合、Flask や SQLAlchemy にモンキーパッチを適用する必要はありません。

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

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

ヒント: 小さく始めて、シンプルでモジュラーに保ち、より良いパフォーマンスが必要な場合は後で最適化してください。これは、情報をどの程度リアルタイムにしたいかによっても大きく影響を受ける可能性があります。

于 2012-05-30T13:46:14.993 に答える
-1

純粋なPythonで作成され、標準のlibを使用して作成されたモジュールにパッチを適用するのは安全です。

  • 純粋なmysqlアダプターはほとんどありません。
  • PyMysqlにはsqlalchemyテストスイートがあり、ケースのテストを実行できます。
  • sqlalchemyの方言を提供するpymysql_saという名前のモジュールがあります
  • Flaskは、純粋なpythonと100%WSGI1.0準拠で作成されています。eventlet.wsgiを使用してサービスを提供します。

可能な限りグリーンモジュールを使用して、タスクをシングルフェッチで分割します。ジョブをキューに入れます。これもeventletによって提供され、すべてのタスクワーカーがキューからジョブをフェッチし、フェッチが完了した後に結果をdbに保存するか、event.Eventオブジェクトに送信して、待機するジョブをトリガーします。タスクが終了します。または、2つのプロセスの両方。

更新しました:

イベントレットの公式文書では、メインモジュールの最初の行でパッチを使用することを強くお勧めします。monkey_patchを複数回呼び出すのは安全です。詳細については、http://eventlet.net/doc/patching.htmlページをご覧ください。

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

ただし、monkey_patchは少数のモジュールしか受け入れないため、緑色のモジュールを手動でインポートする必要があります。

defmonkey_patch(** on):
    """特定のシステムモジュールにグローバルにパッチを適用して、グリーンスレッドに対応します。

    キーワード引数を使用すると、パッチを適用するモジュールをある程度制御できます。
    キーワード引数が指定されていない場合、可能なすべてのモジュールにパッチが適用されます。
    キーワードがTrueに設定されている場合、指定されたモジュールのみにパッチが適用されます。例えば、
    `` monkey_patch(socket = True、select = True)``はselectと
    ソケットモジュール。ほとんどの引数は、同じ名前の単一のモジュールにパッチを適用します
    (os、time、select)。例外はソケットで、これもsslにパッチを適用します
    存在する場合はモジュール。スレッド、スレッド、およびキューにパッチを適用するスレッド。

    モンキーパッチを複数回呼び出すのは安全です。
    "" "    
    Accepted_args = set(('os'、'select'、'socket'、
                         'スレッド'、'時間'、'psycopg'、'MySQLdb'))
    default_on = on.pop( "all"、None)
于 2012-05-31T10:05:26.677 に答える