【发布时间】:2016-03-29 15:24:36
【问题描述】:
我在 2x 方法来管理 MQ 客户端上的消息拒绝之间做出决定时遇到了一些困难。诚然,这更像是一种意识形态论点,而不是技术论点。
考虑一下:队列上的消息 (XML) 由客户端读取。客户端在进一步处理之前检查数字签名(以及,通过扩展,消息是否符合特定模式)。假设数字签名的验证失败了。我不希望进一步处理该消息。它需要回到源头并“手工”整理出来。
据我所知,我可以采取 2 种方法:
选项 1
- 客户端读取消息
- 客户确认收货
- 客户端发现消息在某种程度上无效
-
客户端将无效消息写入“拒绝”队列
CLIENT MQ CLIENT READ +-------+ +----+ OUT Q | --- | --------> |PROCESS| -----> |NEXT| | --- | |MESSAGE| |STEP| +-----+ +-------+ +----+ | | REJECT Q | --- | <-------------+ | --- | FAILURE +-----+
选项 2
- 客户端读取消息
- 客户端发现消息在某种程度上无效
- 客户端不确认收到消息
-
MRRTY = 0 (?) 所以 QM 将消息写入拒绝 Q
CLIENT MQ CLIENT READ +-------+ +----+ OUT Q | --- | --------> |PROCESS| -----> |NEXT| | --- | <-------- |MESSAGE| |STEP| +-----+ FAILURE +-------+ +----+ | | V REJECT Q | --- | | --- | +-----+
我偏向于选项 2,其中 QM 负责将失败的消息写入拒绝队列,因为在我看来这是一个更简洁的解决方案。这也意味着与客户的通信仅在一个方向上。我了解 CLIENT_ACKNOWLEDGE 用于接收所有消息直到确认点:我是否误以为 ACKing per-message 将是允许我将 QM 写入失败消息发送到每个 MRRTY 参数被拒绝的 Q 的机制?
非常感谢任何关于标准模式/架构的意见/讨论。
【问题讨论】:
-
你能解释一下MRRTY是什么吗?
-
我认为第一个解决方案更干净,应用程序应该处理应用程序错误,格式错误的消息是应用程序错误。队列管理器应该只处理传输错误。
-
顺便说一句,我不认为您使用的是 IBM WebSphere MQ,是吗?它没有 MRRTY 选项,当然也没有路由失败消息的机制。您应该指定您正在使用的 MQ。
-
MRRTY 确实存在于 WebSphere MQ 中,它是通道上消息重试的计数。与消息重试计时器 MRTMR 齐头并进。这仅适用于接收器类型的通道,不适用于客户端-服务器通道,
-
选项 1 是一种选择。没有让队列管理器将失败的消息路由到侧队列的机制。这是应用程序的责任。