java 极客_Java极客思维

xgx120413

xgx120413

开篇介绍

大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java一些消息中间件高频面试题进行分享。

通知:公众号【Java极客思维】正在送书福利活动,关注公众号并参加福利活动吧!只有参与了本次活动的小伙伴才能够参与年底的大福利,不要错过呀~

Q1:

RabbitMQ 的介绍、用途、好处?

RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的消息中间件。

作用:解耦 、 异步 、 削峰 。

优点:解耦、异步、削峰;

缺点:降低了系统的稳定性:系统中使用了消息队列,如果消息队列挂了,那么系统也会挂。降低了系统可用性。

加入消息队列,要考虑很多方面的问题,比如:一致性问题 、如何保证消息不被重复消费 、 如何保证消息可靠性传输 等。因此考虑的因素有很多方面,复杂性增加。

Q2:

RabbitMQ 包括哪些要素?生产者 :消息的创建者,发送到RabbitMQ

消费者 :连接到RabbitMQ,订阅到队列上,消费消息,持续订阅(basicConsumer)和单条订阅(basicGet)

消息 :包含有效载荷和标签,有效载荷指要传输的数据,标签描述了有效载荷,并且RabbitMQ用它来决定谁获得消息,消费者只能拿到有效载荷,并不知道生产者是谁。

Q3:

RabbitMQ 什么是信道?

信道:是生产者、消费者与RabbitMQ通信的渠道,生产者publish或是消费者subscribe一个队列都是通过信道来通信的。信道是建立在TCP连接上的虚拟连接。就是说RabbitMQ在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在RabbitMQ都有一个唯一的ID,保证了信道私有性,对应上唯一的线程使用。

疑问:为什么不建立多个TCP连接?

原因是RabbitMQ需要保证性能,系统为每个线程开辟一个TCP是非常消耗性能的,美妙成百上千的建立销毁TCP会严重消耗系统性能;所以RabbitMQ选择建立多个信道(建立在TCP的虚拟连接)连接到RabbitMQ上

Q4:

RabbitMQ概念里的channel、exchange 和 queue是逻辑概念,还是对应着进程实体?作用分别是什么?

queue 具有自己的 erlang 进程;

exchange 内部实现为保存 binding 关系的查找表;

channel 是实际进行路由工作的实体,负责按照 routing_key 将 message投递给queue。

由 AMQP 协议描述可知,channel 是真实TCP连接之上的 虚拟连接 , 所有AMQP 命令都是通过 channel 发送的,且每一个 channel 有 唯一的ID 。一个 channel 只能被单独一个操作系统线程使用,所以投递到特定的 channel 上的 message 是有顺序的。单一个操作系统线程上允许使用多个channel。

Q5:

RabbitMQ消息是如何路由的?

消息路由必须有三部分:交换器、路由、绑定。

生产者把消息发布到交换器上,绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。

消息发布到交换器时,消息将拥有一个 路由键(routing key) , 在消息创建时设定。

通过队列路由键,可以把队列绑定到交换器上。

消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进入"黑洞"。

常用的交换器主要分为以下三种:direct :如果路由键完全匹配,消息就会被投递到相应的队列;每个AMQP的实现都必须有一个direct交换器,包含一个空白字符串名称的默认交换器。声明一个队列时,会自动绑定到默认交换器,并且以队列名称作为路由键:channel -> basic_public($msg, '', 'queue-name')

fanout : 如果交换器收到消息,将会广播到所有绑定的队列上;

topic :可以使来自不同源头的消息能够到达同一个队列。使用topic交换器时,可以使用通配符,比如:"*" 匹配特定位置的任意文本,"." 把路由键分为了几个标识符, "#" 匹配所有规则等。

特别注意:发往topic交换器的消息不能随意的设置选择键(routing_key),必须是有"."隔开的一系列的标识符组成。

Q6:

RabbitMQ消息确认过程?

消费者收到的每一条消息都必须进行确认(自动确认和自行确认)

消费者在声明队列时,可以置顶autoAck参数,当autoAck = false时,RabbitMQ会等待消费者显式发送回 ack 信号后才从内存(和磁盘,如果是持久化消息的话)中删除消息,否则RabbitMQ会在队列中消息被消费后立即删除它。

采用消息确认机制后,只要使 autoAck = false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题,因为RabbitMQ会一直持有消息直到消费者显式调用basicAck为止。

当autoAck = false时,对于RabbitMQ服务器端而言,队列中的消息分成了两部分:一部分是等待投递给消费者的消息;一部分是已经投递给消费者,但是还没有收到消费者ack信号的消息。如果服务器端一直没有收到消费者的ack信号,并且消费此消息的消费者已经断开连接,则服务器端会安排该消息 重新进入队列,等待投递给下一个消费者(也可能还是原来的那个消费者)。

RabbitMQ不会为 ack消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是RabbitMQ允许消费者消费一条消息的时间可以很久很久。

Q7:

如何保证RabbitMQ不被重复消费?

正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认信息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除。

但是因为网络传输等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

解决思路:

保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;

保证消息幂等性;

比如:在写入消息队列的数据做唯一标识,消费消息时,根据唯一标识判断该消息是否被消费过。

Q8:

如何保证RabbitMQ消息的可靠传输?

消息不可靠的情况可能是消息丢失,劫持等原因;

丢失可能又分为:生产者丢失消息

消息队列丢失消息

消费者丢失消息

生产者丢失消息:

从生产者弄丢数据来看,RabbitMQ提供了 transaction 机制 和 confirm 模式 来确保生产者不丢失消息;transaction机制: 发送消息前,开启事务(channel.exSelect()),然后发送消息,如果发送过程中出现异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit())。

confirm模式:一般这种模式居多,一旦channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列后;RabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了。

如果RabbitMQ没能处理该消息,则会发送一个Nack消息回来,这样可以进行重试操作。

消息队列丢失消息:

针对消息队列丢失数据的情况,一般是开启持久化磁盘的配置:

将队列的持久化标识 durable 设置为 true , 则代表是一个持久的队列,发送消息的时候讲 deliveryMode=2 这样设置以后,即使RabbitMQ挂了,重启后也能恢复数据。

消费者丢失消息:

消费者丢失消息一般是因为采用了自动确认消息模式,改为手动确认消息即可。

消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;如果这时候处理消息失败,就会丢失该消息;

解决方案:处理消息成功后,手动回复确认消息。

点关注、不迷路

如果觉得文章不错,欢迎关注、点赞、收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。

如果你还想更加深入的了解我,可以微信搜索「Java极客思维」进行关注。每天8:00准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!查看原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java拼三级魔方_魔方秘籍(详细解法)《三阶》

魔方根据视频理解:上 下 左 右先将白面变好:(1).变一个白十字(如图所示)(2).转好以后检查十字的四个角的颜色(蓝绿红橙)与旁边面上的中心块的颜色是否相同。(有两个相同的时,如果它们相邻,就一个放在后面,一个放在左面…

php怎么实现点卡充值,利用自动发卡程序的点卡充值传奇脚本

首先:自动售卡 玩家购买到卡密 在游戏输入卡密领取元宝下面是NPC脚本:[main]!这里是点卡充值平台!\\\ \ \\[InPutString18]#IFCHECKCODELIST ..\QuestDiary\卡号列表\5.txt#actCLEARCODELIST ..\QuestDiary\卡号列表\5.txtGAMEGOL…

php转换ofd文件格式,一种OFD格式文档支持脚本的方法与流程

本发明涉及电子文档格式的处理技术,特别涉及一种OFD格式文档支持脚本的方法。背景技术:OFD是一种版式文档格式,全称为开放式版式文档(Open Fixed-layout Document),是国家版式文档格式规范。版式文档是电子文件应用的一个重要门类…

php成品代码,PHP代码

日期当日date(Y-m-d")date(Y-m-d 00:00:00)取日期:年 月 日date("Y", strtotime($startday))date("m", strtotime($startday))date("d", strtotime($startday))上月 下月$last_mont_first_date date(Y-m-01 00:00:00,strtotime…

tp框架中引入php文件,Laravel框架及ThinkPHP框架超级简单的公共文件引入(保留变量)...

为什么要把两个框架放在一起来说呢?额。。。因为TP5.1.x与Laravel实在是太像了,本文主要讲述关于大家顶部及底部文件引入的问题。但是如果顶部和尾部只是单纯的html代码还好说,但是里面通常有变量赋值和循环遍历以及判断等逻辑,这样就带来了比…

pHp30充电宝能用快充吗,65W快充 30分钟充满电 是时候淘汰充电宝了吗?

在过去的一年里,手机快充技术有了新的突破,OPPO推出了65W快充。无独有偶,联想拯救者电竞手机的预热宣传中,号称搭载90W快充。有评测称,使用65W快充,30分钟可以充满一块4000mAh容量的电池,使用90…

php+mockjs,mockjs的常用方法分享

本文主要和大家分享mockjs的常用方法,结合文字和代码和大家讲解,希望能帮助到大家。一.mock.mock()根据数据模板生成模拟数据。更关键的是,我们发起Ajax请求的时候要能够接收到这些数据。这就是Mock.mock()的作用啦!Mock.mock( ru…

php 截取音频文件后缀名,使用PHP从音频流中提取音轨信息

这是一个PHP功能,让您从流媒体URL中提取MP3元数据(StreamTitle)。通常,流服务器icy-metaint在响应中放置一个标题,告诉我们在流中发送元数据的频率。该函数检查该响应头,如果存在,它将用它替换interval参数。否则&…

matlab画圆柱,Matlab 画三维圆柱体

主要学习了画空间圆柱体和空间长方形的绘制方法。有两个surface property:FaceColor和EdgeColor’;先讲FaceColor’,它指定了surface画出曲面的颜色,可以是[r,g,b]的一个向量,分别表示了红绿蓝的颜色配比;也可以是inte…

matlab类间散度矩阵,协方差矩阵和散布矩阵(散度矩阵)的意义

在机器学习模式识别相关算法中,经常需要求样本的协方差矩阵C和散布矩阵S。如在PCA主成分分析中,就需要计算样本的散度矩阵,而有的教材资料是计算协方差矩阵。实质上协方差矩阵和散度矩阵的意义就是一样的,散布矩阵(散度矩阵)前乘以…

把树分成森林 matlab,20170106RF_Matlab 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,包括两个方面:数据的随 269万源代码下载- www.pudn.com...

文件名称: 20170106RF_Matlab下载 收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 441 KB上传时间: 2017-01-06下载次数: 0提 供 者: yanxiu详细说明:随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,包括两个方面:数据的随…

inur new.php id,Cmsez(随易)全站系统 0day

程序名称:Cmsez Web Content Manage System v2.0.0文件:comments.php viewimg.php代码:---------------//commentsinclude "mainfile.php";$artnew article();//设定$confirmyes;//yes:需要管理员认证后才能显示,no:直接显示$membe…

PHP红黑源码,红黑树的实现源码(第二次修订版)

/*-----------------------------------------------------------RB-Tree的插入和删除操作的实现算法参考资料:1) <>2) http://lxr.linux.no/linux/lib/rbtree.c作者&#xff1a;http://www.cppblog.com/converse/您可以自由的传播&#xff0c;修改这份代码&#xff0c;转…

python 自动点击上传以后上传文件,python使用selenium模拟点击网页实现自动导入上传文件功能...

一、环境准备Python版本&#xff1a;3.4编辑器&#xff1a;Pycharmexcel文件&#xff1a;导入的excel模板二、python代码由于工作需要&#xff0c;需要每天定时导入相关excel文件进入后台数据库&#xff0c;由于导入的逻辑比较复杂&#xff0c;所以决定通过python模拟登陆导入网…

php绘制频谱图,一步一步教你实现iOS音频频谱动画(二)

本文是系列文章中的第二篇&#xff0c;上篇讲述了音频播放和频谱数据计算&#xff0c;本篇讲述数据处理和动画的绘制。前言在上篇文章中我们已经拿到了频谱数据&#xff0c;也知道了数组每个元素表示的是振幅&#xff0c;那这些数组元素之间有什么关系呢&#xff1f;根据FFT的原…

php删除尾部字符,php如何删除字符串末尾字符

我们知道字符串删除字符的方式有好几种&#xff0c;今天就来介绍三种php删除字符串最后一个字符的函数&#xff0c;有需要的小伙伴可以参考一下。方法一&#xff1a;substr()函数substr()函数返回字符串的一部分。语法如下&#xff1a;substr(string string, int start, int [l…

empinfo Oracle数据库,Oracle数据库---包

--根据员工号或员工姓名获取员工的信息--根据员工号或员工姓名删除员工的信息--创建包规范CREATE OR REPLACE PACKAGE overload_pkgISFUNCTION get_info(eno NUMBER) RETURN emp%ROWTYPE;FUNCTION get_info(name VARCHAR2) RETURN emp%ROWTYPE;PROCEDURE del_emp(eno NUMBER);P…

oracle查看context,oracle context(上下文)

context在计算机领域翻译为上下文context的信息也就是当前会话中的环境变量&#xff0c;如&#xff1a;登录的session_id&#xff0c;用户名&#xff0c;语言等信息查看context中的属性信息。oracle默认的为我们创建了一个context叫userenv(user environment)SYS_CONTEXT(USERE…

oracle标量子查询的优势,标量子查询

--标量子查询select e.empno, e.ename, e.sal, e.deptno,(select d.dname from dept d where e.deptno d.deptno)as dnamefrom emp e--插入一条数据insert into emp(empno,deptno) values(9999,null)--返回结果15条记录--改成left join(hash outer)select e.empno, e.ename, e…

切割照片php上传,php下ajax的文件切割上传

var myForm document.getElementById("myForm");var upfile document.getElementById("upfile");myForm.onsubmit function() {//获取文件对象var file upfile.files[0];//获取文件大小var fileSize file.size;//一次截取的大小(字节)var CutSize 10…