0

我正在编写一个在 AWS 上运行的 webapp。我的应用程序要求用户上传他们的 pdf 文件。我将使用 linux 中的“转换”实用程序将它们转换为图像。这是我在 Ubuntu 12.04 上的设置:

  • 姜戈
  • 芹菜
  • 姜芹菜
  • 博托

我使用 apache 作为我的网络服务器。

工作流程如下:三个是三个异步任务和两个用于处理所有处理的队列,以及用于存储输入和输出文件的 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+ouput) 并将处理后的声明写入 output_queue 并将生成的图像上传到 S3 输出存储桶中并使其可作为下载关联

  4. output_process_task:另一个周期性任务,它不断轮询 output_queue,只要有消息可用,它就会更新下表中的状态。

我正在使用一个名为 Document 的模型来存储所有状态信息。我也有用户注册,因此有一个表来存储所有用户信息。Celery 还创建了很多表来存储它的所有任务信息。现在我在该实例上使用单个实例和 sqlite3 数据库(python 附带)。

我不确定以下事情

  1. 如何扩展数据库?我应该选择 RDS 还是 simpleDB 或 AmazonDB。如果不是 celery,我可以很容易地使用 simpleDB。我真的坚持这个

  2. 如何摆脱两个周期性任务 check_queue_and_launch_instance_task 和 output_process_task。我的想法是必须以某种方式使用 Autoscaling,以便在以后需要时可以使用 Elastic Load Balancer。

如果你们中的任何人设计了类似的东西,请帮助我如何去做

4

1 回答 1

0

如何扩展数据库?我应该选择 RDS 还是 simpleDB 或 AmazonDB。如果不是 celery,我可以很容易地使用 simpleDB。我真的坚持这个

请记住,过早的优化是万恶之源。RDS(实际上只是 MySQL、Oracle 或 MS SQL)与 SimpleDB 的问题更多的是应用程序设计决策,而不是基于可扩展性的决策。SimpleDB 只是一个简单的键值存储。另一方面,RDS 将为您提供完整的ACID功能。如果您的数据是关系型的,那么您应该使用关系型数据库。如果你只需要一个地方来存储简单的字符串或整数,那么像 SimpleDB 这样的东西会更有意义。

现在我在该实例上使用单个实例和 sqlite3 数据库(python 附带)。

确保您了解 a) 在设计中创建单点故障和 b) SQLite 与在此应用程序中使用独立 RDBMS 相比的局限性。(您可以使用它,但它实际上是为单用户应用程序设计的)。

如何摆脱两个周期性任务 check_queue_and_launch_instance_task 和 output_process_task。我的想法是必须以某种方式使用 Autoscaling,以便在以后需要时可以使用 Elastic Load Balancer。

如果您愿意将 Celery 替换为 SQS,您可以将SQS + SNS + Cloudwatch结合在一起,以简化应用程序的这一部分。尽管您正在做的事情听起来不错,尤其是在它已经运行良好的情况下。你的时间可能最好花在解决你面前的问题上,而不是那些可能在路上发生的问题。

于 2013-01-25T15:13:17.207 回答