【问题标题】:Does this web app require a task queue?此 Web 应用程序是否需要任务队列?
【发布时间】:2011-04-04 10:35:20
【问题描述】:

背景

我有一个网络应用程序,它将根据用户输入创建图像。 图像创建可能需要几秒钟。

问题

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

问题

我是否应该使用任务队列,例如Celery,以便服务器可以移交图像创建,然后返回处理请求/响应?我没有问题让用户谁在创建图像等等,但我不希望它影响其他人访问该站点。

【问题讨论】:

    标签: python architecture celery


    【解决方案1】:

    我要说不 - 暂时。

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

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

    当/如果您需要扩展时,实施该任务队列。

    【讨论】:

    • +1:而且...如果您使用的是 Apache,它将为您处理大量的缓冲和并发。实际上,使用 mod_wsgi,您可以同时运行许多后端进程。在您进行基准测试之前,您无法确定,但它可以处理的工作量通常很大。
    • 好的。感谢您为我节省了 N 小时的工作时间。我主要担心的是几秒钟那么长。我的个人目标之一是提供一个好的用户界面,我认为用户盯着空白屏幕几秒钟,而生成和发送的图像将低于标准。如果有队列,我至少可以轮询并让他们忙于查看消息或其他内容。
    • @random_person:“盯着空白屏幕”? HTML 页面如何呈现“空白屏幕”?你是怎样做的?大多数情况下,当我提交表单时,我会盯着前一页看一会儿。然后页面突然被替换了。此外,许多人在 Javascript 中使用花哨的闲置来显示一些动作。但我不知道如何在浏览器中制作“黑屏”。你能解释一下吗?
    • @random_person 用户无需盯着无响应的屏幕,您可以使用javascript/ajax进行请求,并在等待时显示旋转进度条等
    【解决方案2】:

    我也有一个图像生成站点 (Names4Frames),并通过 AJAX(和 PHP)进行了类似的操作。我没有任何明显的减速(或死去的小狗),但有问题的网站也不会产生大量流量。我不是线程专家,老实说,我不能 100% 确定您的确切问题是什么以及您使用的是什么技术...

    基本上有一个页面从另一个页面请求图像(甚至可能位于不同的服务器上),并且当它完成后,第二个页面将有关图像的任何相关信息传递回第一个页面以用于处理/显示目的。如果我们只讨论几秒钟,我看不出这是一个真正的问题,除非您正在处理大量使用此图像创建服务的访问者。

    【讨论】:

      【解决方案3】:

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

      在您的情况下,该任务可能需要最多 2 秒,假设每天 8 小时,您每天最多可以处理 8*60*60/2 = 14400 张图像而无需并发。如果您每天收到超过 7200 个请求,那么您有 50% 的机会将其中任何一个重叠。有更复杂的分析可以显示您可能获得的预期重叠水平;但可以肯定地说,您每天可以拍摄超过 1000 张图片,然后才会超载。

      现在问题似乎更容易了:您认为您会很快获得每天一千或两幅以上的图像创作吗?如果是,则设置队列;如果没有,请稍后再处理。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        相关资源
        最近更新 更多