问题描述
为了测试发生故障时的通信性能,我对每条消息进行编号并连续发送,每秒发送大约 30 条消息。并且发现即使设置了ha策略,在failover/failback之后,消费者也会反复收到少量接收到的消息。这正常吗?
我知道Artemis通过给消息一个唯一值来提供自动重复消息检测,这样可以避免重复发送消息,但是重复接收的消息有不同的“客户端确认消息ID”。这是否意味着它不能防止接收重复的消息?
解决方法
根据您编写客户端的方式,您可能会在故障转移时获得重复,因为在发生故障时某些消息确认可能会丢失。例如,如果您从代理收到一条消息并对其进行处理,但是代理在您发送确认之前失败(或在确认传输过程中失败),则备份仍将保留您已经收到的消息并将再次发送它.
如果您不希望重复对您的客户造成问题,那么您有几个选择:
- 在您的客户端上使用事务,在确认成功之前不要提交。如果确认失败,则回滚事务。
- 确保您的消费者是幂等的,因此重复并不重要。