ActiveMQ面试题

2022-07-22 12:28:01 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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重试,在重试过程中造成重复消费问题。

解决思路:

  1. 如果消费方是做数据库操作,那么可以把消息的ID作位表的唯一主键,这样我们可以在重试的情况下,会触发主键冲突从而避免数据出现脏数据。

(也可以这么说是消息头中有个可以自己设置的id,自己可以在消费方通过代码判断这个id是否取到过,若有则不取)

  1. 如果不是做数据库操作,可以借助第三方的缓存应用,列入redis,来做消费记录,每次消息被消费完成时候,把当前消息的ID作位key存入redis,每次消费前,先到redis查询有没有该消息的消费记录

如何防止消息丢失

以下手段可以防止消息丢失:

  1. 生产者和消费者使用事务
  2. 在消费方采用手动消息(ACK)
  3. 消息持久化,例如数据库或者日志
  4. ActiveMQ自带的死信队列

什么是死信队列?

这些前面都有讲,现在再做一下整理

什么是死信队列

死信队列是MQ产品在处理失败或者过期的情况下来保证消息不会丢失的机制,

哪些消息会处理失败?

重发失败6次的时候,当然这个可以设置,重发时间也可以设置 MQ在遇到事务开启手动调用rollback 开启事务但是没有commit 未开启事务,手动确认调用了一个session.recover方法

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125570.html原文链接:https://javaforall.cn

0 人点赞