我想创建一个Web应用程序,客户端调用REST Webservice。这将返回客户端的OK-Status(带有指向结果的链接),并在activeMQ队列上创建新消息。在activeMQ的监听端,应该有工作人员来处理消息。
Iam坚持我的概念,因为我真的不知道如何确定我需要的工人数量。工作人员只需要调用Web服务接口,因此工作人员本身不需要很高的计算能力。工作人员必须等待从被调用的Web服务返回结果的最长时间。但是一个worker无法处理所有请求,所以如果超过队列中的请求限制(我还不知道限制),另一个worker应该处理队列。 做这份工作的最佳做法是什么?我应该为每个请求创建一个工作者并在工作完成后销毁它们吗?如何根据队列大小动态创建worker?是否更好地始终运行这些工作者或在队列需要时创建它们?
我认为主题/ Suscriber架构不合理,因为只有一个工作人员应该关心一个请求。让我们想象每分钟平均100个请求和高工作负载500个请求。
我的目的是快速获得结果,所以没有客户因为没有正确使用资源而不得不等待答案......
谢谢
答案 0 :(得分:0)
为什么不弄清楚你实际上能够支持的最大工人数量,然后制作这个数字并让它们永远运行?我使用0或1的预取,以避免在一个worker的预取缓冲区中堆积一堆消息,而其他人则闲置。 (Prefetch = 0将在当前的消息完成时拉出下一条消息,而prefetch = 1将有一条消息位于“on deck”上,可以处理而无需从网络获取它,但这意味着消费者可能是可以使用消息,但不能,因为它位于另一个消费者的预取缓冲区中,等待该消费者被读取。只要从代理下载消息的时间不合理,我就会使用prefetch = 0,因为它会尽可能均匀地分散工作负载。
然后,每当有要处理的消息时,要么工作人员可以处理下一条消息(所以没有延迟),要么所有工作人员正在处理消息(所以你当然要等待,因为你在容量,但只要有工作人员可用,它将从队列中接收下一条消息。
此外,你是正确的,你想要队列(消息将只由一个工作者消费)而不是主题(每个工作人员将使用消息)。