第 10 章 检测重复消息
您可以将代理配置为自动检测和过滤重复的消息。这意味着您不必实施自己的重复检测逻辑。
如果没有重复的检测,当意外连接失败时,客户端无法确定是否收到发送到代理的消息。在这种情况下,客户端可能会假设代理没有收到消息,并重新发送它。这会生成重复的消息。
例如,假设客户端向代理发送一条消息。如果在收到和 由代理处理消息前 代理或连接失败,则消息永远不会到达其地址。由于失败,客户端不会从代理接收响应。如果在收到并由代理处理消息 后 代理或连接失败,则会正确路由消息,但客户端仍然不会收到响应。
此外,使用事务来确定是否成功不一定会在这种情况下帮助。如果在处理事务提交时代理或连接失败,客户端仍无法确定它是否成功发送了消息。
在这些情况下,为了更正假定的失败,客户端会重新发送最新的消息。结果可能是对您的系统有负面影响的重复消息。例如,如果您在订购系统中使用代理,则重复的信息可能意味着处理订购顺序两次。
以下流程演示了如何配置重复的消息检测以防止这些类型的情况。
10.1. 配置重复的 ID 缓存
要启用代理来检测重复的消息,生产者必须在发送每个消息时为消息属性 _AMQ_DUPL_ID
提供唯一值。代理维护 _AMQ_DUPL_ID
属性接收的值的缓存。当代理收到地址上的新消息时,它会检查该地址的缓存,以确保之前还没有处理带有此属性相同值的消息。
每个地址都有自己的缓存。每个缓存的大小都是圆圈的,按大小进行修复。这意味着新条目会替换最旧的作为缓存空间需求。
以下流程演示了如何全局配置代理中的每个地址使用的 ID 缓存。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中,添加id-cache-size
和persist-id-cache
属性并指定值。例如:<configuration> <core> ... <id-cache-size>5000</id-cache-size> <persist-id-cache>false</persist-id-cache> </core> </configuration>
id-cache-size
ID 缓存的最大大小,指定为缓存中单个条目的数量。默认值为 20,000 条目。在本例中,缓存大小被设置为 5,000 条目。
注意当达到缓存的最大大小时,代理可以开始处理重复的消息。例如,假设您将缓存的大小设置为
3000
。如果前面的消息在 新消息 之前到达 3,000 个消息,其值为_AMQ_DUPL_ID
,则代理无法检测重复。这会导致代理处理这两个消息。persist-id-cache
-
当此属性的值设置为
true
时,代理会在收到它们时保留到磁盘的 ID。默认值为true
。在上例中,您可以通过将值设为false
来禁用持久性。
其他资源
- 要了解如何使用 AMQ Core Protocol JMS 客户端设置重复的 ID 消息属性,请参阅 AMQ Core Protocol JMS 客户端 文档中的使用重复消息检测。