大家好,今天来为大家分享mq面试必背知识点的一些知识点,和双11冷知识点的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
本文目录
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,保证消息一直存在。
实在没办法了的终极解决方案,就是抛弃部分消息,然后过了高峰以后,依靠日志等方式人肉维护。。。
最后,说一个我之前的公司,为了避免重复消费和消息丢失的解决方案,就是在生产者发送消息前和消费者接收消息后,在本地记录一条数据,然后定时对比两者的差异,来确保这两个问题不会发生。同样该方案也可用于处理积压,完全可以抛弃消息,最后依靠生产者记录的数据进行维护。这种方式比较适合业务分离状态的,如购物场景,只要保证用户下单成功即可,后续的出库,赠加积分,赠送优惠券等功能稍缓缓也不碍事,但是如果是时效性较高的业务,比如商品查询,可能商品描述、商品价格、商品图片都是不同的服务在处理,如果一个服务不能正常返回,那这个业务就无法正常开展。这种情况,就建议采用限流策略了。
关于国内国际双循环的知识点
双循环是指以国内大循环为主体、国内国际双循环相互促进的新发展格局。基于“双循环”的新发展格局需要将满足国内需求作为发展的出发点和落脚点,加快构建完整的内需体系。大力推进科技创新及其他各方面创新,加快推进数字经济、智能制造、生命健康、新材料等战略性新兴产业,形成更多新的增长点、增长极,着力打通生产、分配、流通、消费各个环节,逐步形成以国内大循环为主体、国内国际双循环相互促进的新发展格局,培育新形势下我国参与国际合作和竞争新优势。
构建基于“双循环”的新发展格局是基于国内发展形势、把握国际发展大势作出的重大判断和重要战略选择。从经济发展的本质来看,构建国内国际双循环相互促进的新发展格局,是利用好国内国际两个市场持续推进我国高质量发展的必然要求,也是推动我国开放型经济向更高层次发展的重大战略部署。
从内需看,我国具有形成完整内需体系的基础和条件。因为我国具有全球最完整、规模最大的工业体系、强大的生产能力、完善的配套能力,拥有1亿多市场主体和1.7亿多受过高等教育或拥有各类专业技能的人才,还有包括4亿多中等收入群体在内的14亿人口所形成的超大规模内需市场。
从国际市场看,我国面对世界经济深度衰退、国际贸易和投资大幅萎缩、国际金融市场动荡、国际交往受限、经济全球化遭遇逆流、一些国家保护主义和单边主义盛行、地缘政治风险上升等不利局面,必须在一个更加不稳定、不确定的世界中谋求发展。这就要求我们必须执行扩大内需战略,以缓冲全球化退潮带来的贸易保护主义威胁,尤其是疫情导致保护主义更为严重,一些国家推动制造业本地化的政策,中国在面临供应链产业链转移压力同时,还受到科技脱钩威胁中国供应链产业链的安全。
因此,我们必须以扩大内需帮助形成完整内需体系,补齐供应链、产业链短板,维护产业链、供应链安全。一方面,要打通生产、分配、流通、消费各个环节,逐步形成以国内大循环为主体的格局,另一方面,要推进数字经济、智能制造、生命健康、新材料等战略性新兴产业,形成更多新的增长点、增长极,培育自己的供应链产业链体系。必须指出的是,加快构建完整的内需体系,维护供应链产业链安全,并非是临时抱佛脚的政策,而是中国长期发展战略,只是在当前形势下得以强化。长期以来,中国一直推动经济结构的“再平衡”,形成以内需为驱动的发展,摆脱对出口的依赖。当然,我们不能像美国那样过度依赖消费而导致产业结构、国际收支失衡,但也不能过度重视生产而忽略消费,要求实现生产与消费的平衡状态,在生产供给端,要推进供给侧结构性改革,提高发展质量;在消费端,理顺收入分配,改善消费环境,满足消费升级,支持扩大内需。因此,加快构建完整的内需体系是一项长期战略,目前的国际环境使之具有迫切性。
以满足国内需求作为发展的出发点和落脚点,加快构建完整的内需体系,不是简单的如何扩大内需以及维护经济运行与增长,而是着眼于“内需体系”的建立,这个体系包括供给侧结构性改革、收入分配改革、金融税务改革、商业消费环境改革、流通领域的改革、知识产权保护等一系列领域的改革,从而构建完整的内需体系。在以国内大循环为主体、国内国际双循环相互促进的新发展格局中,国内大循环处的主体地位是国际循环的基础和保证,国际循环则起着带动和优化的作用,是国内循环的外延和补充。
应以国内大循环为基础,以满足国内需求作为发展的出发点和落脚点,在此基础上持续深化对外开放,拓展国际市场,构建国内国际双循环相互促进的新发展格局。改革开放以来,中国通过开放政策引入外资,参与全球分工,发展国际循环,成为全球供应链枢纽,也成为全球最大的贸易国,有力推动了我国经济的快速发展。但是,我们要看到,如果国际循环脱离国内循环,势必失去其有效运转的支撑点。从两者关系来看,国际循环是次循环,国内循环则是主循环。
但是,我国仍然需要以开放、合作、共赢胸怀谋划发展,坚定不移推动经济全球化朝着开放、包容、普惠、平衡、共赢的方向发展,推动建设开放型世界经济。中国也努力在构建全面开放的新格局,逐步更深的融入全球经济。
国际循环会带动和优化国内循环。事实已经证明这一点,当我国参与到全球市场分工之后,引入了资本与技术,然后通过“出口—产业链拉长—增加就业和收入”阶段以及“国民经济快速增长—内需扩大—强化国际循环”阶段,实现了国家经济的飞速发展,应当说,国际循环起到了很大的带动效应,第一动力。
与此同时,我国参与国际分工,扩大国际贸易,为中国企业积累了资本、技术和人才。现在扩大开放,就是更大程度与国际规则接轨,引入竞争,让更多的外资企业进入国内循环,通过竞争提升国内企业的国际竞争力,推动经济和企业高质量发展。当更多的中国企业在竞争中成为跨国企业后,就能提高中国经济在全球配置资源的优势,并促进国内产业链和价值链在国际经济体系迈向高端。
北京小升初英语必考知识点
我觉得如果要是小学升初中的时候,如果要是考英语的话,我觉得他必考的知识点应该是从单词开始,完了,有组词,名词,形容词等等,考的内容不会太难!
文章到此结束,如果本次分享的mq面试必背知识点和双11冷知识点的问题解决了您的问题,那么我们由衷的感到高兴!