ActiveMQ宕机了怎么办
官方的解决方案是主从集群(备份)方案
zookeeper集群
Replicated(瑞pk得) levelDB就是之前在讲消息持久化kahaDB的另一种消息持久化方案,这种方案的性能会比较好
activemq集群
activemq最起码有三个,因为一个activemq挂了之后可以在另外两个中选取,如果只有两个的话挂了一个就只剩下一个没法选取了,三台activemq只有一台是master,所以只有一台在生效,其他客户端只会连接master,其他两台只起到一个备份的作用,如果master宕机了,那么zookeeper会从剩下的两台activemq中通过选取机制选取出一台成为master
zookeeper集群默认端口是2181,如果在同一台机器上要建立3个zookeeper那么需要改端口,activemqweb端口和tcp协议端口同理
用了集群之后,使用的时候连接地址需要改故障迁移连接方式,加上failover的前缀
如何防止消息方消息重复消费
解决消费方幂等性的问题:
产生:当生产方和消费方有可能因为一个网络延迟等原因,MQ服务器无法即使接收到消费方应答,导致MQ重试,在重试过程中造成重复消费问题。
解决思路:
- 如果消费方是做数据库操作,那么可以把消息的ID作位表的唯一主键,这样我们可以在重试的情况下,会触发主键冲突从而避免数据出现脏数据。
(也可以这么说是消息头中有个可以自己设置的id,自己可以在消费方通过代码判断这个id是否取到过,若有则不取)
- 如果不是做数据库操作,可以借助第三方的缓存应用,列入redis,来做消费记录,每次消息被消费完成时候,把当前消息的ID作位key存入redis,每次消费前,先到redis查询有没有该消息的消费记录
如何防止消息丢失
以下手段可以防止消息丢失:
- 生产者和消费者使用事务
- 在消费方采用手动消息(ACK)
- 消息持久化,例如数据库或者日志
- ActiveMQ自带的死信队列
什么是死信队列?
这些前面都有讲,现在再做一下整理
什么是死信队列
死信队列是MQ产品在处理失败或者过期的情况下来保证消息不会丢失的机制,
哪些消息会处理失败?
重发失败6次的时候,当然这个可以设置,重发时间也可以设置
MQ在遇到事务开启手动调用rollback
开启事务但是没有commit
未开启事务,手动确认调用了一个session.recover方法