关于允许应用程序拒绝哪种消息,是否有良好的最佳实践?
我的理解是,所有无法处理的消息都应该被拒绝到死信队列 - 无论问题是语法错误还是消息中的语义错误,或者应用程序暂时无法处理处理消息(例如因为数据库刚刚关闭)。
当然 - 如果应用程序已经预先知道它将无法处理消息(DB down),它应该停止接受消息。
那么共同的理解/最佳实践是什么?
答案 0 :(得分:3)
我的回答是针对WebSphere MQ:
死信队列(简称DLQ)是一个放置无法传递到目的地的邮件的地方。消息可以由队列管理器,消息通道代理(MCA)和应用程序放在DLQ上。 DLQ上的所有消息都必须以死信头结构MQDLH作为前缀。当队列管理器或MCA放置消息时,MQDLH头会自动修复,而应用程序必须显式地为MQDLH添加前缀。
就应用程序而言,如果他们无法处理消息,例如说消息格式未被理解,他们可以将消息放入BACKOUT队列而不是DLQ。 BACKOUT队列就像任何普通队列一样,可以放置应用程序拒绝的消息。 BACKOUT队列的优点是您可以基于每个队列指定BACKOUT队列,并且放在那里的消息不需要以MQDLH头为前缀。
可以编写应用程序以从BACKOUT读取消息并将它们原样路由回目标队列。但是,DLQ中的消息需要额外的处理才能在将MQDLH放入目标队列之前将其删除。