grails - 在Web应用程序中使用RabbitMQ,多个线程可以在同一队列上工作

标签 grails queue rabbitmq messaging

我有一个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不需要很长时间。由于PDFPPT之前处理,因此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/

相关文章:

grails - 使用 Grails 2.x 和 Spring Security 插件实现字段级安全

stack - 使用两个堆栈实现队列的恒定摊销复杂度

python - 有限的 celery 节拍任务

java - 处理 RabbitMQ Spring Boot 应用程序中的异常

java - 将消息存储到变量 RabbitMQ Java

hibernate - Grails中不区分大小写的搜索

java - 如何使用此 Groovy 代码从 Groovy 类获取数据源连接?

grails - 如何全局处理 Grails 中的 HTTP 错误(状态代码 4xx/5xx)?

java - 当队列持久时,HornetQ Producer 变慢

c++ - 堆栈和队列容量的溢出 (c++)