【问题标题】:JMS Priority Messages Causing Starvation of Lower Priority MessageJMS 优先级消息导致低优先级消息饥饿
【发布时间】:2015-02-11 08:20:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为还值得回顾一下系统的瓶颈。您的站点 CPU 没有被大量使用。那么是系统盘绑定还是网络绑定?是否考虑增加消费者数量而不是尝试和移动消息优先级?为了跟上消息的产生?

标签: jms ibm-mq businessworks


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    应用程序分布在多个服务器上,但 CPU 不是 即使呼吸困难,JMS 似乎也是瓶颈。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 2011-09-17
        • 2011-10-10
        • 2012-05-31
        • 2014-02-08
        • 2012-09-04
        • 2015-12-23
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多