ActiveMQ面试题
001什么是ActiveMQ?
ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
002ActiveMQ的作用以及原理?
ActiveMQ的作用就是系统之间进行通信。 当然可以使用其他方式进行系统间通信, 如果使用 ActiveMQ的话可以对系统之间的调用进行解耦, 实现系统间的异步通信。 原理就是生产者生产消息, 把消息发送给ActiveMQ。 ActiveMQ接收到消息, 然后查看有多少个消费者, 然后把消息转发给消费者, 此过程中生产者无需参与。 消费者接收到消息后做相应的处理和生产者没有任何关系。
003ActiveMQ的几种通信方式?
消息通信的基本方式有两种:
1.同步方式
两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的。发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备。发送程序首先向接收程序发起一个请求,称之为发送消息,发送程序紧接着就会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。
2.异步方式
两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业务,比如发送方发送消息以后不用登录接收方的响应,可以接着处理其他的任务。也就是说发送方和接收方都是相互独立存在的,发送方只管方,接收方只能接收,无须去等待对方的响应。Java 中 JMS 就是典型的异步消息处理机制,JMS 消息有两种类型:点对点、发布/订阅。
004ActiveMQ 发送消息的方式有哪些?
1)publish(发布)-subscribe(订阅)(发布-订阅方式)
发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只能接收他创建以后发送客户端发送的信息。作为subscriber ,在接收消息时有两种方法,destination的receive方法,和实现message listener 接口的onMessage方法。
2)p2p(point-to-point)(点对点)
p2p的过程则理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路,相互通信的双方是通过一个类似于队列的方式来进行交流。和前面pub-sub的区别在于一个topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。
005ActiveMQ中Topic模式队列和Queue模式队列区别?
**工作模式:**Topic是“订阅-发布”模式,如果当前没有订阅者,消息将会被丢弃,如果有多个订阅者,那么这些订阅者都会受到消息;Queue是“负载均衡”模式,如果当前没有消费者,消息不会被丢弃;如果有多个消费者,那么一条消息也只能发送给一个消费者,并且要求消费者ack信息。
**有无状态:**Topic无状态;Queue 数据默认会在mq服务器上以文件的形式存储,比如activemq一般保存在$AMQ_HOME\data\kr-store\data下面,也可以配置成DB存储。
**传递完整性:**Topic模式如果没有订阅,消息就会被丢弃。Queue消息不会被丢弃。
**处理效率:**由于消息会随着订阅者的数量进行复制,所以处理性能会随着订阅者的增加而明显降低,并且还要结合不同的消息协议自身的性能差异;Queue模式由于一条消息只能被一个消费者消费,所以就算消费者再多,性能也不会有明显降低,当然不同的消息协议的具体性能也是有差异的。
006如何解决消息重复问题?
一般来说我们可以在业务段加一张表,用来存放消息是否执行成功,每次业务事物commit之后,告知服务端,已经处理过该消息,这样即使你消息重发了,也不会导致重复处理。
007ActiveMQ服务器宕机了怎么办?
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一半都会采用持久化机制。ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等。再试图将消息发给接收者,成功则将消息从存储中删除,失败则继续尝试尝试发送。消息中心启动以后,要先检查指定的存储位置是否有未成功发送的消息,如果有,则会先把存储位置中的消息发出去。
008什么是死信队列?
如果一条消息不能被处理,会被退回服务器重新分配,如果只有一个消费者,该消息又会重新被获取,重新抛异常。如果有多个消费者,往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处理。消息在重试 6 次后仍不能发送成功的,ActiveMQ 认为这条消息是“有毒”的,将会把消息丢到死信队列里。