【问题标题】:What are some of the fastest ways to process this?处理此问题的最快方法是什么?
【发布时间】:2014-04-16 06:02:10
【问题描述】:

我的应用程序处于十字路口 - 我正在使用 python/django、mysql 和 ubuntu 12.04

我的应用程序将在线访问其他应用程序,为其路径结构制作索引并提交表单。如果您认为这种情况发生在 10 或 100 多个帐户每个拥有 1 个或多个域名的情况下,性能可能会有点失控。

我最初的想法是设置一个 ec2 环境,将访问每个域上所有这些路径的负载分配给多个 ec2 实例,每个实例都运行 celery/rabbitmq 以在这些 ec2 实例之间分配处理负载。

问题是 - 我想存储提交我访问的表单的结果。我读到我可能需要使用 nosql 数据库(例如 hadoop、redis 等)。

我的问题是:

  • 是否有不同的方式将 celery/rabbitmq 与 SQL-db 一起使用,有哪些优点/缺点? 我可以看到不得不使用 nosql 的一个问题:学习曲线。
  • 其次:是否有其他方法可以分配在多个 ec2 环境中同时运行的多个 python 脚本的(处理)负载?

谢谢。

【问题讨论】:

  • 当然可以用多台运行 celery 的机器来做到这一点。它将任务分发给从节点。至于 nosql,我会研究 redis 和 mongodb。两者都擅长他们的工作。

标签: python django performance hadoop amazon-ec2


【解决方案1】:

有没有不同的方法来使用带有 SQL-db 的 celery/rabbitmq 以及什么 是优点/缺点?我可以看到一个问题 使用 nosql:学习曲线

是的。

  1. 如果您正在谈论存储 Django 应用程序/模型数据,则可以将其与任何 SQL 类型的数据库一起使用,只要您有 Python 绑定即可。大多数流行的 SQL 数据库都有 python 绑定。

  2. 如果您指的是在特定后端存储任务结果,则支持多种数据库/协议 SQL 和 noSQL。我相信在 SQL(MySQL、Posgtgres)或 noSQL(Mongo、CouchDB)中存储结果之间没有特定的优势或劣势,但这只是我个人的看法,这取决于您正在运行的应用程序类型。这些是您可以用于 SQL 数据库的一些示例(来自他们的文档):

    # sqlite (filename) CELERY_RESULT_BACKEND = ‘db+sqlite:///results.sqlite’
    # mysql CELERY_RESULT_BACKEND = ‘db+mysql://scott:tiger@localhost/foo’
    # postgresql CELERY_RESULT_BACKEND = ‘db+postgresql://scott:tiger@localhost/mydatabase’
    # oracle CELERY_RESULT_BACKEND = ‘db+oracle://scott:tiger@127.0.0.1:1521/sidname’
    
  3. 如果指的是broker(排队机制),celery 只支持RabbitMQ 和redis。

其次:是否有其他方式来分配(处理)负载 在多个 ec2 上同时运行的几个 python 脚本 环境?

这正是 celery 所做的,您可以在多台机器上设置您的工作人员,这些机器可以是不同的 EC2 实例。然后,您所要做的就是将他们的 celery 安装指向您配置中的相同队列/代理。如果你想在你的代理(RabbitMQ 和/或 Redis)中实现冗余,你应该考虑在集群配置中设置它们。

【讨论】:

  • 非常彻底。谢谢@Rico
  • 在您的#3 回复中:如果分发,它会将值存储在像 redis 这样的 nosql 数据库上吗?或者是否可以使用mysql(在每个ec2节点上)?
  • @CodeTalk 当然,但这是排队机制而不是任务结果
猜你喜欢
  • 2020-06-02
  • 2010-11-05
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多