精华内容
下载资源
问答
  • activemq面试题
    2022-02-16 14:45:30

    1.什么是activemq

    activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

    2. activemq的作用以及原理

    Activemq 的作用就是系统之间进行通信。 当然可以使用其他方式进行系统间通信, 如果使用 Activemq 的话可以对系统之间的调用进行解耦, 实现系统间的异步通信。 原理就是生产者生产消息, 把消息发送给activemq。 Activemq 接收到消息, 然后查看有多少个消费者, 然后把消息转发给消费者, 此过程中生产者无需参与。 消费者接收到消息后做相应的处理和生产者没有任何关系

    3.activemq的几种通信方式

    3.1 publish(发布)-subscribe(订阅)(发布-订阅方式)

    发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只能接收他创建以后发送客户端发送的信息。作为subscriber ,在接收消息时有两种方法,destination的receive方法,和实现message listener 接口的onMessage 方法

    3.2 p2p(point-to-point)(点对点)

    p2p的过程则理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路

    相互通信的双方是通过一个类似于队列的方式来进行交流。和前面pub-sub的区别在于一个topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。

    3.3 publish(发布)-subscribe(订阅)方式的处理

    发布订阅模式的通信方式, 默认情况下只通知一次, 如果接收不到此消息就没有了。 这种场景只适用于对消息送达率要求不高的情况。 如果要求消息必须送达不可以丢失的话, 需要配置持久订阅。 每个订阅端定义一个 id,

    <property name="clientId" 在订阅是向 activemq 注册。 发布消息 <property name="subscriptionDurable" value="true"/>和接收消息时需要配置发送模式为持久化template.setDeliveryMode(DeliveryMode.PERSISTENT);。 此时如果客户端接收不到消息, 消息会持久化到服务端(就是硬盘上), 直到客户端正常接收后为止。

    3.4 p - p(点对点)方式的处理

    点对点模式的话, 如果消息发送不成功此消息默认会保存到 activemq 服务端直到有消费者将其消费, 所以此时消息是不会丢失的。

    4.如何解决消息重复问题

    所谓消息重复,就是消费者接收到了重复的消息,一般来说我们对于这个问题的处理要把握下面几点,
    ①.消息不丢失(上面已经处理了)
    ②.消息不重复执行
    一般来说我们可以在业务段加一张表,用来存放消息是否执行成功,每次业务事物commit之后,告知服务端,已经处理过该消息,这样即使你消息重发了,也不会导致重复处理
    大致流程如下:
    业务端的表记录已经处理消息的id,每次一个消息进来之前先判断该消息是否执行过,如果执行过就放弃,如果没有执行就开始执行消息,消息执行完成之后存入这个消息的id

    5.常用的中间插件

    (1)ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总 线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。我们在本次课程中介绍 ActiveMQ的使用。

    (2)RabbitMQ AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使 用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得 到运用。

    (3)ZeroMQ 史上最快的消息队列系统

    (4)Kafka Apache下的一个子项目 。特点:高吞吐,在一台普通的服务器上 既可以达到10W/s的吞吐速率; 完全的分布式系统。适合处理海量数据

    6.

    更多相关内容
  • 【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题...
  • 7道消息队列ActiveMQ面试题分享给你! 大家面试前,必须狠刷面试题,哥给你们整理了面试过程中必问的一些面试,希望对你们有帮助,祝你们早日找到满意的工作。
  • 7道消息队列ActiveMQ面试题!.zip
  • activemq面试题

    2020-06-08 09:05:37
    1. activemq 的几种通信方式 publish(发布)-subscribe(订阅)(发布-订阅方式) 发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个 接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。...

    1. activemq 的几种通信方式
    publish(发布)-subscribe(订阅)(发布-订阅方式)
    发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个
    接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端
    只能接收他创建以后发送客户端发送的信息。作为 subscriber ,在接收消息时
    有两种方法,destination 的 receive 方法,和实现 message listener 接口的
    onMessage 方法。
    p2p(point-to-point)(点对点)
    p2p 的过程则理解起来比较简单。它好比是两个人打电话,这两个人是独享这
    一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中
    因为有多个用户对使用 p2p 的链路。
    在 p2p 的场景里,相互通信的双方是通过一个类似于队列的方式来进行交流。
    和前面 pub-sub 的区别在于一个 topic 有一个发送者和多个接收者,而在 p2p
    里一个 queue 只有一个发送者和一个接收者

    2. activemq 如果数据提交不成功怎么办(消息丢失)

    1. publish(发布)-subscribe(订阅)方式的处理
      发布订阅模式的通信方式, 默认情况下只通知一次, 如果接收不到此消息就没有了。 这种场景只适用于对消息送达率要求不高的情况。 如果要求消息必须送达不可以丢失的话, 需要配置持久订阅。 每个订阅端定义一个 id,<property name=“clientId” 在订阅是向 activemq 注册。 发布消息
      和接收消息时需要配置发送模式为持久化
      template.setDeliveryMode(DeliveryMode. PERSISTENT );。 此时如果客户
      端接收不到消息, 消息会持久化到服务端(就是硬盘上), 直到客户端正常接收后为止。
    2. 4.2p - p(点对点)方式的处理
      点对点模式的话, 如果消息发送不成功此消息默认会保到 activemq 服
      务端直到有消费者将其消费, 所以此时消息是不会丢失的。

    3.如何解决消息重复问题
    所谓消息重复,就是消费者接收到了重复的消息,一般来说我们对于这个问题的处
    理要把握下面几点,
    ①.消息不丢失(上面已经处理了)
    ②.消息不重复执行
    一般来说我们可以在业务段加一张表,用来存放消息是否执行成功,每次业务事物
    commit 之后,告知服务端,已经处理过该消息,
    这样即使你消息重发了,也不会导致重复处理
    大致流程如下:
    业务端的表记录已经处理消息的 id,每次一个消息进来之前先判断该消息
    是否执行过,如果执行过就放弃,如果没有执行就开始执行消息,消息执行完成之
    后存入这个消息的 id

    4.大量的消息每页被消费,能否发生 oom 异常?
    可以控制每个消息队列中数据的大小,不允许无线填充数据,避免该队列多
    大,导致过度消耗系统资源问题; 可以控制队列的内存大小;

    5.activeMQ 发送消息的方式有哪些?
    消息通信的基本方式有两种:
    1、同步方式
    两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的。
    发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准
    备。
    发送程序首先向接收程序发起一个请求,称之为发送消息,发送程序紧接着就
    会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程
    序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下
    一步的业务处理。
    2、异步方式
    两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业
    务,比如发送方发送消息以后不用登录接收方的响应,可以接着处理其他的任
    务。也就是说发送方和接收方都是相互独立存在的,发送方只管方,接收方只
    能接收,无须去等待对方的响应。
    Java 中 JMS 就是典型的异步消息处理机制,JMS 消息有两种类型:点对点、
    发布/订阅

    6. activeMQ 如何调优

    1. 使用非持久化消息;
    2. 需要确保消息发送成功时使用事务来将消息分批组合.
      public void sendTransacted() throws JMSException {
      ActiveMQConnectionFactory cf = new
      ActiveMQConnectionFactory();
      Connection connection = cf.createConnection();
      connection.start();
      Session session = connection.createSession(true,
      Session.SESSION_TRANSACTED);
      Topic topic = session.createTopic(“Test.Transactions”);
      MessageProducer producer = session.createProducer(topic);
      int count = 0;
      for (int i = 0; i < 1000; i++) {
      Message message = session.createTextMessage("message " +
      i);
      producer.send(message);
      if (i != 0 && i % 10 == 0) {
      session.commit();
      }
      }
      }
      public void sendNonTransacted() throws JMSException {
      ActiveMQConnectionFactory cf = new
      ActiveMQConnectionFactory();
      Connection connection = cf.createConnection();
      connection.start();
      // create a default session (no transactions)
      Session session = connection.createSession(false,
      Session.AUTO_ACKNOWELDGE);
      Topic topic = session.createTopic(“Test.Transactions”);
      MessageProducer producer = session.createProducer(topic);
      int count = 0;
      for (int i = 0; i < 1000; i++) {
      Message message = session.createTextMessage("message " +
      i);
      producer.send(message);
      }
      }

    7.什么是死信队列?
    如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重
    试,可以关闭 AUTO_ACKNOWLEDGE,将 ack 交由程序自己处理。那如果使
    用了 AUTO_ACKNOWLEDGE,消息是什么时候被确认的,还有没有阻止消息
    确认的方法?有!
    消费消息有 2 种方法,一种是调用 consumer.receive()方法,该方法将阻塞直
    到获得并返回一条消息。这种情况下,消息返回给方法调用者之后就自动被确
    认了。另一种方法是采用 listener 回调函数,在有消息到达时,会调用
    listener 接口的 onMessage 方法。在这种情况下,在 onMessage 方法执行
    完毕后,消息才会被确认,此时只要在方法中抛出异常,该消息就不会被确
    认。那么问题来了,如果一条消息不能被处理,会被退回服务器重新分配,如
    果只有一个消费者,该消息又会重新被获取,重新抛异常。就算有多个消费
    者,往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处
    理。难道就这么退回–获取–报错死循环了吗?
    在重试 6 次后,ActiveMQ 认为这条消息是“有毒”的,将会把消息丢到死信
    队列里。如果你的消息不见了,去 ActiveMQ.DLQ 里找找,说不定就躺在那
    里。

    8.Basic.Reject 的用法是什么?
    答:该信令可用于 consumer 对收到的 message 进行 reject 。若在该信令
    中设置 requeue=true,则当 RabbitMQ server 收到该拒绝信令后,会将该
    message 重新发送到下一个处于 consume 状态的 consumer 处(理论上
    仍可能将该消息发送给当前 consumer)。若设置 requeue=false ,则
    RabbitMQ server 在收到拒绝信令后,将直接将该 message 从 queue 中
    移除。
    另外一种移除 queue 中 message 的小技巧是,consumer 回复 Basic.Ack
    但不对获取到的 message 做任何处理。
    而 Basic.Nack 是对 Basic.Reject 的扩展,以支持一次拒绝多条 message
    的能力。

    9.为什么不应该对所有的 message 都使用持久化机制?
    答:首先,必然导致性能的下降,因为写磁盘比写 RAM 慢的多,message
    的吞吐量可能有 10 倍的差距。其次,message 的持久化机制用在
    RabbitMQ 的内置 cluster 方案时会出现“坑爹”问题。矛盾点在于,若
    message 设置了 persistent 属性,但 queue 未设置 durable 属性,那么
    当该 queue 的 owner node 出现异常后,在未重建该 queue 前,发往该
    queue 的 message 将被 blackholed ;若 message 设置了 persistent
    属性,同时 queue 也设置了 durable 属性,那么当 queue 的 owner
    node 异常且无法重启的情况下,则该 queue 无法在其他 node 上重建,只
    能等待其 owner node 重启后,才能恢复该 queue 的使用,而在这段时间
    内发送给该 queue 的 message 将被 blackholed 。所以,是否要对
    message 进行持久化,需要综合考虑性能需要,以及可能遇到的问题。若想
    达到 100,000 条/秒以上的消息吞吐量(单 RabbitMQ 服务器),则要么使
    用其他的方式来确保 message 的可靠 delivery ,要么使用非常快速的存储
    系统以支持全持久化(例如使用 SSD)。另外一种处理原则是:仅对关键消息
    作持久化处理(根据业务重要程度),且应该保证关键消息的量不会导致性能
    瓶颈

    10.为什么 heavy RPC 的使用场景下不建议采用 disk node ?
    答:heavy RPC 是指在业务逻辑中高频调用 RabbitMQ 提供的 RPC 机制,
    导致不断创建、销毁 reply queue ,进而造成 disk node 的性能问题(因为
    会针对元数据不断写盘)。所以在使用 RPC 机制时需要考虑自身的业务场
    景。

    11.向不存在的 exchange 发 publish 消息会发生什么?向不存在的
    queue 执行 consume 动作会发生什么?

    答:都会收到 Channel.Close 信令告之不存在(内含原因 404
    NOT_FOUND)。

    12.什么情况下 producer 不主动创建 queue 是安全的?
    答:1.message 是允许丢失的;2.实现了针对未处理消息的 republish 功能
    (例如采用 Publisher Confirm 机制)。

    13. “dead letter”queue 的用途?
    答:当消息被 RabbitMQ server 投递到 consumer 后,但 consumer 却通
    过 Basic.Reject 进行了拒绝时(同时设置 requeue=false),那么该消息会
    被放入“dead letter”queue 中。该 queue 可用于排查 message 被
    reject 或 undeliver 的原因。

    14.为什么说保证 message 被可靠持久化的条件是 queue 和 exchange
    具有 durable 属性,同时 message 具有 persistent 属性才行?

    答:binding 关系可以表示为 exchange – binding – queue 。从文档中我
    们知道,若要求投递的 message 能够不丢失,要求 message 本身设置
    persistent 属性,要求 exchange 和 queue 都设置 durable 属性。其实这
    问题可以这么想,若 exchange 或 queue 未设置 durable 属性,则在其
    crash 之后就会无法恢复,那么即使 message 设置了 persistent 属性,仍
    然存在 message 虽然能恢复但却无处容身的问题;同理,若 message 本身
    未设置 persistent 属性,则 message 的持久化更无从谈起

    展开全文
  • ActiveMq面试题

    2021-03-19 23:27:32
    目前主流的消息队列有以下ActiveMQ RabbitMQ KafKa ZeroMQ MetaMQ RocketMQ 用ActiveMQ举例,用java实现点对点(P2P)的流程是怎样的 首先是生产者需要new一个ActiveMQConnectionFactory,用这个factory来创建...
    1. 常见的消息队列有哪些?
    目前主流的消息队列有以下ActiveMQ RabbitMQ KafKa ZeroMQ MetaMQ RocketMQ
    
    1. 用ActiveMQ举例,用java实现点对点(P2P)的流程是怎样的
      首先是生产者需要new一个ActiveMQConnectionFactory,用这个factory来创建connection,然后通过connection创建session,而通过session创建Queue,生产者和TextMessage,最后通过生产者send到队列中去
           //创建ConnectionFactory 用户名密码都是null
            ConnectionFactory factory =new ActiveMQConnectionFactory(null,null,"tcp://localhost:61616");
            //创建Connectin
            Connection connection=factory.createConnection();
            //创建Session 通过Connection创建的,不开启事务
            Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
            //创建Destination(Queue Topic) 由Session创建出消息队列
            Queue queue =session.createQueue("hello");
            //创建producer生产者
            MessageProducer producer = session.createProducer(queue);
            //由session创建Message
            TextMessage textMessage = session.createTextMessage("第一条MQ消息'");
            //使用Producer发送消息
            producer.send(textMessage);
            producer.close();
            session.close();
            connection.close();
            System.out.println("发送完成");
        }
    

    而消费者这边,前面不变也是factory->connection->session,session也是需要创建Queue和Consumer–>开一个线程或者监听器去receive(),Consurmer这边的代码:

          ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(null, null, "tcp://localhost:61616");
            // connection
            Connection connection = connectionFactory.createConnection();
            connection.start();
            Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
            //Session创建消息队列 --和生产者那边一模一样 否则会创建一个新的队列
            Queue queue = session.createQueue("hello");
            MessageConsumer consumer = session.createConsumer(queue);
            while(true){
                Message receive = consumer.receive();
                if(receive!=null){
                    TextMessage m =(TextMessage)receive;
                    System.out.println(m.getText().toString());
                    TimeUnit.SECONDS.sleep(1);
                }
            }
    

    这就完成了点对点的消息传递

    1. 以ActiveMQ为例,topic的消息传递的流程是怎样的呢?
      流程也是ActiveMQConnectionFactory去创建Connection,Connection创建Session,Session创建Topic,生产者,和MapMessage,最后由生产者send到消息队列中,代码如下:
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(null, null, "tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false,Session.CLIENT_ACKNOWLEDGE);
            //创建了一个话题
            Topic topic = session.createTopic("topic");
            //创建生产者
            MessageProducer producer = session.createProducer(topic);
            MapMessage mapMessage =session.createMapMessage();
            mapMessage.setString("name","zs");
            mapMessage.setInt("age",22);
            producer.send(mapMessage);
    
            producer.close();
            session.close();
            connection.close();
            System.out.println("消息发送完成");
        }
    

    消费者大相径庭factory->connection->session->consumer,topic以及Listener

            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(null, null, "tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            connection.start();
            Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
            Topic topic = session.createTopic("topic");
            MessageConsumer consumer = session.createConsumer(topic);
            consumer.setMessageListener(message -> {
                if(message!=null && message instanceof MapMessage){
                    MapMessage m=(MapMessage)message;
                    try {
                        System.out.println(m.getInt("age")+m.getString("name"));
                        m.acknowledge();
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
    1. SpringMVC和SpringBoot如何整合ActiveMQ
      使用JmsTemplate,ActiveMQFactory,CachingConnectionFactory,以及JmsTemplate,以SpringBoot为例,说说流程
        @Bean
        public ActiveMQConnectionFactory activeMQConnectionFactory(){
            return new ActiveMQConnectionFactory(null,null,"tcp://localhost:61616");
        }
        @Bean
        /*Spring用于管理真正的ConnectionFactory的ConnectionFactory*/
        public CachingConnectionFactory connectionFactory(){
            CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
            cachingConnectionFactory.setTargetConnectionFactory(this.activeMQConnectionFactory());
            cachingConnectionFactory.setSessionCacheSize(30);
            return cachingConnectionFactory;
        }
        @Bean
        /*Spring提供的JMS工具类,它可以进行消息发送、接收等*/
        public JmsTemplate jmsTemplate(){
            JmsTemplate jmsTemplate = new JmsTemplate();
            //传入工厂
            jmsTemplate.setConnectionFactory(this.connectionFactory());
            //开启服务质量控制
            jmsTemplate.setExplicitQosEnabled(true);
            //持久化------生产者
            jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
            //客户端签收消息
            jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
            return jmsTemplate;
        }
    

    Service调用并发布信息

    //false为默认 发送Queue true发Topic
    jmsTemplate.setPubSubDomain(true);
            jmsTemplate.send("email", session -> {
                return  session.createTextMessage(JSONObject.toJSONString(email));
            });
    

    消费者:以下部署,注意是发布者是Queue还是Topic,对应好,消费者需要做的事情:ActiveMQConnectionFactory->CacheConnectionFactory->队列/订阅->LinstenerContainer以下我用SpringMVC部署去写 相当于把SpringBoot和SpringMVC都写了一遍吧

    <bean id="mqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
                  c:userName=""
                  c:password=""
                  c:brokerURL="tcp://localhost:61616"/>
            <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"
                  c:targetConnectionFactory-ref="mqConnectionFactory"
                  p:sessionCacheSize="30"/>
            <bean id="emailTopic" class="org.apache.activemq.command.ActiveMQTopic">
                <constructor-arg name="name" value="email" />
            </bean>
    
            <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                <!--CachingConnectionFactory-->
                <property name="connectionFactory" ref="connectionFactory"/>
                <!--队列-->
                <property name="destination" ref="emailTopic"/>
                <!--自己写的监听器-->
                <property name="messageListener" ref="emailMsgListener"/>
                <!--签收方式 2表示手动签收 1表示自动签收-->
                <property name="sessionAcknowledgeMode" value="2"/>
            </bean>
    

    这样就配置完毕了;最后只需要一个配置一个监听器用onMessage方法拿值就可以了
    在这里插入图片描述
    最后textMessage.acknowledge();//签收消息

    展开全文
  • activemq 面试题

    2020-08-15 13:22:25
    每次添加完商品并将同步商品到索引库如果,如果直接同步数据库,当数据库很大的时候,会影响服务器性能,这时我们,就使用ActiveMQ消息中间件,后台添加完消息后,搜索服务器发送一个消息【商品id】,并将接收到的...

    什么是mq

    消息中间件。可以在分布式系统的不同服务之间进行消息的发送接收

    解决了什么问题

    让系统解耦

    实际项目应用场景

    监听商品添加消息,接收消息,将对应的商品信息同步到索引库

    每次添加完商品并将同步商品到索引库如果,如果直接同步数据库,当数据库很大的时候,会影响服务器性能,这时我们,就使用ActiveMQ消息中间件,后台添加完消息后,搜索服务器发送一个消息【商品id】,并将接收到的商品id在数据库中查找跟商品id有关的信息,吧信息添加到索引库中

    像平时调用接口。如果服务器宕机,那么就会导致调用接口失败。会导致一系列问题。这时候可以使用mq。进行持久化。能够保证消息的成功率。

    ActiveMQ的特点

    • 完全支持JMS 1.1和J2EE 1.4规范(持久化,XA消息,事务)
    • 支持多种传输协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
    • 可插拔的体系结构,可以灵活制定,如:消息存储方式,安全管理等
    • 很容易和Application Server集成使用
    • 多种语言和协议编写客户端,如:Java,C,C++,C#,Ruby,Perl,Python,PHP
    • 从设计上保证了高性能的集群,客户端—服务器,点对点
    • 可以很容易的和Spring结合使用
    • 支持通过 JDBC 和 journal 提供高速的消息持久化
    • 支持和Axis的整合

    ActiveMQ消息发送失败

    • ActiveMQ有两种通信方式,点到点形式和发布订阅模式。
    • 如果是点到点模式的话,如果消息发送不成功,此消息默认会保存到ActiveMQ服务端直到有消费者将其消费,所以此消息是不会丢失的。
    • 如果是发布订阅模式的通信方式,默认情况只通知一次,如果接受不到此消息就没有了,这种场景使用于对消息发送率要求不高的情况,如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向ActiveMQ注册,发布消息和接受消息时需要配置发送模式为持久化,此时如果客户端接受不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

    防止消息重复发送

    增加消息状态表

    记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。

    丢消息怎么办

    用持久化消息

    或者非持久化消息及时处理不要堆积,

    或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

    持久化消息非常慢

    默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。

    但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。

    服务挂掉

    这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除

    Queue和Topic的区别

    • 点对点(point-to-point,简称PTP)Queue消息传递模型:
      • 在该消息传递模型下,一个消息生产者向消息服务器端一个特定的队列发送消息,一个消费者从该队列中读取消息。在这种模型下,消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列。这种模型的特点是能够保证数据安全

    • 发布/订阅(publish/subscribe,简称pub/sub)Topic消息传递模型:

      •  在该消息传递模型下,一个消息发布者向一个特定的消息主题发布消息,0或多个对此消息主题感兴趣的并且处于活动状态的消息订阅者或者建立了持久订阅的消息订阅者才可以接收到所发布的消息。可能造成数据丢失

    ActiveMQ【JMS的同步与异步】发送消息的方式有哪些

    • 同步方式
      • 两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的。发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备。
      • 发送程序首先向接收程序发起一个请求,称之为发送消息,发送程序紧接着就会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。
    • 异步方式
      • 两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业务,比如发送方发送消息以后不用登录接收方的响应,可以接着处理其他的任务。也就是说发送方和接收方都是相互独立存在的,发送方只管方,接收方只能接收,无须去等待对方的响应。

      • Java中JMS就是典型的异步消息处理机制,JMS消息有两种类型:点对点、发布/订阅

     

    展开全文
  • 介绍:本课程共6节内容,是从“精讲”课程中抽取出来的面试题详解,内容包括基础、主从架构的搭建和访问、分布式集群搭建和访问等。如果您对整个课程感兴趣可以直接在本网站搜索“张立坤”讲师即可查看我的所有课程...
  • 10 ActiveMQ面试题

    2020-06-14 22:09:01
    ActiveMQ面试题
  • 1.ActiveMQ服务器宕机怎么办? 这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的&lt;systemUsage&gt;节点中配置。...
  • 能简单的介绍下 ActiveMQ 吗? ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,提供了高可用、高性能、可伸缩性等。 应用场景: 1. 短信、邮件服务 2. 流量削峰:比如抢红包、...
  • 主要对ActiveMQ消息中间件的使用,以及面试结合项目问到的问题;
  • 本课程共分36节,内容包括MQ概述和工作流程,启动过程与启动异常分析,消息的基本模型,基于...事务,死信队列,ACK策略,消息的丢失,重复重复消费,消息重发,springmvc集成,集群搭建,集群访问,50道面试精讲等。
  • ActiveMQ面试题总结

    2020-03-30 22:40:32
    ActiveMQ面试题总结:https://blog.csdn.net/Future_LL/article/details/86767855
  • Java ActiveMQ面试题

    千次阅读 2020-08-14 11:54:21
    1、如何使用ActiveMQ解决分布式事务? 在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作: ● 收集用户录入信息,保存到数据库 ● 向用户的手机或邮箱发送验证码 如果是传统的集中式...
  • 高性能架构面试题系列:Nginx+ActiveMQ+RabbitMQ+Kafka 请解释Nginx如何处理HTTP请求。 Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并...
  • 面向字节_ActiveMQ.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,248
精华内容 3,299
关键字:

activemq面试题