范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

我想进大厂之MQ夺命连环11问

  继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起来看看MQ的面试题。你们为什么使用mq?具体的使用场景是什么?
  mq的作用很简单,削峰填谷。以电商交易下单的场景来说,正向交易的过程可能涉及到创建订单、扣减库存、扣减活动预算、扣减积分等等。每个接口的耗时如果是100ms,那么理论上整个下单的链路就需要耗费400ms,这个时间显然是太长了。
  如果这些操作全部同步处理的话,首先调用链路太长影响接口性能,其次分布式事务的问题很难处理,这时候像扣减预算和积分这种对实时一致性要求没有那么高的请求,完全就可以通过mq异步的方式去处理了。同时,考虑到异步带来的不一致的问题,我们可以通过job去重试保证接口调用成功,而且一般公司都会有核对的平台,比如下单成功但是未扣减积分的这种问题可以通过核对作为兜底的处理方案。
  使用mq之后我们的链路变简单了,同时异步发送消息我们的整个系统的抗压能力也上升了。那你们使用什么mq?基于什么做的选型?
  我们主要调研了几个主流的mq,kafka、rabbitmq、rocketmq、activemq,选型我们主要基于以下几个点去考虑:由于我们系统的qps压力比较大,所以性能是首要考虑的要素。开发语言,由于我们的开发语言是java,主要是为了方便二次开发。对于高并发的业务场景是必须的,所以需要支持分布式架构的设计。功能全面,由于不同的业务场景,可能会用到顺序消息、事务消息等。
  基于以上几个考虑,我们最终选择了RocketMQ。
  Kafka RocketMQ RabbitMQ ActiveMQ 单机吞吐量 10万级 10万级 万级 万级 开发语言 Scala Java Erlang Java 高可用 分布式架构 分布式架构 主从架构 主从架构 性能 ms级 ms级 us级 ms级 功能 只支持主要的MQ功能 顺序消息、事务消息等功能完善 并发强、性能好、延时低 成熟的社区产品、文档丰富你上面提到异步发送,那消息可靠性怎么保证?
  消息丢失可能发生在生产者发送消息、MQ本身丢失消息、消费者丢失消息3个方面。生产者丢失
  生产者丢失消息的可能点在于程序发送失败抛异常了没有重试处理,或者发送的过程成功但是过程中网络闪断MQ没收到,消息就丢失了。
  由于同步发送的一般不会出现这样使用方式,所以我们就不考虑同步发送的问题,我们基于异步发送的场景来说。
  异步发送分为两个方式:异步有回调和异步无回调,无回调的方式,生产者发送完后不管结果可能就会造成消息丢失,而通过异步发送+回调通知+本地消息表的形式我们就可以做出一个解决方案。以下单的场景举例。下单后先保存本地数据和MQ消息表,这时候消息的状态是发送中,如果本地事务失败,那么下单失败,事务回滚。下单成功,直接返回客户端成功,异步发送MQ消息MQ回调通知消息发送结果,对应更新数据库MQ发送状态JOB轮询超过一定时间(时间根据业务配置)还未发送成功的消息去重试在监控平台配置或者JOB程序处理超过一定次数一直发送不成功的消息,告警,人工介入。
  一般而言,对于大部分场景来说异步回调的形式就可以了,只有那种需要完全保证不能丢失消息的场景我们做一套完整的解决方案。MQ丢失
  如果生产者保证消息发送到MQ,而MQ收到消息后还在内存中,这时候宕机了又没来得及同步给从节点,就有可能导致消息丢失。
  比如RocketMQ:
  RocketMQ分为同步刷盘和异步刷盘两种方式,默认的是异步刷盘,就有可能导致消息还未刷到硬盘上就丢失了,可以通过设置为同步刷盘的方式来保证消息可靠性,这样即使MQ挂了,恢复的时候也可以从磁盘中去恢复消息。
  比如Kafka也可以通过配置做到:acks=all 只有参与复制的所有节点全部收到消息,才返回生产者成功。这样的话除非所有的节点都挂了,消息才会丢失。 replication.factor=N,设置大于1的数,这会要求每个partion至少有2个副本 min.insync.replicas=N,设置大于1的数,这会要求leader至少感知到一个follower还保持着连接 retries=N,设置一个非常大的值,让生产者发送失败一直重试
  虽然我们可以通过配置的方式来达到MQ本身高可用的目的,但是都对性能有损耗,怎样配置需要根据业务做出权衡。消费者丢失
  消费者丢失消息的场景:消费者刚收到消息,此时服务器宕机,MQ认为消费者已经消费,不会重复发送消息,消息丢失。
  RocketMQ默认是需要消费者回复ack确认,而kafka需要手动开启配置关闭自动offset。
  消费方不返回ack确认,重发的机制根据MQ类型的不同发送时间间隔、次数都不尽相同,如果重试超过次数之后会进入死信队列,需要手工来处理了。(Kafka没有这些)
  你说到消费者消费失败的问题,那么如果一直消费失败导致消息积压怎么处理?
  因为考虑到时消费者消费一直出错的问题,那么我们可以从以下几个角度来考虑:消费者出错,肯定是程序或者其他问题导致的,如果容易修复,先把问题修复,让consumer恢复正常消费如果时间来不及处理很麻烦,做转发处理,写一个临时的consumer消费方案,先把消息消费,然后再转发到一个新的topic和MQ资源,这个新的topic的机器资源单独申请,要能承载住当前积压的消息处理完积压数据后,修复consumer,去消费新的MQ和现有的MQ数据,新MQ消费完成后恢复原状
  那如果消息积压达到磁盘上限,消息被删除了怎么办?
  这…他妈都删除了我有啥办法啊…冷静,再想想…有了。
  最初,我们发送的消息记录是落库保存了的,而转发发送的数据也保存了,那么我们就可以通过这部分数据来找到丢失的那部分数据,再单独跑个脚本重发就可以了。如果转发的程序没有落库,那就和消费方的记录去做对比,只是过程会更艰难一点。说了这么多,那你说说RocketMQ实现原理吧?
  RocketMQ由NameServer注册中心集群、Producer生产者集群、Consumer消费者集群和若干Broker(RocketMQ进程)组成,它的架构原理是这样的:Broker在启动的时候去向所有的NameServer注册,并保持长连接,每30s发送一次心跳Producer在发送消息的时候从NameServer获取Broker服务器地址,根据负载均衡算法选择一台服务器来发送消息Conusmer消费消息的时候同样从NameServer获取Broker地址,然后主动拉取消息来消费
  为什么RocketMQ不使用Zookeeper作为注册中心呢?
  我认为有以下几个点是不使用zookeeper的原因:根据CAP理论,同时最多只能满足两个点,而zookeeper满足的是CP,也就是说zookeeper并不能保证服务的可用性,zookeeper在进行选举的时候,整个选举的时间太长,期间整个集群都处于不可用的状态,而这对于一个注册中心来说肯定是不能接受的,作为服务发现来说就应该是为可用性而设计。基于性能的考虑,NameServer本身的实现非常轻量,而且可以通过增加机器的方式水平扩展,增加集群的抗压能力,而zookeeper的写是不可扩展的,而zookeeper要解决这个问题只能通过划分领域,划分多个zookeeper集群来解决,首先操作起来太复杂,其次这样还是又违反了CAP中的A的设计,导致服务之间是不连通的。持久化的机制来带的问题,ZooKeeper 的 ZAB 协议对每一个写请求,会在每个 ZooKeeper 节点上保持写一个事务日志,同时再加上定期的将内存数据镜像(Snapshot)到磁盘来保证数据的一致性和持久性,而对于一个简单的服务发现的场景来说,这其实没有太大的必要,这个实现方案太重了。而且本身存储的数据应该是高度定制化的。消息发送应该弱依赖注册中心,而RocketMQ的设计理念也正是基于此,生产者在第一次发送消息的时候从NameServer获取到Broker地址后缓存到本地,如果NameServer整个集群不可用,短时间内对于生产者和消费者并不会产生太大影响。那Broker是怎么保存数据的呢?
  RocketMQ主要的存储文件包括commitlog文件、consumequeue文件、indexfile文件。
  Broker在收到消息之后,会把消息保存到commitlog的文件当中,而同时在分布式的存储当中,每个broker都会保存一部分topic的数据,同时,每个topic对应的messagequeue下都会生成consumequeue文件用于保存commitlog的物理位置偏移量offset,indexfile中会保存key和offset的对应关系。
  CommitLog文件保存于${Rocket_Home}/store/commitlog目录中,从图中我们可以明显看出来文件名的偏移量,每个文件默认1G,写满后自动生成一个新的文件。
  由于同一个topic的消息并不是连续的存储在commitlog中,消费者如果直接从commitlog获取消息效率非常低,所以通过consumequeue保存commitlog中消息的偏移量的物理地址,这样消费者在消费的时候先从consumequeue中根据偏移量定位到具体的commitlog物理文件,然后根据一定的规则(offset和文件大小取模)在commitlog中快速定位。
  Master和Slave之间是怎么同步数据的呢?
  而消息在master和slave之间的同步是根据raft协议来进行的:在broker收到消息后,会被标记为uncommitted状态然后会把消息发送给所有的slaveslave在收到消息之后返回ack响应给mastermaster在收到超过半数的ack之后,把消息标记为committed发送committed消息给所有slave,slave也修改状态为committed你知道RocketMQ为什么速度快吗?
  是因为使用了顺序存储、Page Cache和异步刷盘。我们在写入commitlog的时候是顺序写入的,这样比随机写入的性能就会提高很多写入commitlog的时候并不是直接写入磁盘,而是先写入操作系统的PageCache最后由操作系统异步将缓存中的数据刷到磁盘什么是事务、半事务消息?怎么实现的?
  事务消息就是MQ提供的类似XA的分布式事务能力,通过事务消息可以达到分布式事务的最终一致性。
  半事务消息就是MQ收到了生产者的消息,但是没有收到二次确认,不能投递的消息。
  实现原理如下:生产者先发送一条半事务消息到MQMQ收到消息后返回ack确认生产者开始执行本地事务如果事务执行成功发送commit到MQ,失败发送rollback如果MQ长时间未收到生产者的二次确认commit或者rollback,MQ对生产者发起消息回查生产者查询事务执行最终状态根据查询事务状态再次提交二次确认
  最终,如果MQ收到二次确认commit,就可以把消息投递给消费者,反之如果是rollback,消息会保存下来并且在3天后被删除。
  学习更多精彩技术知识,私信作者666获取更多
  - END -

美国女子收入丰厚,却20年不买内衣裤,连厕纸都晒干重复用照片里这位来自美国纽约的KateHashimoto,是当地一家大公司里的注册会计师,在这个全球十大生活成本最高城市生活了五年的她,每月竟只花200美元(折合约1295元人民币)!为室友拉肚子,令我和我妻子结婚了网友们的蝴蝶效应故事太神奇无数只蝴蝶扑扇一下儿翅膀,都可能会对一个地区的天气造成极大的影响,在长时间和大范围内的一个极其不起眼的小变化,就有可能导致无法预测的大后果,这种神奇的连锁反应,就是著名的蝴蝶效应!把阿富汗人从飞机掉落的一幕做成T恤?美国商家吃人血馒头被骂惨话说,在塔利班攻占阿富汗首都喀布尔后,逃亡的阿富汗人从四面八方涌进了阿富汗首都机场,迫切地想要抓住一切可能离开阿富汗。有人成功地挤上美国军机,有人爬上了飞机的起落架,甚至还有人在跑在意大利,不要接别人给的手绳,旅友们被宰出各种血的教训开开心心去旅游,结果碰上踩坑被宰,估计是最扫兴的事儿了,最近Reddit上就有一群国外网友征集了一波旅游避雷法则,总结世界各地旅游景点那些要避开的事情,感觉就很实用啊!去法国埃菲尔Supreme时尚的尽头在东北李雪琴说,宇宙的尽头在铁岭。Supreme则说,时尚的尽头在东北。最近,Supreme推出的东北大花袄风外套在圈里圈外出尽了风头。Supreme出东北大花单品也许土到极致就是潮是真这个拥有世界最大嘴巴的网红,居然能一口塞下了四个汉堡话说,最近外媒报道了一个大嘴巴网红,这个大嘴巴完全就是字面意思她全凭一把大嘴吸粉无数,甚至还因此拿下了吉尼斯纪录!今年31岁的SamanthaRamsdell,是来自美国康涅狄格州黑人组织强迫有钱白人孩子把名校位子留给黑人学生?真相并不简单话说,随着近年BLM黑人运动的发生,美国顶尖大学哈佛等名校陆续制定包容化政策。比如计划在未来几年内将一些课程中黑人学生的班级占有率翻倍提高,以满足黑人运动的诉求,给予黑人同学更多进女孩DNA寻亲,发现母亲14岁生下自己,怒揭发强奸犯父亲话说,今天,英国伯明翰审理了一个特殊的案件。74岁的儿童强奸犯CarvelBennett在46年后得到了应有的惩罚,而使得这一切能够发生的,是这名罪犯和受害者血缘上的孩子。来自伯明那个奥运会上跳舞搞怪的大哥,背后原来充满着心酸无奈话说,大部分奥运选手比赛落败时都表现得非常落寞,要是说有人在失败后不仅不难过还手舞足蹈的话,估计没多少人会信,然而来自太平洋岛国Kiribati的37岁举重选手DavidKatoa网络上最火的穿搭,真的不适合你姐妹们有没有这种感觉,平时看各种穿搭教程OOTD,经常会产生一种错觉只要买同款照着搭就能拥有同款效果?上松下紧上紧下松大胆撞色各种公式朗朗上口一说就懂,但穿上身咋就不是那么回事儿呢这么好看!难怪时髦er都在为它买单大家好!一到夏天,走在街上都是碎花裙的海洋,可是碎花看多了总觉得有些甜腻是时候安利一下四季咸宜可盐可甜的宝藏棋盘格了!说起棋盘格,大部分人总会联想起VANS的经典款鞋子,以密集且规
演员蒋雯丽屡遭背叛却不离婚,她的报复让顾长卫有苦难言2009年,导演顾长卫携妻子蒋雯丽为立春做宣传时。有记者看热闹不嫌事大地问为什么女主张静初的戏份几乎都没有了?顾长卫支支吾吾半天回答不出来。最后无奈地问身边的蒋雯丽是啊,为什么没有伊能静晒无美颜怼脸拍,没有法令纹被质疑打针,本尊老天爷打的3月13日晚,伊能静在个人社交平台分享了一组怼脸自拍,并发文称自己最近因为太忙了,虽然吃的很多,但体重还是掉了。或许是担心被说凡尔赛,伊能静还特意强调自己一直都在努力养成易瘦体质,张译守候植物人初恋10年,妻子二婚带娃还是丁克,如今很幸福张译的初恋因为一次意外车祸,成为了植物人,于是他马不停蹄地跑到医院去看她,在张译叫初恋的名字的时候,她的眼角竟然滑落了一滴泪。最终,植物人女友还是去世了,于是张译娶了小有名气的央视王源愚人节被粉丝抛弃,粉丝反向追星助理,王源甚至无出镜机会今天是4月1日的愚人节,不知道小汤圆有没有在这个日子里被骗呢?但是,很明显的是王源并没有这个打算。在今天这个内娱气氛最好的时候,王源也没有来个小玩笑,就连工作室也没有。工作室今天就为什么离了婚的杨幂还是万人迷为什么离了婚的杨幂还是万人迷,他验证了那句话,三流女星嫁入豪门,一流女星成为豪门。那么他是怎么从北京的胡同大妞变成娱乐圈的四小花旦,在成为手握资本的大老板的呢?杨幂出生于北京的一个身材走形面部浮肿,当年的万人迷陈好,如今已判若两人几年之前有不少的观众抱怨如今的国产电视剧越来越难看了,因此,有很大一部分的年轻观众开始看美剧日剧等等。国产剧中无尽的婆媳争斗或是手撕鬼子这样的雷剧也确实赶走了很多观众,好在这些年来万人迷陈好颜值被吐槽?43岁也不能有岁月痕迹,着实为难天然美人对于80后和90后的小伙伴们而言,应该没有人不认识万人迷陈好吧。当年以那万种风情与水灵灵的美貌,可谓是红遍大江南北了。温柔貌美极具辨识度,简直就是少男少女们心中无法代替的女神。但没有种整容叫19年后的陈好,曾经的万人迷,如今却判若两人19年前陈好出演的万人迷,婀娜多姿,是人群中的焦点,走在街上就会集万千瞩目与一身,而殷桃出演的完全可以用失去灵魂来形容,身穿一身职业装没有万人迷的特点。大图模式万人迷不管是任何服饰谢霆锋王菲逛街照曝光!2014年两人复合后,合体照实属罕见4月2日,有网友在社交平台发布了王菲与谢霆锋在购物店买衣服的场景,具这位网友透露这组照片是在2015年在日旅游的时候本拍到的。虽然只是背影,但应该是可信的。因为2014年两人复合的演戏全靠嘴的8位明星,别人是眼技带飞颜值,他们却像毁了容演技眼技,都说眼睛是心灵的窗户,纵观各大经典影视剧也不难发现,那些被誉为名场面的戏份,无一不全面展示了演员作为剧中人的超高质素。更有甚者像苏有朋和焦恩俊,一个近视1000多度,一个与君初相识结局,云禾身死,长意后悔恰似故人归高虐来袭4月1晚六点,由迪丽热巴任嘉伦主演的驭鲛记之与君初相识终于大结局了!云禾被困在仙师府六年,终于被长意救了出来。长意霸气,一把拦着云禾,抱得紧紧的。然而,云禾经过断崖身死,变成妖狐,