精华内容
下载资源
问答
  • 【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题【BAT必备】activeMQ面试题...
  • 分布式面试之ActiveMQ面试题

    万次阅读 2020-10-11 12:42:13
    文章目录1、什么是ActiveMQ?2、ActiveMQ服务器宕机怎么办?3、丢消息怎么办?4.持久化消息非常慢。5、消息的不均匀消费。6、死信队列。7、ActiveMQ中的消息重发时间间隔和重发次数吗? 1、什么是ActiveMQ? activeMQ...

    1、什么是ActiveMQ?

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

    2、ActiveMQ服务器宕机怎么办?

    这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。

    虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
    那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:

    设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。

    设置2G左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是无法提供服务,就这样挂了。
    具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。

    3、丢消息怎么办?

    这得从java的java.net.SocketException异常说起。简单点说就是当网络发送方发送一堆数据,然后调用close关闭连接之后。这些发送的数据都在接收者的缓存里,接收者如果调用read方法仍旧能从缓存中读取这些数据,尽管对方已经关闭了连接。但是当接收者尝试发送数据时,由于此时连接已关闭,所以会发生异常,这个很好理解。不过需要注意的是,当发生SocketException后,原本缓存区中数据也作废了,此时接收者再次调用read方法去读取缓存中的数据,就会报Softwarecausedconnectionabort:recvfailed错误。

    通过抓包得知,ActiveMQ会每隔10秒发送一个心跳包,这个心跳包是服务器发送给客户端的,用来判断客户端死没死。如果你看过上面第一条,就会知道非持久化消息堆积到一定程度会写到文件里,这个写的过程会阻塞所有动作,而且会持续20到30秒,并且随着内存的增大而增大。当客户端发完消息调用connection.close。时,会期待服务器对于关闭连接的回答,如果超过15秒没回答就直接调用socket层的close关闭tcp连接了。这时客户端发出的消息其实还在服务器的缓存里等待处理,不过由于服务器心跳包的设置,导致发生了java.net.SocketException异常,把缓存里的数据作废了,没处理的消息全部丢失。

    解决方案:用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit。方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

    4.持久化消息非常慢。

    默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。

    5、消息的不均匀消费。

    有时在发送一些消息之后,开启2个消费者去处理消息。会发现一个消费者处理了所有的消息,另一个消费者根本没收到消息。原因在于ActiveMQ的prefetch机制。当消费者去获取消息时,不会一条一条去获取,而是一次性获取一批,默认是1000条。这些预获取的消息,在还没确认消费之前,在管理控制台还是可以看见这些消息的,但是不会再分配给其他消费者,此时这些消息的状态应该算作“已分配未消费",如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。但是如果消费者既不消费确认,又不崩溃,那这
    些消息就永远躺在消费者的缓存区里无法处理。更通常的情况是,消费这些消息非常耗时,你开了10个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另外9台啥事不干。

    解决方案:将prefetch设为1,每次处理1条消息,处理完再去取,这样也慢不了多少。

    6、死信队列。

    如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试,可以关闭AUTO_ACKNOWLEDGE,将ack交由程序自己处理。那如果使用了AUTO_ACKNOWLEDGE,消息是什么时候被确认的,还有没有阻止消息确认的方法?有!

    消费消息有2种方法,

    一种是调用consumer.receive()方法,该方法将阻塞直到获得并返回一条消息。这种情况下,消息返回给方法调用者之后就自动被确认了。

    另一种方法是采用listener回调函数,在有消息到达时,会调用listener接口的onMessage方法。在这种情况下,在onMessage方法执行完毕后,消息才会被确认,此时只要在方法中抛出异常,该消息就不会被确认。

    那么问题来了,如果一条消息不能被处理,会被退回服务器重新分配,如果只有一个消费者,该消息又会重新被获取,重新拋异常。就算有多个消费者,往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处理。难道就这么退回–获取-报错死循环了吗?在重试6次后,ActiveMQ认为这条消息是“有毒’‘的,将会把消息丢到死信队列里。如果你的消息不见了,去ActiveMQ.DLQ里找找,说不定就躺在那里。

    7、ActiveMQ中的消息重发时间间隔和重发次数吗?

    ActiveMQ:是Apache出品,最流行的,能力强劲的开源消息总线。是一个完全支持JMS1.1和J2EE1.4规范的JMSProvider实现。JMS(Java消息服务):是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

    首先,我们得大概了解下,在哪些情况下,ActiveMQ服务器会将消息重发给消费者,这里为简单起见,假定采用的消息发送模式为队列(即消息发送者和消息接收者)。

    1. 如果消息接收者在处理完一条消息的处理过程后没有对MOM进行应答,则该消息将由MOM重发.

    2. 如果我们队某个队列设置了预读参数(consumer.prefetchSize),如果消息接收者在处理第一条消息时(没向MOM发送消息接收确认)就宕机了,则预读数量的所有消息都将被重发!

    3. 如果Session是事务的,则只要消息接收者有一条消息没有确认,或发送消息期间MOM或客户端某一方突然宕机了,则该事务范围中的所有消息MOM都将重发。

    4. 说到这里,大家可能会有疑问,ActiveMQ消息服务器怎么知道消费者客户端到底是消息正在处理中还没来得急对消息进行应答还是已经处理完成了没有应答或是宕机了根本没机会应答呢?其实在所有的客户端机器上,内存中都运行着一套客户端的ActiveMQ环境,该环境负责缓存发来的消息,负责维持着和ActiveMQ服务器的消息通讯,负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境来完成的。

    我们可以来对ActiveMQ的重发策略(RedeliveryPolicy)来进行自定义配置,其中的配置参数主要有以下几个:

    可用的属性

    属性默认值说明

    1. collisionAvoidanceFactor默认值0.15,设置防止冲突范围的正负百分比,只有启用useCollisionAvoidance参数时才生效。
      lmaximumRedeliveries默认值6,最大重传次数,达到最大重连次数后拋出异常。为-1时不限制次数,为0时表示不进行重传。

    2. maximumRedeliveryDelay默认值-1,最大传送延迟,只在useExponentialBackOff为true时有效(V5.5),假设首次重连间隔为10ms,倍数为2,那么第二次重连时间间隔为20ms,第三次重连时间间隔为40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。

    3. initialRedeliveryDelay默认值1000L,初始重发延迟时间
      lredeliveryDelay默认值1000L,重发延迟时间,当initialRedeliveryDelay=0时生效(v5.4)

    4. useCollisionAvoidance默认值false,启用防止冲突功能,因为消息接收时是可以使用多线程并发处理的,应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡broker处理性能,不会有时很忙,有时很空闲。

    5. useExponentialBackOff默认值false,启用指数倍数递增的方式增加延迟时间。

    6. backOffMultiplier默认值5,重连时间间隔递增倍数,只有值大于1和启用useExponentialBackOff参数时才生效。

    展开全文
  • ActiveMQ面试题

    2020-04-16 06:56:37
    ActiveMQ宕机了怎么办 官方的解决方案是主从集群(备份)方案 zookeeper集群 Replicated(瑞pk得) levelDB就是之前在讲消息持久化kahaDB的另一种消息持久化方案,这种方案的性能会比较好 activemq集群 activemq最...

    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方法

    展开全文
  • 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消息有两种类型:点对点、发布/订阅

     

    展开全文
  • 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 的持久化更无从谈起

    展开全文
  • 10 ActiveMQ面试题

    2020-06-14 22:09:01
    ActiveMQ面试题
  • ActiveMq面试题

    2019-05-20 13:33:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • ActiveMQ面试题总结

    2020-03-30 22:40:32
    ActiveMQ面试题总结:https://blog.csdn.net/Future_LL/article/details/86767855
  • 7道消息队列ActiveMQ面试题分享给你! 大家面试前,必须狠刷面试题,哥给你们整理了面试过程中必问的一些面试,希望对你们有帮助,祝你们早日找到满意的工作。
  • ActiveMQ面试题讲解-6

    2019-05-07 21:56:48
    activemq activemq面试题
  • 【81】ActiveMQ常见面试题一、什么是activemq activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。 二、activemq的作用以及原理 ...
  • Java ActiveMQ面试题

    2020-08-14 11:54:21
    1、如何使用ActiveMQ解决分布式事务? 在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作: ● 收集用户录入信息,保存到数据库 ● 向用户的手机或邮箱发送验证码 如果是传统的集中式...
  • ActiveMQ 面试题(长期更新)

    万次阅读 2019-05-02 16:38:51
    什么是activemq activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。 activemq的作用以及原理 Activemq的作用就是系统之间进行...
  • ActiveMQ面试专题 什么是activemq activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。 activemq的作用以及原理 Activemq的...
  • 【81】ActiveMQ常见面试题一、什么是activemq activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。 二、activemq的作用以及原理 ...
  • activeMq面试题

    2018-12-31 11:40:17
    一、activemq服务器宕机怎么办?  这得从activemq的存储机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,他们的最大限制在配置文件的&lt;systemUsage&gt; 节点中...
  • activeMQ技术栈 详细介绍一下MQ MQ简称消息队列,他是一个不同项目之间进行通讯时,对消息进行管理的组件。有了MQ,可以使项目之间交互由同步转换成异步,解耦了消息的处理过程。把消息统一管理起来,按照顺序,根据...
  • 本课程共6节内容,是从“精讲”课程中抽取出来的面试题详解,内容包括基础、主从架构的搭建和访问、分布式集群搭建和访问等。如果您对整个课程感兴趣可以直接在本网站搜索“张立坤”讲师即可查看我的所有课程的精讲...
  • 目录 消息中间件的引用场景 JMS消息模型: 点对点模型的特点: 发布/订阅模型的特点: 核心API: ...ActiveMQ的高级特性 ...ActiveMQ消息持久化 ...ActiveMQ企业经典面试问题 ActiveMQ宕机了怎么办? 如何防止
  • 1.什么是 ActiveMQ? activeMQ 是一种开源的,实现了 JMS1.1 规范的,面向消息(MOM)的中间件,为应用程序提供高效的、 可扩展的、稳定的和安全的企业级消息通信 2. ActiveMQ 服务器宕机怎么办? 这得从 ...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 330
精华内容 132
关键字:

activemq面试题