web-dev-qa-db-ja.com

Flask非同期で安静なファイルのアップロード?

既存のpythonベースのモノリスソリューションをマイクロサービスに変換する作業をしています。現在のフローは非常に単純です。

入力としてXLSXを受け入れる->入力に基づいていくつかの複雑なアルゴリズムを実行する-> XMLを生成する

Flask Restplusを使用して2つのサービスを作成しました:

  • ストレージ-入力または出力ファイルの保存/ダウンロード/削除を扱います。ユーザーがxlsxファイルで/ upload /を呼び出すと、このサービスは指定されたファイルを保存し、download_urlをユーザーに返します。
  • gen-ユーザーはリクエストでdownload_urlを渡すことでこのサービスを呼び出し、このサービスはファイルをダウンロードして処理し、出力ファイルを生成し、ストレージサービスエンドポイントを呼び出してストレージに出力ファイルをアップロードします。

ただし、受信する入力ファイルのサイズが非常に大きく(〜2GB)、アップロードに時間がかかる場合があります。今、私たちは、複数のユーザーが同時に巨大なファイルをアップロードすると、私たちのシステムがトスになるのではないかと心配しています。 celery + RabbitMQを使用してgenサービスを非同期にしました。しかし、ファイルのアップロード部分で何をする必要があるのか​​わかりません。

1
Pro

私はこれらのオプションを考えることができます(注:それらのすべてがflask固有のものではありません)。

  1. アップロードするファイルのサイズを制限します。
  2. アップロードする前にファイルを圧縮します。ファイルをチャンクします this を確認できます。
  3. アップロード中にファイルをストリーミングします。すべてをメモリに保持すると、多くのリクエストを処理できなくなります。 (@joshpがコメントで述べたように)。
  4. それをバフし、システムが容量に達しているのを見たときに、より多くのリソースを提供します。アプリケーションのインスタンスをさらに呼び出します。動的に自動スケールアップおよびスケールダウンします。
  5. バックオフ/回路ブレーカー:システムが容量に達していることがわかったら、ユーザーが一時的にアップロードしたり、要求を受け取ったりして、しばらくしてから開始することをユーザーに通知しないでください。
  6. 重複排除の実装:アップロードが最も頻繁に行われる操作である場合、実装する努力に見合う価値があります。ネットワーク、コスト、時間を節約します。
  7. リアクティブフレームワーク:同時実行性(特にPython)をスレッドに依存している場合は、アップロード用のリアクティブフレームワーク(RxPyの可能性あり)をチェックする価値があります。これはリソースを効率的に利用します。 waterbutler と呼ばれるこの実装が役立つ場合は見つかりました。
2
skott