WebSphere MQ 和 IIB:事件可能填满队列管理器

WebSphere MQ and IIB: Events potentially fill up the queue manager

我正在编写一个 IIB 流程,它除其他外还生成事件消息(监控功能)。为了能够处理所有这些事件,我需要进行持久订阅。但如果我这样做,并且如果消费应用程序由于某种原因没有恢复在线,QM 可能会填满并最终停止。 有什么办法可以避免这种情况吗?使用 "forced message expiration" 创建托管持久订阅的任何方法?

如果消费应用程序可能永远不会重新连接,请不要将其设为持久订阅。

事实证明,这是一个相当常见的用例,但也可能具有挑战性。在许多可能的方法中,以下是一些常见的方法:

使用循环队列
"Circular queue" 不是 IBM 的官方术语,而是我在文章 Mission:Messaging: Easing administration and debugging with circular queues. Circular queues are implemented using the Q program from SupportPac MA01 (now on GitHub!) 和 MQ 的本机工具中创造的,可将队列修剪为 MAXDEPTH 的 80%。这是 2011 年发布的,根据我收到的反馈,我猜至少有 100 家商店成功地使用了这种自动化。

使用 MQ v8.0.0.4
从 MQ v8.0 Fix Pack 4 开始,IBM 在队列和主题上引入了 CAPEXPIRY 属性。 (见:Enforcing lower expiration times)设置好了算了。

自动队列清理
使用 Q 或 QLoad 程序搜索早于指定时间的消息并将其删除。使用您最喜欢的作业调度程序来安排它,或者使用 MQ 检测来查找诸如队列已满或队列服务间隔非常长之类的事情

不要这样做
持久订阅适用于应该 始终存在或至少可靠地返回的内容。在这些情况下,在部署时提供订阅,并使删除队列成为停用过程的一部分。如果因为订阅者是临时的而没有停用过程,请不要使用持久订阅。我知道说起来容易做起来难。

备注
我不能确定这一点,因为我不再作为 MQ 产品团队的一员工作,但我怀疑提供了新的 CAPEXPIRY 功能来解决这个问题。当 IBM 推出 MQ MFT(以前称为 FTE 的产品)时,Explorer 模块使用永久动态订阅来收集文件传输作业状态。但是,在很多情况下,Explorer 实例忘记了它的订阅、人们更换了计算机或工作,或者一千种其他导致放弃订阅的原因。

对于 MFT 的要求集来说,这不是一个容易解决的问题。支持用户体验或支持高效的系统使用,但不能两者兼而有之。现在我们有 CAPEXPIRY 那些订阅队列最终会自行清空。我预测很快空 PERMDYN 队列的队列将在何处到期,因此我们不会有无数被遗弃的空队列。