我有一个网络应用程序,用户上传文件的处理是由网络应用程序.我做的第一件事是将请求放在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** -数据库中反映请求的日期时间戳已经创建。
此时,队列将如下所示,并按以下顺序排列:
DOC, DOCX, PDF, PPT我知道PDF文件需要更长的时间来处理,但是PPT不需要很长时间。由于PDF是在PPT之前处理的,所以PPT也需要很长时间才能完成。
在处理所有请求之后,DB中的时间戳如下所示:
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 to 3秒
PS:我在grails应用程序中使用RabbitMQ插件
问题
是否有一种方法让多个线程处理web应用程序中队列中的请求?我在想,如果多个线程正在队列上工作,那么即使一个请求(上面示例中的PDF)处理其他请求所需的时间更长,其他请求仍然可以完成(上面示例中的PPT)?如果是这样,我如何强制多个线程在队列上工作?
是否应该使用更好的架构,以便更快地处理请求,而不是等待需要很长时间处理的请求?
发布于 2014-10-07 17:52:47
也许您想要的是将多个消费者附加到队列中。因此,当一个使用者处理PDF时,另一个使用者可以处理下一个文件。
在您的例子中,您可能也希望basic_qos值低。看看本教程:http://www.rabbitmq.com/tutorials/tutorial-two-java.html
这个模式在这里被称为competing consumers:http://www.eaipatterns.com/CompetingConsumers.html
发布于 2014-10-10 21:23:12
这难道不符合使用队列的目的吗?我们有一个类似的应用程序,它使用RabbitMQ。我们所做的就是对每种类型都有不同的队列。因此,如果它的pdf,我们有一个pdf队列,一个ppt队列,一个文档队列和一个docx队列。
我们使用Java和Octobot作为客户端连接到MQ。因此,我们可以使用相同的jar,其中包含一个yml文件,其中列出了所有队列。JSON有任务名。在发送到队列中的每个json消息中都是相同的。因此,在所有情况下,同一个类都可以工作。
还有竞争的消费者。我想我们也这么做..。我们有多个运行octobot(Java)的服务器实例。因此,它们在RabbitMQ服务器上注册为消费者。因此,RabbitMQ根据接收到的最后一个ack决定哪一个是空闲的,并相应地发送消息。
希望这能有所帮助。
https://stackoverflow.com/questions/26236483
复制相似问题