【问题标题】:Is there an enterprise message queue which can drop duplicate messages (first value stays)?是否有可以丢弃重复消息的企业消息队列(保留第一个值)?
【发布时间】:2012-01-22 08:43:04
【问题描述】:

我正在寻找具有这些要求的消息队列。没找到;也许最接近的是 rabbitmq-lvc 插件(但我需要行中的第一个值坚持并保持在前面)。 有人知道支持这些的技术吗?

  • 消息队列为先进先出
  • 如果有重复的消息正在排队,消息队列本身会拒绝或丢弃它。

例如,生产者将这三条消息(每条消息都有一个鉴别器值)按以下顺序放入队列:M1(鉴别器=7654),M2(鉴别器=2435),M3(鉴别器=7654)。 现在我希望消息队列看到 M3 与 M1 具有相同的鉴别器值,因此丢弃/拒绝 M3。消费者只收到:M1、M2。

谢谢 汤姆

【问题讨论】:

    标签: jms message-queue messaging duplicate-removal


    【解决方案1】:

    我不知道其他传输,但我知道 WebSphere MQ 不这样做,我相信解释为什么会广泛适用于整个类别。我会很惊讶地发现任何消息传递 transport 实际上提供了这一点。以下是一些原因:

    • 异步消息应该是原子的。不同的供应商为消息亲和性(两个或多个消息之间的关系)做出了自己的调整,但作为一项规则,应避免消息亲和性。您的用例不仅需要传输来处理消息关联性,还需要在相关消息之间的不确定间隔内执行此操作。
    • 消息负载是一个 blob。出于性能原因,WMQ 不涉及消息负载,除了压缩或代码页转换。任何需要解析消息负载的东西都是 WebSphere Message Broker、DataPower 或 WebSphere ESB 的工作。我希望任何声称具有高性能的消息传输都会面临类似的问题,因为解析有效负载会导致更长的代码路径和非线性性能下降。消息属性是个例外,但 WMQ 仅使用这些属性进行选择,我希望通常是这种情况。
    • 无状态操作。作为传输,应用程序的状态可以存储在持久消息中,但传输层的状态不应依赖于应用程序的状态跨不同工作单元。同样,当您希望将某些应用程序状态的管理委派给消息传递层时,尤其是当此类管理跨越多个工作单元时,ESB 类型的产品最适合。
    • 保证交货。 WMQ 旨在永远不会丢失您的持久消息。如果应用明确设置了过期时间,消息可能会消失因为发件人表示可以这样做。如果消息是非持久性的,它可能会消失,但只有在特殊情况下才会消失,而且,因为发件人表示可以这样做。您描述的用例可能会导致消息消失,不是因为发件人说没问题,甚至不是因为收件人说没问题,而是因为与一些不相关的第三者的互动,他们碰巧用重复值。如果第一条消息有无效的标题或代码页问题并被回滚怎么办?如果我作为攻击者吐出包含所有可能的 4 位值作为鉴别器的垃圾消息怎么办?

    正如我所说,我不了解其他消息传递产品,因此可能会有满足您要求的产品,如果是,我将有兴趣了解它。但是,如果没有人回复,这篇文章可能会说明原因。

    【讨论】:

    • 谢谢 T Rob。我可以看到为什么不让消息队列检查消息体以及为什么不让它丢弃它们是正确的方法。我可以通过使用一个跟踪处理的外部表来解决这个问题(鉴别器 -> 上次处理的时间)。然后,无论谁获取了队列中的消息,他们都可以自行决定是处理时间还是丢弃时间。需要为表查询增加一点开销;但也许是更好的模型。
    • 很高兴这是一个有用的帖子,但我有点期待其他回复,这样我就可以了解其他传输如何处理此类要求。无论如何,感谢您的跟进并接受。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2023-02-06
    • 2012-04-26
    • 2011-08-16
    • 2021-12-23
    相关资源
    最近更新 更多