如何处理来自2个队列的数百条JMS消息,响应时间分别为1秒和1分钟

时间:2016-02-11 01:24:49

标签: multithreading jms spring-integration spring-jms

我有业务需求,我必须以特定优先级处理消息,例如priority1和priority2

我们决定使用2个JMS队列,其中priority1消息将被发送到priority1Queue,而priority2消息将被发送到priority2Queue。

priority1Queue消息的响应时间是当时消息在队列中,我需要读取,处理并在1秒内将响应发送回另一个队列。这意味着我应该在priority1Queue中立即处理这些消息,并且我将在priority1Queue上每秒发送数百条这样的消息,因此我肯定需要让多个并发消费者在此队列上消费消息以便可以处理它们当他们在队列中时(在1秒内消耗并处理)。

priority2Queue消息的响应时间是我需要在1分钟内读取,处理并将响应发送回另一个队列。因此,priority2的响应时间低于priority1消息,但我仍然需要在一分钟内回复。

您能否为此建议最佳方法,以便我可以同时从队列中读取消息并为priority1消息提供更高的优先级,以便可以在1秒内读取和处理每个priority1消息。 主要是如何读取和馈送到处理器,以便可以读取下一条消息,等等。

我需要编写一个基于java的组件来执行读取和处理。

我还需要确保此组件具有高可用性并且不会导致OutOfMemory,我将在多个JVMS和多个应用程序服务器上运行此组件,因此我可以拥有运行此Java组件的多个集群

1 个答案:

答案 0 :(得分:2)

首先,在1秒内处理的要求不依赖于您的消息传递方法,而是更多地取决于消息的实际处理和可用的原始CPU。从队列中每秒拾取100条消息是孩子的游戏,JMS提供者很可能不是问题。根据您的部署平台(Tomcat,Mule,JEE等),应该有一种方法让n个侦听器适当地扩展。因为消息存在于队列中直到你拿起它,所以你会怀疑内存不足。我已经完成了这些应用程序,处理了更多的消息而没有任何问题。

第二,使用优先级确定消息优先级的策略数量,不一定需要不同的队列。我倾向于使用消息优先级和消息过滤器,其中一组侦听器负责处理优先级最高的消息,另一组侦听器过滤掉较低优先级,但确保它足以在一分钟内将它们取出。

您还可以执行以下操作:将较低优先级的消息重写回具有较高优先级的同一队列,具体取决于您的接近1分钟。我知道这听起来不对,但是从JMS读取/写入的开销很小(至少与等效的,列驱动的数据库事务相比),但是优先级较低的消息的监听器可能会不断增加优先级,直到它必须是处理。

或者更简单,只有在优先级较低的队列/消息上拥有比较低优先级队列/消息更多的侦听器,并且消息进程数量的不平衡可能就是它所需要的。

很多可能性,PoC的时间。

相关问题