0

我正在编写一个在AWS上运行的web应用程序。我的应用程序要求用户上传他们的PDF文件。我将使用linux中的“convert”实用程序将它们转换为Images。 这是我在Ubuntu 12.04安装:AWS芹菜和数据库

  • Django的
  • 芹菜
  • Django的芹菜
  • 博托

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

工作流程如下: 三个是三个异步任务,两个队列用于处理所有的处理,S3用于存储输入文件和输出文件。 用户上载的PDF,那么:

  1. accept_file_task被称为:此任务需要用户上传的PDF并将其存储在我的S3存储,然后插入一个消息到input_queue(SQS)

  2. check_queue_and_launch_instance_task :一个定期任务,不断监视input_queue中的消息数量,并在队列中的消息多于Ec2实例的数量时启动实例

  3. 实例具有一个True:循环的引导脚本。任何实例都可以从input_queue中选择消息并执行Subprocess.Popen(“convert”+ input +输出)并将处理后的消息写入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。我的想法是必须以某种方式使用Autoscaling,以便在稍后阶段需要时可以使用Elastic Load Balancer。

如果你们已经设计了类似的东西,请帮助我如何去了解它

回答

0

如何扩大数据库?我应该去RDS还是SimpleDB或AmazonDB。如果不是芹菜,我可以轻松使用simpleDB。我真的被困在这一个

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

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

请确保您了解a)在您的设计中创建单一故障点的后果b)与在此应用程序中使用独立RDBMS相比,SQLite的局限性。 (您可以使用它,但对于单用户应用程序,它的格式为really intended)。

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

如果您愿意用SQS替换Celery,您可以将SQS + SNS + Cloudwatch连接在一起以简化这部分应用。尽管你所做的并不是一个不错的选择,特别是如果它已经运行良好的话。你的时间可能会更好地花在面前的问题上,而不是那些可能发生的问题。

+0

感谢您的回复。我的印象是异步任务需要芹菜。请你指点一下SQS + SNS + Cloudwatch可以代替芹菜的参考资料。我可以从字面上使用SimpleDb,因为我的数据库要求不是全部关系。它将我从所有的快照创建等中拯救出来,就像我可能需要做的RDS一样。 – rajatk

+0

您实际上可以使用[SQS上的芹菜](http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html)。这对你有帮助吗? – jamieb

+0

那就是我已经在做的事情。但对于定期任务,我担心自动缩放 – rajatk