Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 在Web应用程序中使用RabbitMQ,多个线程可以在同一队列上工作吗_Grails_Queue_Rabbitmq_Messaging - Fatal编程技术网

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

Grails 在Web应用程序中使用RabbitMQ,多个线程可以在同一队列上工作吗,grails,queue,rabbitmq,messaging,Grails,Queue,Rabbitmq,Messaging,我有一个web应用程序,用户可以上传由web应用程序处理的文件。我要做的第一件事是将请求放入RabbitMQ队列。然后在后台以排队方式逐个处理这些请求。所有这些都很好 从我的分析中,我注意到当队列中的一个请求需要很长时间来处理时,问题就会出现。发生这种情况时,长时间运行的请求后面的请求也会延迟 范例 *-数据库中的日期时间戳,它反映了当时创建的请求 此时,队列将如下所示,顺序如下: DOC, DOCX, PDF, PPT 我知道PDF文件需要更长的时间来处理,但PPT并不需要很长时间。由于PD

我有一个web应用程序,用户可以上传由web应用程序处理的文件。我要做的第一件事是将请求放入RabbitMQ队列。然后在后台以排队方式逐个处理这些请求。所有这些都很好

从我的分析中,我注意到当队列中的一个请求需要很长时间来处理时,问题就会出现。发生这种情况时,长时间运行的请求后面的请求也会延迟

范例

*-数据库中的日期时间戳,它反映了当时创建的请求

此时,队列将如下所示,顺序如下:

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**
**-数据库中反映请求完成的日期时间戳

请注意,PPT只需27秒即可完成,因为它位于PDF后面。在我的测试中,如果它在PDF之前,那么只需要2到3秒

PS:我正在grails应用程序中使用RabbitMQ插件

问题:

有没有办法让多个线程处理web应用程序队列中的请求?我在想,如果多个线程在队列上工作,那么即使上面示例中的一个请求需要更长的时间来处理,其他人仍然可以完成上面示例中的PPT?如果是这样,我如何强制多个线程在队列上工作


我是否应该使用更好的体系结构,以便更快地处理请求,而不是等待需要很长时间才能处理的请求?

也许您希望队列中连接多个消费者。因此,当一个消费者处理PDF时,另一个消费者可以处理下一个文件

在您的情况下,您可能也希望基本qos的值较低。请看本教程:


这种模式在这里被称为竞争消费者:

这难道不符合使用队列的目的吗?我们有一个使用RabbitMQ的类似应用程序。我们要做的是为每种类型设置不同的队列。如果是pdf,我们有一个pdf队列,一个ppt队列,一个文档队列和一个docx队列

我们使用Java和Octobot作为连接MQ的客户端。因此,我们可以使用相同的jar,使用一个列出所有队列的yml文件。JSON具有任务名称。发送到队列中的每个json消息都是相同的。因此,同一类在所有情况下都有效

也记录了竞争的消费者。。。我想我们也会这么做。。我们有多个运行Java的服务器实例。因此,它们在RabbitMQ服务器上注册为使用者。 因此RabbitMQ根据接收到的最后一个ack决定哪个是空闲的,并相应地发送消息


希望这能有所帮助。

不清楚您想要什么。您是否希望在单个web请求期间,多个线程开始并行地使用来自同一队列的消息?如果是这样,那就去做吧。这没关系,但请注意客户端库实现,以便在多线程环境中正确使用它。如果您担心某些消费者处理长消息,这没关系。暂停的消息不会阻止其他使用者使用消息。@是的,我希望多个线程在队列上工作,这样长时间运行的任务就不会延迟后面任务的处理。我用一个详细的例子更新了我的问题。嗯,我被不止一个消费者弄糊涂了。处理PDF和PPT的代码是我的web应用程序的一部分。这是否意味着我需要将这些代码移植出来,并将它们转换为不同的应用程序/服务?FWIW,我使用此插件与RabbitMQ一起工作。我不习惯grails,但在RabbitMQ中,您的用户通常在后台运行,与您的webapp分离。然后可以运行它们的多个实例
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**