Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

技术面试相关讨论 | Discussions about Technical-Interview #9

Open
blackdog1987 opened this issue Dec 27, 2018 · 49 comments
Open

技术面试相关讨论 | Discussions about Technical-Interview #9

blackdog1987 opened this issue Dec 27, 2018 · 49 comments

Comments

@blackdog1987
Copy link

@blackdog1987 blackdog1987 commented Dec 27, 2018

我个人平时会负责一些技术面试。面试过程中,经常碰到那些针对面试精心准备的人,比如,消息队列方面,候选人差不多都能答上这些标准答案。但是,这些答案不是我想听到的,我甚至曾经告诉面试者:

我不想听你看来的这些东西,我想听你思考的东西,你们具体在什么场景下用的MQ,如果不用MQ,你的项目又怎么设计?你思考一下你的XX项目,中间还有没有哪一块功能可以用上MQ?为什么?如果用了,你猜一下生产上可能出现什么故障?怎么解决?既然你知道他的作用是“解耦、消峰、异步”,那么在你简历中提到的XXX技术中(比如nginx,或者任何知识点),分别可以通过什么手段去做这三个目的?你在Java/Android/IOS中还见过类似的组件或者机制吗?他们怎么做的?为什么?你怎么看如何解决MQ中消息重复的问题?有必要对所有的消费者都做幂等吗?为什么?幂等在你们xx项目中,具体怎么实现。还有哪些情况你碰到过“消息重复”类似的问题?BASE理论里,如果涉及到MQ的场景,怎么设计?除了你说的这种设计,还有哪种设计?在你的xxx项目中应该怎么设计?为什么?

前面说了一大段,其实我想说的是,最好加上一个章节,告诉这些来取面经的人:哪怕你看完了这上面的内容,你仍然需要在工作中时时刻刻去思考和印证。

这些面经可以是你学习的目录,但是不是你学习的终点,对于优秀的公司和面试官来说,仅限于这些内容,收效甚微。

@yanglbme
Copy link
Member

@yanglbme yanglbme commented Dec 27, 2018

@blackdog1987 谢谢分享,这是一个很好的建议。

这一系列知识,我的定位一直都是“知识扫盲”,或许对大家面试、实际工作有所帮助,但光了解这些是远远不够的,平时工作中一定要注重思考。

我会直接将这个 issue pin 在顶部,让读者看到来自于面试官的建议。

@yanglbme yanglbme pinned this issue Dec 27, 2018
@yanglbme yanglbme added the notice label Dec 27, 2018
@scholers
Copy link

@scholers scholers commented Jan 2, 2019

最好是将项目经历,在项目中遇到的问题,遇到的坑,怎么解决的;让个人成长最快的一些案例;要有实际的落地的东西,能讲出来这些很细节的东西。

@yanglbme
Copy link
Member

@yanglbme yanglbme commented Jan 2, 2019

@scholers 感谢分享。

@yanglbme yanglbme changed the title 建议:新增一个章节“为什么写这个系列” 技术面试相关讨论 Jan 4, 2019
@yanglbme yanglbme changed the title 技术面试相关讨论 技术面试相关讨论 | Discussions about Coding-Interview Feb 21, 2019
yanglbme added a commit that referenced this issue Mar 13, 2019
* 更新 es 架构文章描述。
* 更新 README,欢迎所有面试官和面试者们来 #9 分享自己的想法。在这里对 @blackdog1987 表示感谢,他给我们分享了他自己作为技术面试官招人的一些侧重点和对面试者的建议。
@caojiantao
Copy link

@caojiantao caojiantao commented Apr 1, 2019

那我转行了 (;′⌒`)

@yanglbme
Copy link
Member

@yanglbme yanglbme commented Apr 1, 2019

@caojiantao 加油,朋友

@miketam
Copy link

@miketam miketam commented Apr 2, 2019

加油. 重要是要有自己的思考

@ysh3940
Copy link

@ysh3940 ysh3940 commented Apr 2, 2019

我也很想在工作有跟多的自己的思考,但是实际工作中很难是这样的,会很多很多各种问题,而且现在的社会每个人压力都这么大,烦躁的事情各种各样,,,,,,,,,,,,,

@Alwaysrain1203
Copy link

@Alwaysrain1203 Alwaysrain1203 commented Apr 3, 2019

楼主的问题给了我当头一棒,提出的问题大部分都回答不了 继续努力!

@shanliangxiaomifeng
Copy link

@shanliangxiaomifeng shanliangxiaomifeng commented Apr 3, 2019

没有经历过从小项目到大项目的整个过程,可能真的很难回答上面的问题

@yanglbme
Copy link
Member

@yanglbme yanglbme commented Apr 3, 2019

@shanliangxiaomifeng 确实如此,很多时候需要经过大项目的实践,对问题和知识点才会有更深刻的理解。

@hisenyuan
Copy link

@hisenyuan hisenyuan commented Apr 10, 2019

看过和用过是两回事,仅仅是看过深入问下去必然暴露。

@mrwlei
Copy link

@mrwlei mrwlei commented Apr 20, 2019

一定要有自己的思考,解决问题的思路。

@xiaokek
Copy link

@xiaokek xiaokek commented Apr 29, 2019

哪有那么多机会给人去历练,
多少人都是运气好站在了时代的浪潮之巅,你并不比别人聪明多少,你只是机会好
其他剩下90%的人还不是只能靠10%的那些人总结的经验来背诵面试题

@SunStriderxxx
Copy link

@SunStriderxxx SunStriderxxx commented Apr 29, 2019

能答上来起码看过了......起码看过了有了基础你才知道怎么去思考,要是没看过连思考的方向都没有..所以我觉得掌握这些理论知识还是很有必要啊,理论做基础,实践中求证,进步才快.事实上如果不看这些东西工作中大部分知识你都了解不到啊..起码对我一个初级研发人员来说是这样

@ryouaki
Copy link

@ryouaki ryouaki commented May 17, 2019

对于分库分表,我有一个疑问,就是分表的逻辑还是最终需要根据业务去考虑吧?

文档中按照订单id去取模分表,那么如果一个人的历史订单列表怎么办?从多个库多个表取?然后合并?
如何做分页?

@yanglbme
Copy link
Member

@yanglbme yanglbme commented May 17, 2019

@ryouaki 如果仅按照订单id去分表,要查询一个用户的历史订单,会导致全表扫描。可以通过异构索引表方式,通过数据冗余减少全表扫描的频率。

详细的说明建议看看《企业IT架构转型之道 阿里巴巴中台战略思想与架构实战》这本书中数据拆分相关章节的说明。

@Alwaysrain1203
Copy link

@Alwaysrain1203 Alwaysrain1203 commented May 17, 2019

@ryouaki 如果仅按照订单id去分表,要查询一个用户的历史订单,会导致全表扫描。可以通过异构索引表方式,通过数据冗余减少全表扫描的频率。

详细的说明建议看看《企业IT架构转型之道 阿里巴巴中台战略思想与架构实战》这本书中数据拆分相关章节的说明。

你好,我是个新手,您回答的意思是否是无法避免分表后要查询的话会产生全表扫描?只能减低扫描的频率么?

@yanglbme
Copy link
Member

@yanglbme yanglbme commented May 17, 2019

@Alwaysrain1203 是这样的,我们没有必要对所有的查询场景都建立异构索引表,因为这样会导致数据库大量的数据冗余。

还是需要根据实际情况,“82法则”,仅对性能要求高的场景做一些优化方案处理即可。

@Alwaysrain1203
Copy link

@Alwaysrain1203 Alwaysrain1203 commented May 17, 2019

@Alwaysrain1203 是这样的,我们没有必要对所有的查询场景都建立异构索引表,因为这样会导致数据库大量的数据冗余。

还是需要根据实际情况,“82法则”,仅对性能要求高的场景做一些优化方案处理即可。

多谢答疑!

@zoomc
Copy link

@zoomc zoomc commented Jun 4, 2019

很多人没这么多机会锻炼啊

@yanglbme yanglbme changed the title 技术面试相关讨论 | Discussions about Coding-Interview 技术面试相关讨论 | Discussions about Technical-Interview Jun 17, 2019
@radaren
Copy link

@radaren radaren commented Jun 20, 2019

很多人没这么多机会锻炼啊

没锻炼的同学不就应该选择初级岗位,像学徒这样的吗
主要是区分度的问题

@gotoeasy
Copy link

@gotoeasy gotoeasy commented Jul 1, 2019

神乎其神,过度面试,夸大需求

我面试很简单,就看沟通是否顺畅,是否好学上进,相关经验不能作假夸大,主动性强有思路更好,足够了,事实上都干得挺好

就这个mq吧,搞成解耦削峰异步的“标准答案”,别到头来都忘记了你是要干什么,业务实现才是你要干的事

处理来不及不够快嘛,所以才堆积排队
处理时间太长嘛,所以就拆分,能异步的就异步
数据量太大嘛,所以分区分片
单机承载有限嘛,所以要集群要分布式
分步分机了嘛,落地存盘是必须的,多台更保险
一步一步这样走下去,各种关键问题就会出来,然后各种第三方软件中间件等也就出来了,都是各自解决各自关心的问题

然后嘛,不能把中间件的使用当高科技,说白了就像是看文档调api

到底,实际上都很基础,计算机原理之类

比如,磁盘顺序读写速度最快,所以kafka就这么干,也就成了

@gotoeasy
Copy link

@gotoeasy gotoeasy commented Jul 1, 2019

不是针对楼主,说的是现状

技术这东西大多数并不需要多么高的技术,也不是真有多么高的专业壁垒,再难也不需要你学一年半载还不会,若真还不会那必须改行

外行不懂只会崇拜,内行的不必太较真,像这kafka就是再熟,没准也会忘了怎么拼写
但,忘了就忘了,这其实也真不算事

@yanglbme
Copy link
Member

@yanglbme yanglbme commented Jul 1, 2019

@gotoeasy 谢谢分享。

每个人看问题的角度不一样,这里很欢迎各位面试官和技术朋友们来分享自己的一些想法。

@cy503328434
Copy link

@cy503328434 cy503328434 commented Jul 11, 2019

关于zk被问的一个问题,就是在北京、上海有两批服务器,现在把它放到同一个局域网下面,用zk做注册中心,怎么解决两个地区服务相互调用的网络延迟问题。

@hisenyuan
Copy link

@hisenyuan hisenyuan commented Jul 11, 2019

关于zk被问的一个问题,就是在北京、上海有两批服务器,现在把它放到同一个局域网下面,用zk做注册中心,怎么解决两个地区服务相互调用的网络延迟问题。

机房都目的是做灾备?
如果两个机房相互调用网络耗时长
可以考虑在各自机房部署一套完整的服务
正常的时候优先路由本地机房出问题走异地

@cy503328434
Copy link

@cy503328434 cy503328434 commented Jul 11, 2019

面试官是说两机房在一个局域网内,但场景是他们之间数据共用一套,用dubbo 做rpc调用。问我怎么通过zk的配置来解决。@hisenyuan

@hisenyuan
Copy link

@hisenyuan hisenyuan commented Jul 11, 2019

面试官是说两机房在一个局域网内,但场景是他们之间数据共用一套,用dubbo 做rpc调用。问我怎么通过zk的配置来解决。@hisenyuan

这个问题描述的感觉无法回答。

@blackdog1987
Copy link
Author

@blackdog1987 blackdog1987 commented Jul 24, 2019

不是针对楼主,说的是现状

技术这东西大多数并不需要多么高的技术,也不是真有多么高的专业壁垒,再难也不需要你学一年半载还不会,若真还不会那必须改行

外行不懂只会崇拜,内行的不必太较真,像这kafka就是再熟,没准也会忘了怎么拼写
但,忘了就忘了,这其实也真不算事

技术这东西,对于绝大部分人来说,没有高深不高深的,只有先知和后知。被问到的点刚好做过,属于有经验;被问到的点,做过类似的,能类比着说出来,属于有较强学习能力。但思考不一样,无论自己做过什么,思考过的人,和没有思考过的人,通过他的回答可以很快看出来。
经验、学习能力、思考能力,我们底层码农都希望自己的战友具有这些能力。我面进来的人是要和我一起加班熬通宵的,减少我的加班时间的,早点下班回家,有助于我早日冲上王者段位。我不太愿意招一个人天天我带着他学。他教教我,我教教他,切磋交流肯定可以。

@withLiMin
Copy link

@withLiMin withLiMin commented Aug 1, 2019

谢谢,受益匪浅

@cy503328434
Copy link

@cy503328434 cy503328434 commented Aug 2, 2019

大家有看过 【石杉的架构笔记】推送的文章吗?亿级流量高并发场景下,如何保证缓存与数据库的双写一致性? 。里面说到比较复杂的数据不一致问题的解决方案。将操作路由之后,发送到一个 jvm 内部队列中。他需要建很多的内存队列,然后hash到不同的队列去排队,一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。我觉得这样子处理是不是有些过于复杂了, 是不是可以通过java里面的读写锁来实现就可以了,写的时候对这个key加写锁,直接写成功才返回,在写的时候不能对这个key进行读操作。如果长时候拿不到读锁我们也可以类似他说的那样来优化。

@MENGMUZI
Copy link

@MENGMUZI MENGMUZI commented Aug 5, 2019

我刚刚看到石杉讲的这边,我一直有个疑问,数据库不是有行级锁吗?复杂情况那个案列,他就是担心写数据,写一半,然后进来读数据之后会导致数据库和缓存不一致吗?你这个里面读了同一行数据,有锁呀,不会出现这样的状态吧!!!求哪位大神指点。

@blackdog1987
Copy link
Author

@blackdog1987 blackdog1987 commented Aug 5, 2019

我刚刚看到石杉讲的这边,我一直有个疑问,数据库不是有行级锁吗?复杂情况那个案列,他就是担心写数据,写一半,然后进来读数据之后会导致数据库和缓存不一致吗?你这个里面读了同一行数据,有锁呀,不会出现这样的状态吧!!!求哪位大神指点。

行锁是在mysql(数据库)里,缓存不在库里(在redis?),你锁了数据库的行,但是这把锁管不了缓存。

@MENGMUZI
Copy link

@MENGMUZI MENGMUZI commented Aug 5, 2019

大佬我的疑问是这样,石杉老师说保证缓存和数据库的双写一致性,初级的解决方案是数据发生变更,先删除缓存,然后去修改数据库。这个操作我理解,对于高并发的情况下,他说去修改数据库,这个时候还没修改好,然后一个请求过来,去读缓存,发现缓存是空的,然后去查询数据库,查到了修改前的旧数据,放到了缓存,然后导致不一致。我的意思是你改的时候,还可以查询到旧数据吗?我是个入门没有多久的小白,望大佬别笑话我的问题。

@hisenyuan
Copy link

@hisenyuan hisenyuan commented Aug 5, 2019

大佬我的疑问是这样,石杉老师说保证缓存和数据库的双写一致性,初级的解决方案是数据发生变更,先删除缓存,然后去修改数据库。这个操作我理解,对于高并发的情况下,他说去修改数据库,这个时候还没修改好,然后一个请求过来,去读缓存,发现缓存是空的,然后去查询数据库,查到了修改前的旧数据,放到了缓存,然后导致不一致。我的意思是你改的时候,还可以查询到旧数据吗?我是个入门没有多久的小白,望大佬别笑话我的问题。

缓存、数据库一致性问题,先删除缓存,再更新数据库。删除成功更新数据库的时候,就让排队,只允许一个线程去查数据库,问题就解决了。你说的改数据库的时候,能否查到旧数据,是可以的,innodb的多版本控制了解一下。更新操作一般几毫秒(行锁情况下)。

@cy503328434
Copy link

@cy503328434 cy503328434 commented Aug 5, 2019

石杉老师说的思路大概就是串行化来解决,我觉得只要可以保证写排他,读共享应该也是可以解决的。

@Pozhe
Copy link

@Pozhe Pozhe commented Aug 7, 2019

工作有跟多的自己的思考,但是实际工作中很难是这样的,会很多很多各种问题,而且现在的社会每个人压力都这么大,烦躁的事情各种各
美团王兴说过,多数人为了逃避思考,愿意做任何事,盲目的认为可以用肢体上的勤奋来掩盖思想上的懒惰
解决办法:换一个相对有自己时间的公司,利用时间思考和生活

@Pozhe
Copy link

@Pozhe Pozhe commented Aug 7, 2019

我也很想在工作有跟多的自己的思考,但是实际工作中很难是这样的,会很多很多各种问题,而且现在的社会每个人压力都这么大,烦躁的事情各种各样,,,,,,,,,,,,,
美团王兴说过,多数人为了逃避思考,愿意做任何事,盲目的认为可以用肢体上的勤奋来掩盖思想上的懒惰
解决办法:换一个相对有自己时间的公司,利用时间思考和生活

@AbyssStaring
Copy link

@AbyssStaring AbyssStaring commented Aug 28, 2019

分库分表中间件我用的是sharding-jdbc,但是后来直接用订单时间来分表,3个月前的订单表几乎没有需求去查询。也没有用中间件了

@scholers
Copy link

@scholers scholers commented Aug 30, 2019

@huaxu1024
Copy link
Member

@huaxu1024 huaxu1024 commented Oct 15, 2019

@如何保证消息的顺序性?

解决方案提到
拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;或者就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理

这里有一个疑问
这里的内存队列是指什么?每一个consumer是一个机器节点,是要在引用一个跨机器的服务去处理么?还是说在分成多queue之后,对应的consumer 待消费的数据本身就已经是有序的,只要保证单个节点的有序就可以达到全局有序?

思考了一下
本来开始的时候在想binlog怎么插入到mq中,后来发现alibaba 此前开源了一个canal,最后感觉如果需要严格的顺序性,还是需要单一的消费

@ZHOULIANG-CODER
Copy link

@ZHOULIANG-CODER ZHOULIANG-CODER commented Oct 31, 2019

问我用的啥 微服务--分布式事务怎么处理的,一脸懵逼

@xuezhe996
Copy link

@xuezhe996 xuezhe996 commented Dec 6, 2019

可能是世风日下,什么人都可以成为面试官的原因。有些人真是太拿自己当回事了,就应该狠狠的按在地上好好摩擦摩擦 ...

@xuezhe996
Copy link

@xuezhe996 xuezhe996 commented Dec 6, 2019

可能是世风日下,什么人都可以成为面试官的原因。有些人真是太拿自己当回事了,就应该狠狠的按在地上好好摩擦摩擦 ...

我既参加过面试也面试过别人,参加面试有把面试官吊起来打的时候,也有碰到各种SB的时候,但是我面试别人从不会为难别人,不说自己多么高尚吧,至少还是不要做人太辣鸡。

@alleniverson33
Copy link

@alleniverson33 alleniverson33 commented Dec 16, 2019

之前遇到个面试 问我用过什么支付 我说京东 然后问我京东支付的bug你是怎么处理的 瞬间无法回答
没bug啊

@alterhz
Copy link

@alterhz alterhz commented Dec 28, 2019

我刚刚看到石杉讲的这边,我一直有个疑问,数据库不是有行级锁吗?复杂情况那个案列,他就是担心写数据,写一半,然后进来读数据之后会导致数据库和缓存不一致吗?你这个里面读了同一行数据,有锁呀,不会出现这样的状态吧!!!求哪位大神指点。

写数据,可能还没有到数据库,还在内存队列,所以这个时候数据库锁没有用。

@cyberwave
Copy link

@cyberwave cyberwave commented Dec 30, 2019

之前遇到个面试 问我用过什么支付 我说京东 然后问我京东支付的bug你是怎么处理的 瞬间无法回答
没bug啊

可能面试官目前正遇到自己团队中的支付问题,他想通过面试别人来获得解决问题的解决思路或灵感。之前听说有这种情况,没有招人计划,纯粹是通过面试别人来解决现在的手头的问题

@duwenjie920611
Copy link

@duwenjie920611 duwenjie920611 commented Mar 31, 2020

面试官是说两机房在一个局域网内,但场景是他们之间数据共用一套,用dubbo 做rpc调用。问我怎么通过zk的配置来解决。@hisenyuan

http://dubbo.apache.org/zh-cn/docs/user/demos/multi-registry.html 这段时间准备面试,特意去官网看了下配置,不知道是不是问多注册中间配置问题

@winter0245
Copy link

@winter0245 winter0245 commented Apr 5, 2020

面试官是说两机房在一个局域网内,但场景是他们之间数据共用一套,用dubbo 做rpc调用。问我怎么通过zk的配置来解决。@hisenyuan

http://dubbo.apache.org/zh-cn/docs/user/demos/multi-registry.html 这段时间准备面试,特意去官网看了下配置,不知道是不是问多注册中间配置问题

可以考虑使用zk的observer模式

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
You can’t perform that action at this time.