0

AWS で実行される webapp を作成しています。私のアプリでは、ユーザーが PDF ファイルをアップロードする必要があります。Linuxの「変換」ユーティリティを使用して、それらを画像に変換します。Ubuntu 12.04 でのセットアップは次のとおりです。

  • ジャンゴ
  • セロリ
  • ジャンゴ セロリ
  • ボト

Web サーバーとして apache を使用しています。

ワークフローは次のとおりです。3 つは、3 つの非同期タスクと、すべての処理を処理するための 2 つのキュー、および入力ファイルと出力ファイルを格納するための S3 です。ユーザーが pdf をアップロードすると、次のようになります。

  1. accept_file_task が呼び出されます: このタスクは、ユーザーがアップロードした pdf を受け取り、それを S3 ストレージに保存してから、input_queue(SQS) にメッセージを挿入します。

  2. check_queue_and_launch_instance_task: input_queue 内のメッセージ数を監視し続け、キューに Ec2 インスタンスの数よりも多くのメッセージがあるたびにインスタンスを起動する定期的なタスク

  3. インスタンスには、while True: ループであるブートストラップ スクリプトがあります。いずれのインスタンスも、input_queue からメッセージを選択して Subprocess.Popen("convert "+input+output) を実行し、処理済みの状態を output_queue に書き込み、生成された画像を S3 出力バケットにアップロードして、ダウンロードとして利用できるようにすることができます。リンク

  4. output_process_task: output_queue をポーリングし続ける別の定期的なタスクで、メッセージが利用可能になるたびに、以下の表のステータスを更新します。

Document というモデルを使用して、すべてのステータス情報を保存しています。また、ユーザーを登録しているため、すべてのユーザー情報を格納するテーブルがあります。また、Celery はすべてのタスク情報を格納するために多くのテーブルを作成しました。現在、単一のインスタンスと、そのインスタンスで sqlite3 データベース (python に付属) を使用しています。

以下の点が不安です

  1. データベースをスケールアップするにはどうすればよいですか? RDS か、simpleDB か、AmazonDB か。セロリでなければ、simpleDB を簡単に使用できたはずです。私は本当にこれに立ち往生しています

  2. check_queue_and_launch_instance_task と output_process_task という 2 つの定期的なタスクを削除するにはどうすればよいですか。私の考えでは、後の段階で必要に応じて Elastic Load Balancer を使用できるように、Autoscaling を何らかの方法で使用する必要があります。

あなたの誰かが似たようなものを設計した場合は、それをどうやって進めるか教えてください

4

1 に答える 1

0

データベースをスケールアップするにはどうすればよいですか? RDS か、simpleDB か、AmazonDB か。セロリでなければ、simpleDB を簡単に使用できたはずです。私は本当にこれに立ち往生しています

時期尚早の最適化は諸悪の根源であることを心に留めておいてください。RDS (実際には MySQL、Oracle、または MS SQL にすぎません) と SimpleDB の問題は、スケーラビリティに基づくというよりも、アプリケーションの設計上の決定です。SimpleDB は単純なキーと値のストアです。一方、RDS は完全なACID機能を提供します。データがリレーショナルの場合は、リレーショナル データベースを使用する必要があります。単純な文字列または整数を格納する場所が必要な場合は、SimpleDB のようなものがより理にかなっています。

現在、単一のインスタンスと、そのインスタンスで sqlite3 データベース (python に付属) を使用しています。

a) 設計に単一障害点を作成することの結果、および b) このアプリケーションでスタンドアロン RDBMS を使用する場合と比較した SQLite の制限を理解していることを確認してください。(使用することはできますが、実際にはシングル ユーザー アプリケーションを対象としています)。

check_queue_and_launch_instance_task と output_process_task という 2 つの定期的なタスクを削除するにはどうすればよいですか。私の考えでは、後の段階で必要に応じて Elastic Load Balancer を使用できるように、Autoscaling を何らかの方法で使用する必要があります。

Celery をSQS に置き換えたい場合は、SQS + SNS + Cloudwatchを組み合わせて、アプリのこの部分を簡素化できます。あなたがしていることは悪い選択のようには聞こえませんが、特にそれがすでにうまく機能している場合はなおさらです。あなたの時間は、今後発生する可能性のある問題よりも、目の前の問題に取り組むほうがよいでしょう。

于 2013-01-25T15:13:17.207 に答える