故障转移时检测到重复的消息

问题描述 投票:0回答:1

我们在以下配置中有ActiveMq 5.15.2:

  • PostgreSQL用于持久化
  • 两个节点,一个处于待机状态
  • 带有共享数据库的JDBC主从
  • 静态集群发现

一切接缝都很好,故障转移按预期工作,但有时在故障转移(或重启整个集群)期间,我们观察到以下异常:

 WARN  [ActiveMQ NIO Worker 6] org.apache.activemq.transaction.LocalTransaction  - Store COMMIT FAILED:java.io.IOException: Batch entry 2 INSERT INTO ACTIVEMQ_MSGS(ID, MSGID_PROD, MSGID_SEQ, CONTAINER, EXPIRATION, PRIORITY, MSG, XID) VALUES (...) was aborted:  Unique-Constraint activemq_msgs_pkey Detail: key(id)=(7095330) alerady exists

ActiveMQ将此异常直接传播到客户端。

我想,ActiveMQ能够识别重复的消息,但这里出了点问题......

客户端尝试传递具有已存在ID的消息,ActiveMQ是否应该将此消息与存储中已存在的消息进行比较(如果可能,取决于数据库),如果两个消息相同,则忽略第二条消息?

或者也许ActiveMQ假设允许重复的消息被持久化并且我们的数据库结构不正确(对id的约束)?

CREATE TABLE activemq_msgs
(
   id          bigint          NOT NULL,
   container   varchar(250),
   msgid_prod  varchar(250),
   msgid_seq   bigint,
   expiration  bigint,
   msg         bytea,
   priority    bigint,
   xid         varchar(250)
);


ALTER TABLE activemq_msgs
   ADD CONSTRAINT activemq_msgs_pkey
   PRIMARY KEY (id);

我们应该放弃activemq_msgs_pkey吗?

activemq
1个回答
0
投票

我们的JDBC配置不正确 - autocommit设置为false,结果消息在DB中传播延迟。

© www.soinside.com 2019 - 2024. All rights reserved.