背景
我有一个网络应用程序,它将根据用户输入创建图像。图像创建可能需要几秒钟。
问题
如果我让处理请求/响应的服务器线程也生成图像,这将占用一个线程几秒钟,并可能使我的服务器陷入困境,影响性能,杀死小狗等。
问题
我是否应该使用任务队列,例如Celery,以便服务器可以移交图像创建,然后返回处理请求/响应? 我让正在创建图像的用户等待没有问题,但我不希望它影响其他人访问该站点。
我有一个网络应用程序,它将根据用户输入创建图像。图像创建可能需要几秒钟。
如果我让处理请求/响应的服务器线程也生成图像,这将占用一个线程几秒钟,并可能使我的服务器陷入困境,影响性能,杀死小狗等。
我是否应该使用任务队列,例如Celery,以便服务器可以移交图像创建,然后返回处理请求/响应? 我让正在创建图像的用户等待没有问题,但我不希望它影响其他人访问该站点。
我要说不 - 现在。
因此,首先要保持简单并使其正常工作,但请记住,稍后您可能会添加任务队列。
当/如果您需要扩展时,实施该任务队列。
我也有一个图像生成站点(Names4Frames),并通过 AJAX(和 PHP)做了类似的事情。我没有任何明显的减速(或死去的小狗),但有问题的网站也不会产生大量流量。我不是线程专家,老实说,我不是 100% 确定您的确切问题是什么以及您正在使用什么技术......
基本上有一个页面从另一个页面请求图像(甚至可能位于不同的服务器上),并且当它完成后,第二个页面将有关图像的任何相关信息传递回第一个页面以用于处理/显示目的。如果我们只谈论几秒钟,我看不出这是一个真正的问题,除非您正在处理大量使用此图像创建服务的访问者。
经验法则:如果任务可能堆积,请使用队列。
在您的情况下,该任务最多可能需要2 秒,假设每天 8 小时,您每天最多可以处理 8*60*60/2 = 14400 张图像而无需并发。如果您每天收到超过 7200 个请求,那么您有 50% 的机会将其中任何一个重叠。有更复杂的分析可以显示您可能获得的预期重叠水平;但可以肯定地说,在超载之前,您每天可以拍摄超过 1000 张图像。
现在问题似乎更容易了:您认为您会很快获得每天一千或两幅以上的图像创作吗?如果是,则设置队列;如果没有,请稍后再处理。
无论如何,保持良好的日志;确保您可以判断何时有任何处理重叠。请记住,一旦您同时处理两个任务,它们将花费更长的时间,从而增加第三个任务在完成其他两个任务之前到达的可能性,而第四个......当您到达一个无形的阈值时,性能将急剧下降。不要为此失眠,只是不要让它在你注意到之前发生。