「面试」美团肝了我问题腾讯云开发者社区

叮。。。。。美团来电。这次不是外卖而是电话面试。所报岗位为后端/服务端开发,但是从我的复盘来看,这和 Java 后端开发的内容差不多,除了部分的语言特性外,还是四大件基础知识为重,下面我们来看看都问了啥,小心下次面你的时候就有这些问题哦

如果你问我,看了这些题就完事了?非也,这只是开始,你需要学习的还有很多,知道路子是怎么走才是重要的勒。

开始之前,我们先看提纲,大家默默的想一想,如果是你,你将怎么去回答这个问题,然后再看我的回答也许更佳哈。

提纲

老规矩,我叫啥,啥专业,技术栈是啥,能做啥

其实如果没有去实习,可能很少接触分布式的内容。对于面试官而言,也没多期望你们对分布式的理解到多深的地步,只是希望你们能对其有个初步的了解即可。

不管是高登摩尔提出的摩尔定律还是Gordon Moore坚持的2版本是啥,总之如果你的系统需承载的计算量的增长速度大于摩尔定律的预测,那么在未来的某一个时间点,集中式系统将无法承载你所需的计算 量。

在整个计算机系统发展的过程中,最实际的还是经济的元素。人们发现使用更加廉价的机器,组合在一起的分布式系统,除了可以获得超过CPU发展速度的性能以外,还可以有更好的性价比,所以得出如下结论:

无论是要以低价格获得普通的性能,还是要以较高的价格获 得极高的性能,分布式系统都能够满足。并且受规模效应的影响,系统越大,性价比带来 的收益越高。

随着计算机的飞速发展,科学家们发现分布式系统相比于集中式系统的另一个很明显的优势就是:具有更高的可用性。假设使用10个能够承载10000流量相同的节点,其中的两个节点挂了,只要实际的流量不超过8000,那么系统仍然正常运转。

说这么多,分布式系统还是建立在「分治」和「冗余」的基础上,这也就是分布式系统的本质

那么分治是什么?

这和我们大脑解决问题类似,大问题分解为小问题,然后治理最后归并。

分治

为什么要这样做?

如果拆分的父子问题有依赖关系怎么办?

大问题拆分的过程中,非常重要的即不同分支的子问题不能相互依赖,需要各自独立,因为如果存在依赖关系,父子问题就失去了「归并」的意义,那么在开发中,这就是「聚合度」和「内聚度」的问题。

什么是聚合度和内聚度?

所谓聚合度即软件系统中各个模块的相互依赖程度。比如在调用A方法的时候都需要同步调用方法B,显然这样的耦合度就高

所谓内聚度即模块之间具有共同点的相似程度,所以在拆分的时候要尤其注意这两点。

什么是冗余?

这里的冗余不是代码的冗余,而是容许系统在一定范围内出现故障,但对系统的影响很小

冗余

如上图将冗余的节点部署在单独的服务器,完全是为了备用而做的冗余,如果不出现故障,那么资源是不是就浪费了,所以大多数情况会使用诸如双主多活、读写分离之类的概念提高资源利用率

其实在生活中冗余也很常见,比如大部分的汽车系统中的底层控制系统也是有冗余机制,飞机发动机为什么是偶数,也是同样的道理。还有更多的关于后端的基础总结要点则参考另一篇文章42图揭秘,「后端技术学些啥」

写个代码热热身----栈实现队列

介绍下第一个项目

注意:校招的的面试在我看来写两个项目差不多了,印象更深刻且自己的理解程度更好的放在上面。面试之前一定要搞懂这三个问题,且在练习的时候想想怎么能引面试官上钩

说说快排思想?

这里特别注意所谓的每次分区操作有个前提条件,即选择的pivot很合适,能挣好的将大区间对等的一分为二,如果原来的数据是一件排好序的,我们选择最后一个元素为pivot,这样每次分区得到的两个区间是不均等,我们需要进行大约n次分区操作,每次分区平均扫描n/2个元素,此时的复杂度将退化为0(n ^ 2)

注:一定要能手撕快排啊,这真是无数次会被考!!!

半连接了解吧,如果SYN半连接队列满了怎么处理,只能丢弃连接?

syncookies是怎么操作的?

服务端返回 ACK 的时候会计算一个值放在发出的SYN+ACK报文中,当客户端返回ACK的时候取出该值进行验证,如果合法即连接成功

半连接队列

Linux如何开启syncookies呢?

通过将参数tcp_cookies设置1即可。如果参数值为2,表示无条件开启这个功能。如果为1表示仅当SYN半连接队列放不下的时候,再开启。

开启syncookies

那可不可以绕过三次握手?

还有这种操作?

三次握手中,一个较大的问题是HTTP请求必须在一次的RTT后才能发送。从而谷歌提出了TFO。想要绕过三次握手过程,如果是客户端发起连接,想要在SYN的请求报文中放入数据,需要得到服务端的认可,所以事先需要有个约定。

绕过三次握手

刚才你说的密钥是不会变的?

当然变化,不然就很容易产生SYN泛洪攻击了。

Linux中如何打开TFO?

这里要注意了,需要客户端和服务端都支持,TFO才会生效,当tcp_fastopen设置为3的时候才生效

举几个使用缓存的例子

缓存怎么个分类?

缓存分类分为三种,分别为静态缓存、分布式缓存与本地缓存。

静态缓存

通常使用静态HTML实现静态缓存。通过在Nginx上部署静态缓存减少对于后台应用服务器的压力。当然你也可以存放数据库,然后前端穿透查询,但是对于后端的服务器压力是非常大的。比如内容系统,通常在录入文章的时候先渲染成静态页面,然后放在前端Ngix服务器上,这样用户会直接访问前端静态页面,但是如果是动态请求,这样就需要分布式缓存了

分布式缓存

面试中高频的Redis和Memchache,就是通过集群的方式突破单机瓶颈

热点本地缓存

热点嘛,微博每天都有热点,尤其是什么XX明星出轨,这样的查询通常会命中某一个缓存节点,短时间内极高的缓存热点查询。这个时候就会在代码中使用一些本地本地缓存方案。如hashmap

缓存的不足

从上面基本上知道,缓存的主要作用是提升访问的速度,提升并发的能力。

因为既然是缓存受限于存储介质,不可能缓存所有数据,只有当数据有一定的热点属性才能有更高的缓存命中率

运维小哥需要了解一些缓存组件的使用

一面小结

一面面试涉及到了项目,计算机网络,数据结构和后端的基本知识,也基本覆盖了校招的各科且有一定的是实践性考察,不同公司面试当然不一样,看多了你会发现重点就是这些了,继续复盘二面

慢慢的到了10月,面试的越多不知道的越多,感觉需要学习的越多,当然越战越勇,面完一面是一面,积累一面是一面。团团既然给脸,那就面呗

写个代码-----数组中数字出现的次数

我擦,上来就是写代码,不过大家习惯就好,每个面试官套路不同,资本社会接受即可,写呗,准备这么久的你还怕啥。管他三七二十一,能上位运算就上位运算,盘它完事,小伙伴说能不能写个python版本,那就py呗。如果这个题目还要犹豫,赶紧再去练练《剑指offer》和leetcode100题呀

说说TCP的收发包可通过哪些配置?

这个题就有点大了,我可以扯很久,而且只要问到TCP发送或者接受的类似问题,真是可以大干好几百个回合。在这里就稍微详细的说说,在以后的面试过程中,遇到此题讲不在多说哈,还答不上来就打自己几耳巴可好,别别,还是不能这么对自己,好了,不多BB了,上干货

收包是数据到达网卡后交给应用程序处理的过程,发包则调用相应的发包函数将数据包从网卡发出的场景。

我们再看看类似的几个问题

和前面一样,都是需要了解相应的系统参数才能较好的回答这些问题且能体现你对网络的了解深度

TCP数据包在发送的过程中会受到哪些影响?

TCP数据包发送过程

这个图画了一个小时,一定要好好看看,顺便记得给我一个赞,么么哒,下面我们详细看看这个图

当我们通过write等发包函数进行发包的时候,这些系统调用都是将数据包先从用户缓冲区拷贝到TCP发送缓冲区中,可是这个TCP缓冲区是有大小限制的,正是这个限制就会产生各种问题。

TCP发送缓冲区设置

这三个参数分别的叫做是min,default,max。TCP发送缓冲区会在min和max中浮动,初始的大小为default。

为什么需要自动调整,是不是越大越好?

首先这个动态调整是由内核来完成,不需要应用程序的干预,而且每次发包的大小不一样,数据太小,缓冲区却很大自然就浪费了内存,所以通过动态调整的方式满足发包的需要。

TCP缓冲区设置太小或者太大有什么标志?

TCP的发送缓冲区设置太小,最明显的特征即导致业务延迟。如何发现呢,可以通systemtap等工具在内核打点完成观察,如果发现了有sk_stream_wait_memory就认为这发送缓冲区太小了,需要调大tcp_wemem:max

可不可以开发的时候指定需要发送的大小?

上面所说的tcp_wmem和wmem_max都是针对单个tcp连接,其单位是字节。系统中通常有非常多的tcp连接,连接太多可能导致内存耗尽

我们能不能设置tcp消耗内存的大小?所谓上限

tcp_mem

当所消耗的内存达到max就不会再发包

可以通过什么方式观测到这种情况?

Linux内核给我们早就埋了点,sock_exceed_buf_limit。观察的时候只需要打开tracepoint即可

sock_exceed_buf_limit

然后在日志中查看是否发生了事件

trace_pipe

伴随tcp层数据包的处理完毕来到ip层,在IP层需要考虑端口范围的问题,太小可能导致无法创建连接。

为了实现tcp/ip数据流进行流控,Linux内核在ip层实现了qdisc(排队规则)。我们平时见的比较多的TC即是基于qdisc的流控工具,实际上我们通过ipconfig看到的txqueuelen即qdisc的队列长度。它太小就会导致数据包被丢失

我们如何观察到这个现象?

观察现象

如果发现dropped不为0,则很可能是txqueuelen太小导致,此时就需要调大这个值

调大txqueuelen

经过ip层后就进入网卡了,此时需要发送的数据包走完TCP/IP协议栈

那么对于接受放而言,是怎么接受的?

同样,先看看图

TCP数据包接受过程

从上图可以发现其接受流程和发送流程基本相反。当数据包到达接受方的网卡,就会触发中断,高速CPU读取数据包,但是在高速网络中,大量的数据包,如果每来一个数据包就触发一次中断势必让CPU的处理效率大大折扣,所以提出了NAPI技术,让CPU一次性轮询多个数据包,通过批量的方式来提升效率,降低中断带来的性能开销

在poll的时候,一次轮询多少个?

这个poll通过sysctl选项控制

netdev_budget

此值默认大小为300,通常会增加此值到600使得一次性能处理更多的的数据包

可以无限增大此值?

当poll了数据包就会到IP层处理,随后到达tcp层,从而遇到我们之前所说的TCP接受缓冲区

默认通过tcp_rmem控制缓冲区的大小,通过适当的调整该值来获取更好的网络性能

tcp_rmem

TCP的默认缓冲区大小会在min和max之间动态的调整,不过和发送缓冲区不同的是,这个动态调整时通过选项tcp_moderade_rcvbuf。通常我们都会打开它

tcp_moderade_rcvbuf

为什么接受缓冲区时通过选项来自动调节,而发送缓冲区不是

因为tcp接受缓冲区会直接影响tcp拥塞控制,从而影响对端的发包,所以通过选项控制的方式更加灵活的控制对端的发包行为

还有其他方式控制tcp的接受缓冲区?

当然有,可以通过setsockopt()的配置选项SO_RECVBUF控制,如果设置了此值,那么tcp缓冲区的自动调整将关闭,总之只有当tcp_moderate_rcvbuf 为 1,并且应用程序没有通过 SO_RCVBUF 来配置缓冲区大小的情况下,TCP 接收缓冲区才会动态调节

总结:

TCP/IP协议栈复杂无比,此文介绍了很多配置选析,后续给大家总结一个常用的参数表

好了,这个题目也许啰嗦,但是你会发现确实有点东西哈,盘它呀,接着面试

小伙子对这个问题的理解比较深刻,差不多都答在了点上,你说说一致性哈希是什么?

说一致性哈希是什么,那我们肯定需要告诉面试官为啥要用一致性哈希,直接使用哈希不香?有什么问题嘛?

我先用个简单的例子让大伙看一波为啥使用一致性哈希

现在我们有一个分布式缓存,需要存放6w张美女照片,别问我干啥,就是存着

三节点存储image

方案1:直接采用哈希算法,对每个图片进行分片

哈希

余数正好对应每个机器节点

这样子会出现什么问题?

通过哈希算法,每个key可以寻址对应服务器,假设发过来的请求为key01,计算公式为hash(key01)%3

经过计算后寻址编号为1的服务器节点,如下图所示

节点1服务器

此时加入新的服务器节点,就会出现路由失败的情况。此时从三个节点变化为4个节点,之前的hash(kley01)%3=1就变化为 hash(key-01) % 4 = X,因为取模运算发生了变化,所以这个 X 大概率不是 1,这时你再查询,就会找不到数据了,因为 key-01 对应的数据,存储在节点 A 上,而不是节点 B。同样的道理,如果我们需要下线 1 个服务器节点(也就是缩容),也会存在类似的可能查询不到数据的问题

对于这个问题怎么解决呢

我们就需要迁移数据,基于新的计算公式 hash(key-01) % 4 ,来重新对数据和节点做映射。需要注意的是,数据的迁移成本是非常高的。

如何解决这个问题---一致性哈希

一致性哈希也是使用了取模运算,但是和传统的取摸运算不同,一致性哈希算法是对2^32 - 1进行取模运算

即使这些数据均匀,但是数据的活跃度不同,存放热点数据多的节点访问量非常大,就很容易的达到CPU瓶颈。一致性哈希算法即将整个哈希值空间组织成一个虚拟的圆环---哈希环

通过哈希算法,将节点映射到哈希环上,通常是节点主机名,ip地址等如下图

哈希环

在寻址的过程就只需要两步

如下图所示

寻址案例

从上图可以发现,key01对应节点A,key03对应节点C,如果此时C宕机了,只需要将key03定位到节点A即可,key01和key02并不需要改变。所以一致性哈希算法在增加和减少节点的时候,只需要重新定位一小部分数据而不需要重新定位所有数据,这样就实现了"增加/减少节点需要大规模迁移"这个问题

节点B失效

如果节点比较少,是不是很容易就将请求数据打到一个节点呢?

这个问题即"数据倾斜问题",由于节点的不均匀是的大量你的请求访问到节点A上,造成负载不均衡。

数据倾斜

鉴于这个问题引入了虚拟节点,简单的来说通过增加节点的个数来缓解节点的不均匀现象

所谓虚拟节点即对每个服务器节点计算多个哈希值,假设一个真实的节点有2个虚拟节点,此时我的三个节点就共有6个虚拟节点,如下图所示

引入虚拟节点

此时如果在环上顺时针寻找虚拟节点,假设key01选择虚拟节点nodeB02,那么此时将请求映射到真是节点B即可

所以通过虚拟节点扩充节点数量的方式解决节点较少情况下数据倾斜的问题,代价非常小,只需要增加一个字典map维护真实节点和虚拟节点的映射关系即可

事务时一个可执行的逻辑单元,该逻辑单元的操作要么都执行,要么都不执行,事务具有ACID四个性质

索引主要用于加速查询速度,但并发越多越好,因为索引需要占用物理空间的,且索引的维护需要时间的,所以如果建索引,一般来说,应该查询的次数大于插入的次数,同时我们一般只对例如where或者having子句中涉及的字段进行设置索引,因为其它的地方就算建立了索引,一般也用不到,只是浪费。

THE END
0.数据倾斜常见原因和解决办法数据倾斜的原因及解决办法数据倾斜常见原因和解决办法 数据倾斜在MapReduce编程模型中十分常见,多个节点并行计算,如果分配的不均,就会导致长尾问题(大部分节点都完成了任务,一直等待剩下的节点完成任务),本文梳理了常见的发生倾斜的原因以及相应的解决办法。 1.map端发生数据倾斜 产生原因:jvzquC41dnuh0lxfp0tfv8okcpmiwjnlkg5bt}neng5eg}fknu524;6668<3
1.2022年最强大数据面试宝典(全文50000字,强烈建议收藏)4. 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些 热点现象: 某个小的时段内,对HBase的读写请求集中到极少数的Region上,导致这些region所在的RegionServer处理请求量骤增,负载量明显偏大,而其他的RgionServer明显空闲。 热点现象出现的原因: HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以jvzquC41dnuh0ryrwd4og}4922776A71xkkxuyfeg/8:3::371
2.2022年最强大数据面试宝典(全文50000字,建议收藏)(四)4. 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些 热点现象: 某个小的时段内,对HBase的读写请求集中到极少数的Region上,导致这些region所在的RegionServer处理请求量骤增,负载量明显偏大,而其他的RgionServer明显空闲。 热点现象出现的原因: HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1B5386:
3.HBase知识手册爱是与世界屏的技术博客Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决海量数据处理和计算问题,一般是配合使用。 Hbase:Hadoop database 的简称,也就是基于Hadoop数据库,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。 jvzquC41dnuh0>6evq4dqv4nqxkcg}ygtyusnm47;8?45B
4.大数据工程师面试题这一篇就够用了fsimage:记录的是数据块的位置信息、数据块的冗余信息(二进制文件) 由于edits 文件记录了最新状态信息,并且随着操作越多,edits 文件就会越大,把 edits 文件中最新的信息写到 fsimage 文件中就解决了 edits 文件数量多不方便管理的情况。 没有体现 HDFS 的最新状态。 jvzquC41yy}/lrfpuj{/exr1r1:3e<;cg37e7B
5.如何避免数据倾斜数据处理中数据倾斜和数据热点1、数据倾斜的表现 数据倾斜是由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点的现象。 主要表现:任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大,通常达到好jvzquC41dnuh0lxfp0tfv8|cfljlftillf5bt}neng5eg}fknu526<:9:374
6.分库分表方案中出现数据倾斜问题怎么解决分库分表数据倾斜二、 解决方案 1. 调整分片策略(治本之法) 2. 处理业务热点(治标之法) 3. 其他策略 三、 预防措施 总结 这是一个在分库分表实践中非常经典且棘手的问题。数据倾斜意味着数据并没有均匀地分布在不同数据库或表中,导致某些节点负载过高(存储、CPU、IO),而其他节点却非常空闲,从而成为系统瓶颈,严重影响整体性jvzquC41dnuh0lxfp0tfv8skgvgpl~s1ctzjeuj1fgzbkux137734=684
7.Hadoop·大数据技术栈·看云6.Hadoop解决数据倾斜方法 1、提前在 map 进行 combine,减少传输的数据量 2、导致数据倾斜的 key 加盐、提升 Reducer 并行度 … 7.Hadoop读文件和写文件流程 Hadoop读文件和写文件流程 HDFS-文件读写流程 8.Yarn的Job提交流程 步骤很多,理理清楚然后再有条理的进行回答。 jvzquC41yy}/mjsenq{e0ls1jcvq{ltfg/zpinyjgt5ckpicvc<03?<7746
8.37数据分布优化:如何应对数据倾斜?Redis核心技术与实战如使用配置更高的机器 只适用于只读的热点数据 解决方法 解决方法 解决方法 热点数据多副本 实例上存在热点数据 使用Hash Tag导致倾斜 Slot分配不均衡导致倾斜 bigkey导致倾斜 在构建切片集群时,尽量使用大小配置相同的实例,避免因实例资源不均衡而在不同实例上分配不同数量的Slot 应对方法 成因 成因 小建议 Redis jvzquC41vksf0pjgmdgoi7tti1ipn~rp1cxuklqg15695B8
9.举例说明Spark数据倾斜有哪些场景,对应的解决方案是什么?增加并行度,通过spark.sql.shuffle.partitions设置更高的 Shuffle 分区数,分散热点数据 [^1]。 场景三:Reduce Side Join 导致的倾斜 在没有合适优化手段的情况下,Join 操作只能在 Reduce 阶段完成,容易引发数据倾斜。 解决方法: 尝试将 Reduce Side Join 转换为 Map Side Join,前提是至少有一方数据量较小且可广jvzquC41ygtlw7hufp4og}4cpu}ft86jx|nv6?hy
10.阿里P8整理总结,入职大厂必备Java核心知识(附加面试题)ArrayList和LinkedList区别?HashMap内部数据结构?ConcurrentHashMap分段锁?jdk1.8中,对hashMap和concurrentHashMap做了哪些优化如何解决hash冲突的,以及如果冲突了,怎么在hash表中找到目标值synchronized 和 ReentranLock的区别?ThreadLocal?应用场景?Java GC机制?GC Roots有哪些?MySQL行锁是否会有死锁的情况?jvzquC41oconcr3ep1gsvrhng1jfvjnnAhoe?:<655955><(ghoe?|Tw|Q|yq@Gvec>Co95\mjG
11.新老手都值得看的Flink关键技术解析与优化实战上图为计算最小值的热点问题,红色数据为热点数据。如果直接将它们打到同一个分区,会出现性能问题。为了解决倾斜问题,我们通过 hash 策略将数据分成小的 partition 来计算,如上图的预计算,最后再将中间结果汇总计算。 当一切就绪后,我们来做增量的 UV 计算,比如计算 1 天 uv,每分钟输出 1 次结果。计算方式既可jvzquC41yy}/kwkqs0io1jwvkerf1\OTIQjDj{:PuHGGXPojZ
12.Redis数据库的数据倾斜详解Redis在服务端读数据访问Redis时,往往会对请求key进行分片计算,此时中会将请求打到某一台 Server 上,如果热点过于集中,热点 Key 的缓存过多,访问量超过 Server 极限时,就会出现缓存分片服务被打垮现象的产生。当缓存服务崩溃后,此时再有请求产生,就会打到DB 上,这也就是我们常说的缓存穿透,如果没有合理的解决,数据库jvzquC41yy}/lk:30pku1mfvcdgtg87;45;53}v0jvs
13.解决Redis数据倾斜热点等问题Redis单台机器的硬件配置有上限制约,一般我们会采用分布式架构将多台机器组成一个集群,这篇文章主要介绍了解决 Redis 数据倾斜、热点等问题,需要的朋友可以参考下+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 Redis 作为一门主流技术,应用场景非常多,很多jvzquC41yy}/lk:30pku1jwvkerf1;;;:9=/j}r
14.HBasehbase每秒最大写入多少5 热点现象( 数据倾斜) 怎么产生的, 以及解决方法有哪些 5.1热点现象   某个小的时段内, 对 HBase 的读写请求集中到极少数的 Region 上, 导致这些region 所在的 RegionServer 处理请求量骤增, 负载量明显偏大, 而其他的RgionServer 明显空闲。 jvzquC41dnuh0lxfp0tfv8vsa6676974:1gsvrhng1jfvjnnu173:;;677<
15.Hbase基本概念比如创建一张表,名为user,有两个列族,分别是userInfo和addressInfo,建表语句create 'user', 'userInfo', 'addressInfo' 3.Timestamp(时间戳):纪录每次操作数据的时间,通常作为数据的版本号 六. 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些 热点现象: jvzquC41dnuh0lxfp0tfv8qkdcuxgw;2;1gsvrhng1jfvjnnu1738?<6987