【问题标题】:IBM MQ message groupsIBM MQ 消息组
【发布时间】:2021-08-02 14:16:00
【问题描述】:

我目前面临一个用例,我需要并行处理多条消息,但相关消息一次只能由一个 JMS 使用者处理。

例如,考虑消息 ABCDEF 和 DEFGHI,后跟一个序列号:

  • ABCDEF-1
  • ABCDEF-2
  • ABCDEF-3
  • DEFGHI-1
  • DEFGHI-2
  • DEFGHI-3

如果可能,我希望 JMS 消费者并行处理 ABCDEF 和 DEFGHI 消息,但绝不允许两个 ABCDEF 或 DEFGHI 消息同时跨两个或多个消费者。在我的用例中,消息的顺序无关紧要。 我不能使用 JMS 过滤器,因为我不会提前知道组名,并且拥有组名的静态列表是不可行的。。消息是通过不受我控制的系统发送的,组名总是由 6 个字母组成。

ActiveMQ 似乎已经通过他们的message groups 功能实现了这一点,但我在 IBM MQ 中找不到等效的功能。我的理解是这种行为是由 JMSXGroupId 和 JMSXGroupSeq 标头驱动的,它们仅在 JMS 规范的 optional 部分中定义。

作为一种解决方法,我总是可以有一个临时场地(也许是一个数据库),所有消息都放置在这个地方,然后在这个数据库上进行快速轮询,但是在这里添加一个额外的基础设施似乎有点矫枉过正。此外,它也不允许我在发生故障时使用 JMS 事务进行重新处理。

对我来说,这似乎是消息传递体系结构中的一个常见用例,但我无法在网上任何地方找到简单的“是/否”答案,而且 IBM MQ 文档也不太清楚是否支持此功能。

提前致谢

【问题讨论】:

  • Ibm mq 不支持您突出显示的 ActiveMQ 消息组功能之类的功能。您需要使用 Morag 指出的标头字段编写自己的逻辑。
  • 谢谢 Josh,您是否有一个指向 IBM MQ 文档页面的链接,该链接明确指出任何机会都不支持此功能?我希望有一些有用的链接可以解释我们如何自己实现它……这听起来像是消息代理的典型用例,但我可能错了。
  • 由于它没有这样的功能,我不希望有一个文档页面说明它没有该功能。

标签: jms ibm-mq message-queue messaging


【解决方案1】:

IBM MQ 也有消息组的概念。

IBM MQ 消息头,称为消息描述符 (MQMD),其中包含 JMS 组字段映射到的几个字段:-

  • JMSXGroupID -> MQMD GroupID 字段
  • JMSXGroupSeq -> MQMD MsgSeqNumber 字段

在此处阅读更多信息

【讨论】:

  • 谢谢莫拉格。我确实查看了这些文档页面,并开发了一个 POC,它在 MQ 消息上设置 MQMDGroupID 和 MQMDMsgSeqNumber 标头,但消息使用者不尊重它们。具有相同组 ID 的消息由不同的消费者(因此不同的线程)处理。第二个文档页面看起来很有希望,但有点令人困惑,因为它将消息组(同一逻辑对象的不同版本)与消息段(同一消息分段为多个较小的消息)捆绑在一起
  • 我遇到了类似的问题。消息组行为是 IBM MQ 队列中的默认功能,还是必须在创建队列时配置?
  • IBM MQ 消息分组在应用程序级别而不是在队列创建时处理。队列可以同时处理组内和非组内的消息。
  • @justin.saliba - 听起来你有一个编码问题 - 你能用你的代码更新你的问题,然后我们可能会帮助你解决你的问题。听起来我们特别希望看到您的消费者的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2022-07-21
  • 2012-10-01
  • 2019-08-29
  • 2011-01-20
相关资源
最近更新 更多