此Web应用程序是否需要任务队列?

时间:2010-08-26 18:21:17

标签: python architecture celery

背景

我有一个可以根据用户输入创建图像的网络应用。 图像创建可能需要几秒钟。

问题

如果我让服务器线程,即处理请求/响应也生成图像,这将占用一个线程几秒钟,并可能使我的服务器陷入困境,影响性能,杀死小狗等。

问题

我应该使用任务队列,例如Celery,以便服务器可以切换图像创建,然后返回处理请求/响应吗?我没有问题正在创建图像的用户等待,但我不希望它影响其他人访问该网站。

3 个答案:

答案 0 :(得分:6)

我要说不 - 现在。

  • 几秒钟不长。
  • 无论如何,你必须实施某种轮询(或彗星处理)来将图像反馈给用户。
  • 这将使您的系统更加复杂。
  • 设计系统,以便以后添加任务队列是可行且容易的。

因此,首先要保持简单并使其正常工作,但请记住,您可能稍后添加任务队列。

在/需要扩展时实现该任务队列。

答案 1 :(得分:0)

我也有一个图像生成网站(Names4Frames)并通过AJAX(和PHP)做了类似的事情。我没有任何明显的减速(或死小狗),但有问题的网站也没有产生大量的流量。我不是线程方面的专家,说实话,我并不是100%确定您的确切关注点以及您正在使用的技术......

基本上有一个页面请求来自另一个页面的图像(可能甚至位于不同的服务器上),并且当它完成时,第二个页面返回到第一个关于图像的任何相关信息以进行处理/显示。如果我们只讨论几秒钟,我就看不出这是一个真正的问题,除非你经常使用这个图像创建服务处理大量的访问者。

答案 2 :(得分:0)

经验法则:如果任务可能堆积,请使用队列。

在您的情况下,任务可以最多 2秒,假设每天8小时,您每天最多可以执行8 * 60 * 60/2 = 14400张图像而无需并发。如果您每天收到超过7200个请求,则其中任何一个请求的重叠率为50%。有更复杂的分析来显示您可能获得的预期重叠水平;但似乎可以肯定地说,你可以在超载之前每天拍摄超过一千张照片。

现在问题似乎更容易了:你认为你很快就会每天获得超过一千或两个图像创作吗?如果是,则设置队列;如果没有,请留待以后。

无论如何,保持好日志;确保您可以判断何时有任何处理重叠。请记住,一旦你同时处理两个任务,它们将花费更长的时间,增加第三个任务在完成其他两个之前可能到达的概率,第四个......当你到达一个无形的阈值时,性能将急剧下降。不要因此而失眠,只是在你注意之前不要让它发生。