异步水疗过程:设计问题 - 芹菜或扭曲

时间:2011-01-08 17:08:02

标签: python django asynchronous twisted

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

产生的进程是CPU密集型的,将持续大约三分钟。我一开始并不期望有太大的负载,但我确实有可能需要在服务器上横向扩展,因为流量有望增加。

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

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

作为替代方案,我正在考虑使用twisted进行流程管理,以及远程系统的透视代理,如果需要的话。但至少对我来说,虽然扭曲是辉煌的,但我觉得我正在注册这条道路:写协议,回调管理,跟踪工作状态等等。这里的好处非常明显 - 卓越的性能,更少的移动部件和更小的内存占用(注意:我需要验证内存部分)。我为此严重倾向于Python - 对我而言,它比其他选择更令人愉快:)

我非常感谢对此的任何看法。我担心在错误的轨道上开始工作,稍后用生产流量重做这将是痛苦的。

-Matt

3 个答案:

答案 0 :(得分:5)

在我的系统上,使用非常合理的默认值运行的RabbitMQ使用大约2MB的RAM。 Celeryd使用了一点,但不是过多。

在我看来,与其他堆栈相比,RabbitMQ和芹菜的开销几乎可以忽略不计。如果您正在处理需要几分钟才能完成的工作,那么这些工作会在您的流量增加时淹没您的512MB服务器,而不是RabbitMQ。从RabbitMQ和芹菜开始,至少会让你很好地将这些工作横向扩展,所以你肯定在那里正确的轨道。

当然,您可以在Twisted中编写自己的作业控件,但我不认为它会让您获得更多。 Twisted具有相当不错的性能,但我不认为它能够超越RabbitMQ足以证明引入错误和架构限制的时间和潜力。大多数情况下,担心优化似乎是错误的。花点时间重新编写RabbitMQ并将这三分钟的工作量减少20%。或者只花20美元/月加倍容量。

答案 1 :(得分:0)

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

我正在开发一个项目,该项目需要使用队列,面向公众的Web应用程序的Web服务器以及多个作业客​​户端。

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

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

答案 2 :(得分:0)

我添加了很晚的另一种可能性:使用Redis。 目前我使用带有扭曲的redis:我将工作分配给工人。它们以异步方式执行工作并返回结果。

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

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

您可以在同一个队列中使用多个worker。

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