dubbo常见面试题 go面试题
- 开发语言
- 2023-09-25
- 56
大家好,今天来为大家分享dubbo常见面试题的一些知识点,和go面试题的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您...
大家好,今天来为大家分享dubbo常见面试题的一些知识点,和go面试题的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
【面试题】dubbo的工作原理,注册中心挂了可以继续通信吗
说一下的dubbo的工作原理?注册中心挂了可以继续通信吗?说说一次rpc请求的流程?面试官心理分析
MQ、ES、Redis、Dubbo,上来先问你一些思考性的问题、原理,比如kafka高可用架构原理、es分布式架构原理、redis线程模型原理、Dubbo工作原理;之后就是生产环境里可能会碰到的一些问题,因为每种技术引入之后生产环境都可能会碰到一些问题;再来点综合的,就是系统设计,比如让你设计一个MQ、设计一个搜索引擎、设计一个缓存、设计一个rpc框架等等。
那既然开始聊分布式系统了,自然重点先聊聊dubbo了,毕竟dubbo是目前事实上大部分公司的分布式系统的rpc框架标准,基于dubbo也可以构建一整套的微服务架构。但是需要自己大量开发。
当然去年开始springcloud非常火,现在大量的公司开始转向springcloud了,springcloud人家毕竟是微服务架构的全家桶式的这么一个东西。但是因为很多公司还在用dubbo,所以dubbo肯定会是目前面试的重点,何况人家dubbo现在重启开源社区维护了,捐献给了apache,未来应该也还是有一定市场和地位的。
既然聊dubbo,那肯定是先从dubbo原理开始聊了,你先说说dubbo支撑rpc分布式调用的架构啥的,然后说说一次rpc请求dubbo是怎么给你完成的,对吧。面试题剖析dubbo工作原理
第一层:service层,接口层,给服务提供者和消费者来实现的
第二层:config层,配置层,主要是对dubbo进行各种配置的
第三层:proxy层,服务代理层,无论是consumer还是provider,dubbo都会给你生成代理,代理之间进行网络通信
第四层:registry层,服务注册层,负责服务的注册与发现
第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
第七层:protocal层,远程调用层,封装rpc调用
第八层:exchange层,信息交换层,封装请求响应模式,同步转异步
第九层:transport层,网络传输层,抽象mina和netty为统一接口
第十层:serialize层,数据序列化层工作流程
第一步:provider向注册中心去注册
第二步:consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
第三步:consumer调用provider
第四步:consumer和provider都异步通知监控中心
java面试题有哪些
肝了一个月的面试题终于来啦,大家开心不。
2020年最新Java面试题整理,全网最全一份,包含各个技术栈,Java基础,Java集合,多线程,Java异常,spring,springMVC,springboot,springcloud,netty,dubbo,activemq,Javaweb,jvm,kafka,MongoDB,mybatis,MySQL,Nginx,rabbitmq,Redis,Tomcat,zookeeper,设计模式,数据结构,算法,分布式,限流,降级,cap原理等等知识点
话不多说,直接上图
总共80多个PDF
【BAT必备】计算机网络面试题:
链接:https://pan.baidu.com/s/1hFggmtdL1ZmE4utBlo8S1g提取码:qfkh
【BAT必备】设计模式面试题
链接:https://pan.baidu.com/s/1eXJveIVvQe-m3MdvLcT-fQ提取码:j0kx
【BAT必备】数据结构算法面试题:
链接:https://pan.baidu.com/s/1daFN9jY03fXsqwc9LeKi2w提取码:5ab7
【BAT必备】多线程面试题:
链接:https://pan.baidu.com/s/1GdvsNESoHPBjWKN2h-iK7Q提取码:cqib
【BAT必备】并发编程锁面试题:
链接:https://pan.baidu.com/s/1hXPPtMY2dvz-g7QcSTc3PA提取码:zhmy
【BAT必备】tomcat面试题:
链接:https://pan.baidu.com/s/1qPZXx4lmLynmaF0XjRTzpQ提取码:5m16
【BAT必备】zookeeper面试题:
链接:https://pan.baidu.com/s/1EhOee9e1Qe-Q6RC8KlthxA提取码:p2am
【BAT必备】spring全家桶面试题:
链接:https://pan.baidu.com/s/1DXGO-N5P6QIGKLZ8LIVOuQ提取码:m9v7
【BAT必备】rocketMq面试题:
链接:https://pan.baidu.com/s/1TEF3yUR4OOaIpj-4ud_79A提取码:3g3d
【BAT必备】redis面试题:
链接:https://pan.baidu.com/s/1qlanxWBfwvKUObnHulCQiA提取码:rjo7
【BAT必备】rabbitMq面试题:
链接:https://pan.baidu.com/s/1ywLiq3IUJVyZosPLNrmyTA提取码:0td4
【BAT必备】netty面试题:
链接:https://pan.baidu.com/s/1Pbv4aelqOt1dUPA2SwEB_Q提取码:2w1e
【BAT必备】Nginx面试题:
链接:https://pan.baidu.com/s/1r8YNyOz0N6MJ9F0045lEZw提取码:49tl
【BAT必备】MySQL面试题:
链接:https://pan.baidu.com/s/1GeX6Fs4nNi6fTUHKxJ2SZw提取码:8pow
【BAT必备】mybatis面试题:
链接:https://pan.baidu.com/s/1xOYiaiQ2JpPt2jb6GdWjaA提取码:aqd3
【BAT必备】MongoDB面试题:
链接:https://pan.baidu.com/s/1QTVx1TF8tDn6LUJr7wdfOQ提取码:j1qt
【BAT必备】Linux面试题:
链接:https://pan.baidu.com/s/1veZ3dBJmz1PduCE5tl-e1A提取码:txpf
【BAT必备】kafka面试题:
链接:https://pan.baidu.com/s/1SWhiBCswleYGsDupSGzE6g提取码:o1gv
【BAT必备】jvm面试题:
链接:https://pan.baidu.com/s/1xi-QLq_I75kha439EGqELw提取码:kxde
【BAT必备】javaweb面试题:
链接:https://pan.baidu.com/s/1r3Bupn9qhJbw5ebR_6h94A提取码:qba4
【BAT必备】Java基础面试题:
链接:https://pan.baidu.com/s/1J40nYKIoV_VMCumoRpIyhQ提取码:5xo7
【BAT必备】dubbo面试题:
链接:https://pan.baidu.com/s/10flnh7Tb0Oxd3yZPQOnjsA提取码:5gc9
【BAT必备】activeMQ面试题:
链接:https://pan.baidu.com/s/1igNB64dpMCjCQkRzvqCXpQ提取码:006a
【BAT必备】分布式相关面试题大全面试题:
链接:https://pan.baidu.com/s/1ZcpJDh07B2NPAL4_4VC6jQ提取码:w4mw
【BAT必备】java面试题大全:
链接:https://pan.baidu.com/s/11jw0Ua4CZiI8-S6EadM_iQ提取码:epmp
【BAT必备】Java面试汇总
链接:https://pan.baidu.com/s/1vG9_cNoiYBW5TY32S4wGnQ提取码:k087
【BAT必备】2020年多家公司整理的350道Java面试题手册
链接:https://pan.baidu.com/s/1FEGQVTgiyKG0kCasYn-n2g提取码:f7y1
【BAT必备】Java全部核心知识点整理
链接:https://pan.baidu.com/s/1StG-ib70TDAE1Hb4NVLQRQ提取码:5rp1
整理这些非常辛苦,大家点个赞在走吧想学软件测试,怎么学
2020年,软件测试行业还值得入行吗?
行业的现状及前景
那么处于2020年,软件测试这个行业又将如何发展呢?我谈一下几点,如果你处在这个行业,一定能体会到我说的对不对。
表面"衰落"的测试行业鉴于过去的大形势变化,不懂技术的测试工程师会逐渐被淘汰出局.一波测试工程师的失业潮是在所难免的.虽然早期我也呼吁身边的人赶紧脱离落后的业务体系,脱离落后的测试技能,但是看到很多人越来越生活艰难,也是挺心痛的.包括测试工程师的需求越来越少,招聘职位也越来越少,典型的新崛起的巨无霸公司比如facebook早期都没有QA.甚至前几年一度有QA团队是否值得存在的争论.表面看起来是测试行业衰落了.
有趣的是大家讨论QA团队是否值得存在的初衷,是为了更好的保证质量.这还是挺耐人寻味的.绝大多数的公司,都是非常支持QA部门的存在的,问题在于QA团队的存在的价值到底是大还是小.过去陈旧的测试体系,落后的测试人员能力,冗长的测试流程是被整个IT行业诟病的一个关键.当研发的生产力在逐渐的提升,运维的部署在逐渐的自动化,QA所带来的价值和耗费的成本就越来越不能忽视了.甚至成为了一个项目的最大的成本.这是任何一家公司都无法忽视的问题.早年阿里巴巴的高管曾经集体去硅谷拜访新崛起的巨无霸,得到的结论就是他们的流程和执行力比国内强很多.甚至facebook早年都没有QA就成长为大公司了.所以阿里就迅速推动了流程的裁剪.这部分包括裁撤SQA,裁撤需求分析师,裁撤项目经理,削减QA名额.进入产品,研发,测试三足鼎立的最简模式.QA会不会被撤掉也取决于这个部门的价值.所以不要想当然的觉得"存在即合理",现在部分的公司已经在试验"无QA"的模式了.互联网唯一不变的就是变化
比如一个典型的例子,在搜索,推荐,机器学习等方向的算法测试是很重要的领域,是需要专业的测试工程师参与的.这个行业能容纳很多的测试团队.但是测试行业这些年就没形成对这个领域的正确测试方法,结果最后丢失了这个市场.现在都是研发自己保证了.因为找不到合格的测试工程师去保证这个业务.
同样在性能测试领域也是如此,随着性能测试平台,全链路压测,性能监控,ABTest,云压测这类技术和服务的出现,性能测试工程师的需求也会缩小.越来越多公司里的性能测试都已经变成研发主导了.丢失了这块的业务,性能测试QA的需求量自然会受影响.
一定要记住,业务空间决定QA的生存空间,这是所有行业都通行的道理.如果你不能满足业务需求,就会被淘汰出局,要么选择退守防御要么选择勇于接受挑战
那测试行业的未来是什么样的那,很多人会担心.不过我还是整体乐观的.因为我喜欢整个行业,这些年也一直在进行不断的思辨.说下我的看法
2.测试从业人员的规模
从业人员规模跟生产力负相关,跟业务规模正相关.以后能有多大取决于技术和业务规模的双重因素.
首先是大环境因素,随着各种行业的互联网化,IT行业在扩大,外卖,美甲,甚至是无人机汽车航天产业都将成为科技公司.研发的队伍会扩大,QA的队伍自然也会整体扩大.前提是QA自己要跟得上时代.
其次是随着生产力提升自然就不会需要这么多人的.哪个行业都这样,测试行业并不特殊.就跟汽车行业一样.早年堆人,然后堆工具,堆技术,上机器人,改进流程.行业技术改进,测试技术改进,测试工具和测试服务的改进,都会一定程度提高了测试效率,减少了成本.这种改进会导致QA的团队更精炼高效.人数多意味着大家的价值跟富士康工厂里的工人一样廉价.追求高附加值才是正确的路.这对公司和测试团队都是双赢的.
第三个因素是行业地位.devops的流行是推动了研发和运维的密切合作.一旦这个阶段完成,产品的生产部署会非常的流畅.随之而来的就是问题会越来越早的暴露,大家对质量会更加的重视.到时候就会进入一个新的时代,DevQA.运维逐渐会管道化,Dev和QA会成为新的主角.只是到时候能撑大局的不一定是现在的软件测试工程师了会是新时代的测试工程师.
测试行业会越来越专业.人才,技术,工具,开源平台,服务会越来越多.越来越完善.术业有专攻,专业化分工仍然是大趋势.技术层面上也会有创新.以前的测试只能留下测试用例和业务知识文档没有什么连续性积累.随着接口测试,质量监控,覆盖率分析,业务建模等技术的突破,QA也会形成自己稳定可积累的业务数据,并逐渐形成自己的平台和业务.业务空间+技术门槛的双重因素是我坚信QA部门能长期存在的一个核心因素.
3.测试行业的管理会逐渐扁平化
几乎大部分的互联网公司都在分拆业务和QA团队从而提高执行力.所以管理上百人的总监职位会越来越少,而管理百人以下的总监会越来越多.不排除少量的巨无霸仍然没有改变.或者有些烧钱的初创公司倒行逆施.其中这些测试管理者会遇到一些新的挑战,比如更高层是研发出身居多.不懂研发体系几乎没有发展空间了.测试管理体系失去了上层建筑,对未来的影响还是深远的.会有阵痛,但是结果肯定会是好的
4.测试技术人才需求增多
原因是多方面的.大公司因为分拆的问题.不再有统一的测试技术支撑部门,所以分拆之后的每个团队都需要组建对应的职能团队,对测试技术人员的需求反而会增多.中小型公司也苛求质量保证效果,不止是要好,而且要求更快,也需要大量的技术人才.这几年通过各种招聘网站的招聘job的描述也能看得出来.
5.外包测试的灾难和新生
原来做欧美日韩外包业务的公司会因为国内互联网的发展逐渐式微,他们需要转型做国内.但是国内对外包业务也大多排斥,而且外包业务在效率沟通管理上都有诸多弊端.其自身也无法承载对测试工程师的培养和长期发展.所以这几年会有大量的外包测试工程师转型.这方面需要有新的优秀的外包服务公司.能做到有自己的测试服务,测试技术和高级的测试研究工程师才行.比如东软也开始做自己的各种云测平台之类的,就是一种为了迎合新时代的变更.
6.不懂开发的测试工程师已经是新时代的文盲
第一个是工作上已经没有太大的晋升空间.第二个是也很难跳槽.最好的结果是凭借多年的经验转管理.我跟行业的很多测试经理交流过,大部分工作超过6年的人,在测试执行上会倦怠,在测试技术的改进上已经无法入门,还不如招实习生.相对来说,有技术基础的人在工作8年以上仍然会保持自己的学习热情.所以未来测试团队的架构基本会是多数业务测试工程师+少数测试专家+测试经理的管理模式.以前不识字的是文盲,后来是不识英文的是文盲,在继各国呼吁加强对IT技术的重视后,新时代的文盲就已经快是不懂开发的人了.testerhome社区的成立的初衷就是希望唤醒整个行业对测试技术的重视.
7.测试行业的门槛增加
以前处于发展期,行业对人才的苛求是第一位的.现在随着大公司发展稳定,招人已经稳定了.他们基本只在211院校校招.社招也看学历.初创公司多是融资烧钱为主,在学历上和阅历上也是看的很高.能够不拘一格降人才的公司会越来越少.我之前推荐了不少同学去其他优秀的公司,其中有一部分同学就是技术不错,但是学历未过关.所以希望大家技能和学历上能够好好的重视这个问题.除了学历门槛,如上一条所说技术门槛也存在.所以加油吧,少年!
8.测试行业的薪资在提高
测试行业经过自身的净化洗涤会有新生.典型的变化就是薪资从以前的3k-15k的范围,整体提升到1w-3w之间.技术含量的提升,责任的提升必然会带来整体的回报.现在只要技术好,学历没问题.工作3年拿个两三万的月薪是很平常的.
后面会详细说薪资的方面。
9.研发工程师进入测试领域
这些年整个行业对测试行业的发展非常不满意,通俗点讲,大家都觉得测试很Low,但是又不能没有。研发提交项目给测试的心情就跟以前过年要去火车站排队买票一样.要申请测试资源,给测试讲解业务和实现,遇到比较low的或者新入职的,连搭建环境都不会还得手把手教.研发只是修改一行代码,QA或者测试那边就炸锅了.各种流程足以让研发头发都能掉好几根.作为参考对比,再思考下运维.当年部署个环境跟提交测试很像.要申请运维的介入,要申请机器资源,然后提交部署文档,还要明确基础环境,依赖库等各种细节的版本号.遇到本地行发布环境不行之类的问题还得跟运维撕逼.当年运维行业还流行着一句,"人"才是最关键的发布保证者.而现在随着持续交付和devops的流行.发布都已经做到"丝般柔滑"了,一键发布,自由选择灰度,平时的发布甚至都不需要运维参与.尝试了新模式的甜头后,对测试行业的弊端已经很难忍受了.所以在优秀的测试工程师和架构师难找的情况下,已经有越来越多的公司选择直接用研发工程师来顶了.他们的追求很简单.单测->接口测试->基础的冒烟测试,能够做到自动化就可以了.如果能像运维那样做成测试即服务就更完美了.
搞明白了测试行业的现状,明确了前景,那就要详细说说要学习哪些内容了。
自学软件测试要学习哪些内容?
我根据薪资的不同,划分成以下几个阶段具体说一下:
月薪5-9k:从零基础入门到能够找到工作月薪15-25k:测试在职搞定性能测试和自动化测试年薪30W+:搞定测试开发,进入一线大厂(文末有测试开发岗位简历模板,自己拿)
第一个阶段:月薪5-9k,刚刚入行,先学会功能测试!
可能你是刚毕业的学生,也可能你是打算转行进入软件测试这个行业,那么首先以下基本的理论你是必须要掌握的:
软件测试的定义、生命周期、工作流程、需求分析;测试用例的设计、编写、评审;bug的基本知识以及禅道的使用;测试计划、测试报告的编写;SVN、Git版本控制工具的使用;
搞定上上面的这些基本必备内容,就已经知道可以做具体的实战内容,这个时候最好是先找一个web测试项目去做一下,假如一个项目拿到手之后,按照下面的一套流程跑一遍:
发布项目进行立项,建立项目组进行分工;需求评审,学会如何看需求文档,进行需求分析,罗列测试点;整理测试点,编写测试用例,然后进行用例评审;执行测试,比如功能、界面、前后台、兼容性、数据库,对于发现的bug提交到禅道;分析、总结、编写测试报告;
这个流程完整的跑一遍之后,只能说对于整体的测试流程算是掌握了,但是仍然不足以找到一份合适的工作,想要学会做功能测试,以下的内容也是必须掌握的:
Linux相关技能
操作环境、命令、安装数据库、部署测试环境等
数据库相关技能
各种命令用法、字段、增删改查
接口测试相关技能
接口测试基本理论、http协议、测试方法;接口测试需求分析、用例编写、评审;几种工具的掌握,jmeter、postman、soupUI;
APP测试相关技能
安装/卸载、离线、UI、登录等测试内容;兼容性测试、monkey、fiddler抓包;
OK,搞定了这些,恭喜你已经可以投出你的简历去寻找一份测试的工作了!
简历不会写?文末帮你解决这个问题!
如果你已经入行了,且能够正常上手业务了,那么你就要思考第二个问题:如何获取更高的薪资?
第二个阶段:月薪15-25k,搞定性能、自动化测试,独当一面!
都说自动化玩好了很牛掰,但是性能测试才是互联网企业的核心痛点!
对于性能测试,业界很多都是在“耍流氓”,举个栗子:
我拿到了一份“流氓”的性能测试报告,上面只写了响应时间、TPS是多少,然后罗列了一下压力机基本配置情况,比如40个并发相应时间是5秒,TPS是260。
那么,我该怎么判断这次性能测试的有效性:
1.场景是否合理?
2.压力是否传递均匀或者传递到指定目标?
3.是否有干扰因素,或者说那些数据是否有效?
4.有没有一些可信的判断方法?
这些问题的出现,其实就是反映出了目前在做性能测试的一些误区:
只测不调,无法给出研发和运维人员执行建议无法定位问题,缺乏清晰的逻辑和数据证明价值性能测试工具≠性能测试性能测试技术体系落后(loadrunner),急需拥抱开源软件如果要搞定这些问题,那么性能测试你得这么去学:
性能测试的概念和流程
常见问题剖析、流行工具、方案设计
性能测试工具
jmeter工具的使用、实战;jmeter多协议、拓展与定制;分布式压测与任务调度;
性能监控
性能监控体系与监控数据采集
性能实施
分布式服务压测,场景设计、场景执行测试结果关联分析,TPS、响应时间、线程关联分析,压力和资源使用率关联分析
性能分析与报告
jvm调试与系统调试性能瓶颈分析
搞定这些,你完全可以很自信的和面试官说自己精通性能测试!
性能测试你能到这个程度,15k那是妥妥的了,如果下面自动化测试的学习内容你能够掌握,那就可以直接冲击月薪25k!
搞定Python或者Java语言,建议先从Python入手
基本的语言知识,语法、函数、模块、输入与输出、面向对象编程脚本编写、标准库、多线程、第三方库,外部数据处理unittest、pytest测试框架、参数化、数据驱动
web端的自动化测试
selenium安装、录制、处理web控件、JavaScript脚本、PO模式
移动端APP自动化测试
appium使用、录制、元素定位方法APP控件定位、交互,参数化用例appium问题定位分析、源码分析、二次封装
服务端接口自动化测试
接口自动化测试框架request接口请求构造、断言json/xml请求、响应断言headcookie处理、认证体系
上面这些说的是性能和自动化测试的学习路线和内容,搞定这些,基本上在这个行业,月薪2万以上是非常轻松的事情了!当然如果你想成为技术专家,或者想带领技术团队进行实施落地,那么请你接着往下看,关于年薪30W+的测试开发需要学习哪些内容:
完善测试技术体系
Linux、docker、shell、SQL、Python/java
打牢自动化测试技术基础
web自动化测试
selenium测试框架PageObject设计模式、原则、演练
APP自动化测试
Android自动化测试框架appium高级应用于原理剖析APP自动化测试实战测试框架封装改造ios自动化测试
移动专项测试
健壮性测试、弱网测试、崩溃检测、耗电量分析等移动端性能测试移动端安全测试
接口自动化测试
接口协议与抓包、代理技术与mock接口自动化测试框架、HTTPrunner测试框架dubbo接口自动化测试接口管理工具swagger、接口安全测试
docker容器技术
docker容器、docker镜像
持续集成/持续交付/devops
jenkins持续集成Jenkins持续交付
以上内容绝对不是泛泛而谈!建议收藏或关注,日后去验证。
mq面试必背知识点
主要有3点:解耦、异步、削峰(限流)。
其实就是在服务与服务之间增加了一个中间件,可以实现上面的三种用途。
?
解耦:我们看到,服务A强依赖服务B和C,当服务B或者C挂掉后,会直接导致服务A的不可用,这显然不是我们所期望的。比如服务的最后一步是记录日志,但是该服务挂了,虽然日志服务和主流服务没有必然的业务联系,但是因为代码的耦合性过高,直接导致整个服务响应失败。
异步:假如服务A本身执行只需要10ms,服务B需要5ms,服务C(日志服务)需要1s。同样的,一个和业务本身无关的服务过长的响应时间导致了整体服务的响应超时。
削峰:假如由于服务C只是记录日志的,服务器配置较低,1s只能处理2000条数据,但是高峰时段,每秒的请求高达10万笔,过高的请求会导致服务器崩溃。
可以看到,其实上面所讲的三种情况,都很类似,连起来可以这么理解。高峰时段导致服务C运行越来越慢,产生了“异步”所说的问题,如果长时间没解决,可能会导致“解耦”所说的情况,即服务挂掉。
在增加了MQ以后,我们可以在服务A执行完核心业务后,将后续处理的业务数据打入消息队列中,然后就可以返回成功。然后日志服务从消息队列中取到对应的消息进行处理即可。这样就实现了“解耦”和“异步”。在高峰时段,所有的数据都会打入消息队列中,而日志服务只需要按照自己的消费水平(2000条/s)取数据就好,保证了服务的平滑稳定。
二、MQ选型
主流的MQ有4种,ActiveMQ、RabbitMQ、RocketMQ和Kafka。不过ActiveMQ虽然框架成熟、曾经是MQ中的王牌,但是现在官方的维护频率越来越低,国内各大公司已经很少才用了,再加上吞吐量不高(比kafka低一个数量级),存在消息丢失的情况,所以现在新项目很少会采用了。
RabbitMQ是用ErLang语言开发的,性能上是最好的,但是由于ErLang语言不是主流语言,二次开发难度较高,很多想要根据实际情况进行二次开发的公司很少采用。不过如果只是简单使用的话,还是不错的,毕竟它的延时是最少的;并且RabbitMQ有一个最大的好处是它具有可视化界面,操作维护很方便。
RocketMQ是阿里开源的产品,经过了很多高并发项目的考验(如双十一),性能上是有保证的。纯Java编写,维护性高。我理解的它和kafka最大的不同有两点,一是它支持事务;二是集群结构不一致,它没有主从切换,当leader挂掉后,存在一定的感知时间,然后切换到follower上。
kafka的特点就是高吞吐量,一般配合大数据类的系统来进行实时数据计算、日志采集,在日志收集领域是事实上的标准。
另外,springCloud全家桶中,有一个springCloudStream消息驱动框架,该框架很好的封装了MQ操作的相关API,减轻了开发者在MQ方面的代码量,不过该框架只封装了RabbitMQ和kafka这两种MQ。
综上,如果需要对MQ传输提供事务支持或者解决高并发下的业务解耦,建议采用RocketMQ,微服务框架是dubbo的话,应该也建议用RocketMQ(这个没测过,个人猜测,毕竟都是阿里的产品)。如果是要做日志收集等工作,建议采用kafka。中小型公司使用springCloud全家桶开发的项目中,建议采用RabbitMQ(或者kafka)。
以上是查资料总结的,由于我平时都是使用的kafka,所以后面都以kafka为例了。
三、重复消费
重复消费在MQ中是一个重点问题,该问题是如何产生的?
kafka中有一个消息偏移量offset,每当消费者消费完一条消息时,执行commit,会将offset+1。如果一条消息在消费完以后尚未commitoffset,突发宕机,会让zookeeper认为该条消息没有被消费。导致消费者重启后重复消费之前的数据。
如何避免?
避免重复消费的问题,与同一个服务被多次调用的问题类似,就是如何解决服务的幂等性。大致有如下几个方案:
1、利用数据库的唯一性约束。
2、将数据存入redis中,利用redis天然的幂等性,然后再将数据从redis同步到数据库中
3、生产者发消息时增加一个唯一id(比如UUID),消费者消费成功后将该UUID存入redis中,每次消费前先查看该UUID是否存在。
四、消息丢失
消息丢失同样也是MQ中是一个重点问题。由于系统中存在生产者、消费者和MQ本身三个组件,所以需要从这三个方面分别讨论。
MQ本身丢失:由于kafka的集群是leader/follower模式,leader先接受消息后,再同步给follower,如果leader接收到消息后发生宕机,没来得及同步数据给follower,这时依靠选举机制产生了新的leader,但是它已经永远的失去了这条消息。为了避免这种情况发生,就需要修改kafka的配置,利用kafka自身的特性来解决。
首先给topic设置replication.factor参数:这个值必须大于1,要求每个partition必须有至少2个副本。
然后在kafka服务端设置min.insync.replicas参数:这个值必须大于1,这个是要求一个leader至少感知到有至少一个follower还跟自己保持联系,没掉队,这样才能确保leader挂了还有一个follower。
然后在producer端设置acks=all:这个是要求每条数据,必须是写入所有replica之后,才能认为是写成功了
最后在producer端设置retries=MAX(很大很大很大的一个值,无限次重试的意思):这个是要求一旦写入失败,就无限重试,卡在这里了。
这样配置以后,就可以保证只有所有的副本数据都同步成功后,才认为消息发送成功,避免了leader挂掉的情况。
消费者丢失:kafka有一个自动提交机制,每次接受到消息后自动提交offset。如果消息还未处理就挂掉了,但zk却已经接收到消费成功的通知,显然不合理,所以要避免使用kafka的自动提交,改为手动提交。
生产者丢失:显然,如果配置了acks=all以后,生产者是不会发生消息丢失的。
另外,查资料发现RabbitMQ和kafka的消息丢失情况不同,这里补充一个RabbitMQ的处理方式。
MQ本身丢失:由于RabbitMQ没有集群配置,所以只能依靠持久化到本地的方式来进行备份。如果接收到消息还没来得及备份就挂掉了,就会导致消息丢失。不过这个概率很低。如果发生了,可以利用生产者丢失的方式处理,见下。
消费者丢失:产生原因不说了。可以采用RabbitMQ提供的ack机制,即关闭RabbitMQ自动ack,然后通过api来调用就行,在确认处理完消息后,手动提交ack通知MQ。
生产者丢失:可能存在的问题就是生产者发送消息后,网络传输有问题导致了数据丢失。为了避免这种情况,一般会开启事务机制,保证数据一致性,但是事务机制由于是同步的,会造成系统性能下降,所以可以借鉴分布式事务的理念,即confirm机制。生产者发送消息后,开启异步接受MQ的反馈,收到后,默认消息发送成功,超时后触发消息重发机制。
五、如何确保消息顺序消费。
这个很简单,只要保证每个消费者或者每个处理线程都对应一个队列即可。
六、消息积压如何处理。
毕竟流量高峰的时间存在不长,只要最初规划MQ的空间时考虑到流量高峰的容量,一般是不会出现积压的,除非由于代码bug或者消费者宕机。
这时为了快速处理积压的消息,我们除了修正bug和重启服务器以外,还需要有提前定好的应急方案,即临时扩容消费者,增加消费者处理速度。并且不能设置消息的TTL,保证消息一直存在。
实在没办法了的终极解决方案,就是抛弃部分消息,然后过了高峰以后,依靠日志等方式人肉维护。。。
最后,说一个我之前的公司,为了避免重复消费和消息丢失的解决方案,就是在生产者发送消息前和消费者接收消息后,在本地记录一条数据,然后定时对比两者的差异,来确保这两个问题不会发生。同样该方案也可用于处理积压,完全可以抛弃消息,最后依靠生产者记录的数据进行维护。这种方式比较适合业务分离状态的,如购物场景,只要保证用户下单成功即可,后续的出库,赠加积分,赠送优惠券等功能稍缓缓也不碍事,但是如果是时效性较高的业务,比如商品查询,可能商品描述、商品价格、商品图片都是不同的服务在处理,如果一个服务不能正常返回,那这个业务就无法正常开展。这种情况,就建议采用限流策略了。
常见的Java面试题有哪些,如何能达到高薪就业
如果你想找一个不错的JAVA工作,下面这些知识是你面试必须要掌握的;
常用的线程通讯工具,比如CountDownLatch、CyclicBarrier、Semaphore等JDK并发包常用工具,比如ConcurrentHashMap、BlockingQueue、DelayQueue等JDK常用类源码解析,比如HashMap、ConcurrentHashMap等常用框架以及源码分析,Spring、Springboot常用微服务架构,Dubbo、Springcloud等常用互联网组件,zk、redis、rabbitMQ、kafka等常见算法最后一个比较重要的就是,心态和缘分如果以上你都掌握并拥有了,相信你会有一个不错的offer。
欢迎大家在评论区沟通交流!
关于dubbo常见面试题的内容到此结束,希望对大家有所帮助。
本文链接:http://xinin56.com/kaifa/35585.html