【问题标题】:How do automatically discard duplicate messages in activemqactivemq如何自动丢弃重复消息
【发布时间】:2022-12-15 02:25:49
【问题描述】:

我的 activemq 代理中有一个配置,不将消息转发到.DLQ队列。

       <destinationPolicy>
            <policyMap>
              <policyEntries>
              <policyEntry queue=">">
                <!-- 
                    Tell the dead letter strategy not to process expired messages
                    so that they will just be discarded instead of being sent to
                    the DLQ 
                -->
                    <deadLetterStrategy>
                        <sharedDeadLetterStrategy processExpired="false" />
                    </deadLetterStrategy>
                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>

但我仍在获取要存储的消息.DLQ队列。

当我试图查看存储在.DLQ我可以看到一些额外的属性显示以下原因

dlqDeliveryFailureCause java.lang.Throwable: duplicate from store for queue://xxxxxx

有什么办法可以丢弃重复的消息不发送到.DLQ排队活动消息.

【问题讨论】:

  • 您已将 activemq-artemis 标记添加到您的问题中,但该问题似乎仅与 ActiveMQ“Classic”有关。您能否阐明 ActiveMQ Artemis 如何参与其中?

标签: java activemq


【解决方案1】:

当队列上存在高争用时,可能会发生来自存储消息的重复——通常来自队列上具有高预取和页面大小的大量消费者。

代理正在为每个消费者尽可能快地分页消息。队列的欺骗检测然后过滤掉这些欺骗并将副本推送到 DLQ,作为通知您存在竞争的一种方式。

我在 (5.17.x) 中添加了一个新的配置标志,它禁止消息进入 DLQ,而是添加了一个计数器,以便您能够在发生这种情况时进行观察。

设置:sendDuplicateFromStoreToDLQ="false"

在 5.18.x 中,“false”将成为默认值。

“修复”是通过调整消费者计数 + 预取 + pageSize 设置来降低队列的争用,这样这种情况发生的频率就会降低——或者(理想情况下)根本不会发生

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2018-09-20
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多