高级Activemq面试题及答案:
1.client用了transaction且再session中调用了rouback()
2.client用了transaction且再调用了commit()之前关闭或者没有commit
3.client再client-ACKNOMEDGE的传递模式下,在session中调用了recaver()
间隔:1
次数:6
一个消息被redelivedred超过默认的最大重发次数(默认次数是6)时,消费端会给MQ发送一个“poison ack” 表示这个消息有毒,告诉broker不要再发了,这个时候broker会把这个消息放到DLQ(死信队列)
ActiveMQ中引入了 死信队列 的概念,即一条消息再被重发多次后(默认是6)
将会被ActiveMQ移入死信队列,程序员 也就是我们可以在这个Queue中查看处理出错的消息,进行人工干预。
死信队列的使用:处理失败的消息
一般生产环境中,使用MQ的时候,设计两个队列:一个核心队列,一个死信队列
核心业务队列就是比如用订单系统发送订单消息,然后另外一个死信队列用来处理异常的情况。
假如第三方物流系统故障了,此时无法请求,那么仓储系统每次消费到一条订单消息,尝试通知发货和配送都会遇到对方的接口报错。此时仓储系统就可以把这条消息拒绝访问或者标志为处理失败。一旦标志这条消息处理失败后,MQ就会把这条消息转入提前设置好的一个死信队列中,然后你会看到的就是在第三方的物流系统故障期间,所以订单消息全部处理失败,全部转入死信队列,然后你的仓储系统得到专门有一个后台线程监控第三方物流系统是否正常运行,能否请求到,不停的监控,一旦发现对方恢复正常,这个后台线程就可以从死信队列消费出来 处理失败的订单,重新执行发货和配送的通知逻辑
网络延迟传输,会造成ActiveMQ重试中,在重试过程中,可能会造成重复消费
如果消息是做数据库插入操作;给这个消息做一个唯一主键,那么就算出现重复消费,就导致主键冲突,避免出现脏数据
如果上述面两种情况还是不行,准备一个第三方服务来做消费记录,以redis为例,给消息分配一个全局ID,只要消费国这个消息,将 以K-V的形式写入redis,那么消费者开始消费前,先去redis中直接查询有没有消费记录即可
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习