0

我有一个全天加载高优先级 JMS 消息的队列,我想快速将它们排除在外。队列还定期以大批量的低优先级消息加载。我在忙碌的日子里看到的问题是,队列前面总是有足够的高优先级消息,以至于在该音量下降之前,没有低优先级的消息被选中。他们经常会排长队直到半夜。该应用程序分布在多个服务器上,但 CPU 甚至没有呼吸困难,JMS 似乎是瓶颈。

我的预感是实现某种老化算法,以提高已在队列中很长时间的消息的优先级,但当然,这就是中间件应该为我做的事情。我无法想象 JMS 提供者 (IBM WebsphereMQ) 或应用程序服务器 (TIBCO BusinessWorks) 没有某种设施来应对这种情况。所以在我开始写一些代码之前,我想我会问,有没有办法让这些技术中的任何一种来帮助我解决这个问题?

正在读取队列的 BusinessWorks 活动是 JMS SOAP 事件源,但我可以将其转换为 JMS 队列接收器活动或其他活动。

欢迎所有关于如何解决这个问题的想法:-) TIA

4

3 回答 3

1

如果你真的想让你的消息混合在同一个队列中并首先处理高优先级的消息,但你的消息量很大,有时直到半夜你才能处理完所有的卷,那么你很简单没有足够的处理应用程序。MQ 是一个并行处理系统,它旨在允许许多应用程序一次放入或从队列中取出。通过同时运行更多获取应用程序来利用这一点。他们将更快地处理您的高优先级消息,然后返回处理较低优先级的消息。

于 2014-12-14T10:13:32.690 回答
1

这就像将一只手绑在背后,然后抱怨你不能正常游泳。哦!首先,谁的好主意是混合消息。仅仅因为您可以做某事并不意味着您应该做某事。

该应用程序分布在多个服务器上,但 CPU 甚至没有呼吸困难,JMS 似乎是瓶颈。

那么,解决方案很简单。将高优先级消息放入队列“A”(现有队列),将低优先级消息放入新队列“B”。接下来,启动 JMS 应用程序的另一个实例以从队列“B”中读取消息。

此外,JMS 可能不是瓶颈。这是应用程序在 JMS 层拾取需要很长时间的消息(即后端工作)之后对消息数据执行的操作。

最后,您的 JMS 应用程序有多少实例针对现有队列运行?如果您只运行 1 个实例,为什么?如果您有大量 CPU 容量,那么为什么不运行 10 个 JMS 应用程序实例。对消息进行一些真正的并行处理。

于 2014-12-12T21:57:43.057 回答
0

从您的描述中可以清楚地看出,您希望首先处理高优先级消息。在这种情况下,较低优先级的消息将不得不等待。

如果消息长时间处于队列中,MQ 不会增加消息的优先级。它如何知道它必须更改消息的属性:)?您将需要开发一个应用程序来做到这一点。

我认为根据优先级隔离消息,例如,将高优先级消息放入一个队列,将低优先级消息放入另一个队列可能是您可以考虑的一种选择。

第二种选择是查看将交付顺序 (MSGDLVSQ) 更改为 FIFO。这使得消息按照到达队列的顺序传递给消费者。但请注意,这将忽略消息优先级,这意味着如果有一个较低优先级的消息随后是一个较高优先级的消息,则较高优先级的消息将等待较低优先级的消息被传递。

于 2014-12-12T16:00:54.467 回答