【问题标题】:Async spawing of processes: design question - Celery or Twisted进程的异步生成:设计问题 - Celery 或 Twisted
【发布时间】:2011-06-05 19:44:36
【问题描述】:

所有人:我正在寻求意见/指导/和设计理念。我的目标是找到一种精简但可靠的方法来从 HTTP POST 中获取 XML 有效负载(这部分没有问题),解析它,并异步生成一个相对长寿的进程。

生成的进程是 CPU 密集型的,将持续大约三分钟。一开始我预计不会有太多负载,但是随着流量的增加,我很可能需要在服务器上横向扩展它。

我真的很喜欢 Celery/Django 堆栈用于此用途:它非常直观,并且具有所有内置框架来完全满足我的需要。我满怀热情地开始了这条道路,但很快我发现我的 512MB RAM 小型云服务器只有 100MB 的可用内存,并且我开始感觉到,一旦我的所有进程全速运行,我就会遇到麻烦。此外,它还有几个活动部分:RabbitMQ、MySQL、cerleryd、ligthttpd 和 django 容器。

我绝对可以增加我的服务器的大小,但我希望在这个项目的早期阶段将我的成本降到最低。

作为替代方案,我正在考虑使用 twisted 进行流程管理,以及远程系统的透视代理(如果需要)。但至少对我来说,虽然 twisted 很出色,但我觉得我在这条路上做了很多事情:编写协议、回调管理、跟踪工作状态等。这里的好处非常明显——出色的性能,更少的移动部件和更小的内存占用(注意:我需要验证内存部分)。为此,我非常偏向于 Python - 它比其他替代品更让我愉快:)

我非常感谢您对此的任何看法。我担心会在错误的轨道上开始工作,并且稍后在生产流量上重做这件事会很痛苦。

-马特

【问题讨论】:

  • 你项目的目标是什么?学术的?爱好者网站?互联网创业?
  • 这将是一项创收服务,或者至少这是我们的目标。
  • 在这种情况下,我会将您指向这篇文章:teddziuba.com/2010/12/…
  • 请注意,Celery 2.2 将支持使用 eventlet/gevent 而不是进程来进行并发,这可能会减轻您的记忆恐惧。
  • @MattH,感谢您的链接,我同意这种方法,我认为这是最有意义的。

标签: python django asynchronous twisted


【解决方案1】:

我补充一下,很晚的另一种可能性:使用 Redis。 目前我使用 redis with twisted :我将工作分配给工人。它们异步执行工作并返回结果。

“列表”类型非常有用: http://www.redis.io/commands/rpoplpush

因此,您可以使用可靠队列模式来发送工作并让进程阻塞/等待,直到他有新工作要做(新消息进入队列。

您可以在同一个队列中使用多个工作人员。

Redis 的内存占用较低,但要注意待处理消息的数量,这会增加 Redis 使用的内存。

【讨论】:

    【解决方案2】:

    我会回答这个问题,就好像我是做这个项目的人一样,希望这能给你一些见解。

    我正在处理一个需要使用队列、面向公众的 Web 应用程序的 Web 服务器和多个作业客​​户端的项目。

    这个想法是让网络服务器持续运行(这里不需要非常强大的机器)。但是,这些工作是由这些作业客户端处理的,它们是更强大的机器,可以随意启动和停止。作业队列也将与 Web 应用程序驻留在同一台机器上。当作业被插入队列时,启动作业客户端的进程将启动并旋转第一个客户端。使用可以在负载增加时启动新服务器的负载平衡器,我不必费心管理正在运行的服务器数量来处理队列中的作业。如果一段时间后队列中没有作业,则可以终止所有作业客户端。

    我会建议使用与此类似的设置。您不希望作业执行影响 Web 应用程序的性能。

    【讨论】:

      【解决方案3】:

      在我的系统上,以相当合理的默认值运行的 RabbitMQ 使用了大约 2MB 的 RAM。芹菜使用多一点,但不是过量。

      在我看来,与堆栈的其余部分相比,RabbitMQ 和 celery 的开销几乎可以忽略不计。如果您正在处理需要几分钟才能完成的作业,那么一旦您的流量增加,这些作业就会使您的 512MB 服务器不堪重负,而不是 RabbitMQ。从 RabbitMQ 和 Celery 开始,至少可以让你很好地横向扩展这些工作,所以你肯定走在正确的轨道上。

      当然,您可以在 Twisted 中编写自己的作业控件,但我认为它不会给您带来太多好处。 Twisted 具有相当不错的性能,但我不希望它的性能超过 RabbitMQ 足以证明引入错误和架构限制的时间和潜力是合理的。大多数情况下,担心优化似乎是错误的地方。花点时间重新编写 RabbitMQ 并努力将这三分钟的工作减少 20% 左右。或者只需每月额外花费 20 美元,即可将容量翻倍。

      【讨论】:

      • 感谢您的意见,非常感谢。我将继续我目前的道路,可能最终会为更多资源付费。到目前为止,在 mysql 上跳过 innodb 似乎有所帮助,我将能够通过 celery 路线更快地完成任务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多