我有一个Web应用程序,用户可以在其中上传由Web应用程序处理的文件。我要做的第一件事是将请求放入RabbitMQ队列。然后,这些请求以队列方式在后台一对一地处理。所有这些都很好。
从我的分析中,我注意到当队列中的请求之一需要很长时间来处理时,就会出现问题。发生这种情况时,长时间运行的请求后面的请求也会延迟。
示例
User 1 uploads DOC file at 12:32:10*
User 2 uploads DOCX file at 12:32:11*
User 3 uploads PDF file at 12:32:12*
User 1 uploads PPT file at 12:32:13*
* -
数据库中反射(reflect)日期然后创建请求的日期时间戳此时,队列将如下所示并按以下顺序进行:
DOC, DOCX, PDF, PPT
我知道
PDF
文件需要更长的处理时间,但是PPT
不需要很长时间。由于PDF
在PPT
之前处理,因此PPT
也需要很长时间才能完成。在处理完所有请求之后,数据库中的时间戳如下所示:
User 1 uploads DOC file at 12:32:10* 12:32:11**
User 2 uploads DOCX file at 12:32:11* 12:32:12**
User 3 uploads PDF file at 12:32:12* 12:32:20**
User 1 uploads PPT file at 12:32:13* 12:32:40**
** -
数据库中的日期时间戳,反射(reflect)出请求已完成请注意,由于PPT位于
27
后面,因此它需要PDF
秒才能完成。在我的测试中,如果它在PDF
之前,那么只需要2 to 3
秒PS:我在grails应用程序中使用RabbitMQ插件
问题
有没有办法让多个线程处理Web应用程序中队列中的请求?我在想,如果多个线程正在队列中工作,那么即使一个请求(以上示例中的PDF)需要更长的时间来处理其他请求,还是可以完成(以上示例中的PPT)?如果是这样,如何强制多个线程在队列上工作?
我是否应该使用更好的体系结构,以便更快地处理请求,而不是等待需要很长时间才能处理的请求?
最佳答案
也许您想要的是将一个以上的消费者附加到队列中。因此,当一个使用者处理PDF时,另一个使用者可以处理下一个文件。
在您的情况下,您可能还希望basic_qos
的值也较低。看一下本教程:http://www.rabbitmq.com/tutorials/tutorial-two-java.html
这种模式在这里称为competing consumers
:http://www.eaipatterns.com/CompetingConsumers.html
关于grails - 在Web应用程序中使用RabbitMQ,多个线程可以在同一队列上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26236483/