前言
??本文主要分兩部分,前半部分聊了聊這次找工作中我自己的一些想法和體會,因為是隨性而發(fā),可能會寫得比較啰嗦职抡,第二部分才是實際的面試題記錄和我的回答思路,如果只是想了解下面試題的小伙伴直接跳去第二部分開始看吧~
??另外面試題中我是有選擇性地記錄的误甚,記錄的標(biāo)準(zhǔn)是缚甩,我個人認(rèn)為問得比較有水平的,我感覺自己沒回答好的窑邦,或者說我覺得這部分還沒形成自己的知識積累擅威,先記下來作為以后的學(xué)習(xí)參考的。所以里面所寫的回答的思路不一定對冈钦,而且記錄里也沒涉及到特別基礎(chǔ)的那部分知識郊丛,如果是想?yún)⒖蓟A(chǔ)部分的知識的話在下更推薦你去 https://github.com/CyC2018/CS-Notes/ 這里去整體過一遍。
??那么接下來開始第一部分~
一、對于找工作厉熟,個人的一些想法和體會
1. 關(guān)于個人的提升與學(xué)習(xí)导盅,以及學(xué)習(xí)的針對性
?? 1)需要明確的第一點(diǎn)是,在軟件開發(fā)這一塊揍瑟,無論想要學(xué)習(xí)什么白翻,首先你得基礎(chǔ)足夠好。因為無論學(xué)習(xí)看起來多么炫酷绢片,高大上的軟件技術(shù)滤馍,其本質(zhì)上還是離不開兩點(diǎn):①它是以編程語言作為表達(dá)載體的;②它是以電子計算機(jī)作為運(yùn)行載體的杉畜。明白這兩點(diǎn)之后會發(fā)現(xiàn)纪蜒,其實很多東西萬變不離其宗,基礎(chǔ)足夠好的人此叠,學(xué)習(xí)起來的效率也會比其他硬啃的人高很多纯续。
?? 2)那么問題來了,所謂的基礎(chǔ)是指什么灭袁?①以一個程序員的角度上來說猬错,首先得對馮·諾依曼提出的計算機(jī)體系結(jié)構(gòu)的工作原理(包括CPU,內(nèi)存茸歧,磁盤等倦炒,當(dāng)然也不用很深,畢竟又不是做硬件開發(fā)的)有一定的了解软瞎,其次要了解計算機(jī)網(wǎng)絡(luò)逢唤,包括TCP/IP,UDP涤浇,HTTP等知識鳖藕;②進(jìn)一步說,從一個JAVA程序員的角度出發(fā)只锭,你當(dāng)然需要對JDK的語法著恩,各項特性,原生提供的各種API都有一定程度的熟悉蜻展,同時對JVM內(nèi)存模型有所了解喉誊,然后就是對里面一些經(jīng)典的數(shù)據(jù)結(jié)構(gòu)有對其源碼有自己的理解和體會,例如最為大家廣泛流傳的HashMap纵顾,里面包含的hash一致性伍茄,散列表,鏈表施逾,平衡二叉樹幻林,以及其精妙絕倫的對于位運(yùn)算的運(yùn)用贞盯,能把它內(nèi)部學(xué)通一遍會有非常大的收獲音念;
?? 3)不少小伙伴會疑惑沪饺,這些東西是不是就是為了學(xué)來“面試造火箭”的?“上班擰螺絲”的時候真的能用上嗎闷愤?我想說整葡,真的有用,但我這里不知道該怎么舉出例子來說服你讥脐,我只能說遭居,當(dāng)你積累的知識足夠多的時候,回過頭去和自己曾經(jīng)的工作經(jīng)驗結(jié)合起來去細(xì)細(xì)體會旬渠,你會發(fā)現(xiàn)它們其實很有用俱萍,但是你積累不夠多之前沒法發(fā)現(xiàn)而已。
?? 4)除了基礎(chǔ)需要扎實外告丢,學(xué)習(xí)還需要有針對性枪蘑。我們常常說知識之海,你能把整個大海喝下去嗎岖免?不能的岳颇,精力有限,時間有限颅湘。有一種說法叫做T字形的知識結(jié)構(gòu)话侧,就是在學(xué)習(xí)上有一定的廣度,同時每一塊也有一定的深度闯参,這個該如何平衡要看個人瞻鹏,也看你的目標(biāo)。例如有人想去阿里鹿寨,阿里是做什么的靶虏?做支付释移,做金融叭披,那么就要有針對性地了解有什么技術(shù)是互聯(lián)網(wǎng)通用的,同時關(guān)注金融玩讳,支付相關(guān)的特別適用的涩蜘,契合度高的相關(guān)技術(shù)。
2. 裸辭還是騎牛找馬熏纯?
??關(guān)于這一點(diǎn)的話同诫,每個人情況不一樣,我只能結(jié)合自己的情況給出一些想法樟澜,諸君想如何選擇還是看自己误窖。
?? 1) 首先我個人的性格特征是叮盘,在某一個方面受到比較大的壓力時(這里特指工作)會消耗大量精力,進(jìn)而導(dǎo)致其他方面的思考能力降低霹俺,容易鉆牛角尖柔吼。所以對我個人來說,每隔一個較長的周期之后丙唧,給自己一段相對比較放松的時間去好好整理自己的知識網(wǎng)絡(luò)愈魏,并且思考總結(jié),想明白一些事情想际,是很必要的(我裸辭后那小半個月的時間想明白的問題比前面半年可能都多)培漏,所以對我來說,先辭職胡本,自我整理牌柄,然后重新開始下一段工作,是一個比較好的過程侧甫。當(dāng)然這也與我個人的調(diào)整能力不高有一定關(guān)系珊佣,能自我調(diào)整壓力進(jìn)行思考的小伙伴可能對于裸辭放松的必要性不大;
?? 2)裸辭之后的心理壓力闺骚,對于自己的經(jīng)濟(jì)儲備以及求職信心來說是負(fù)相關(guān)的彩扔。你的經(jīng)濟(jì)儲備越多,對于找工作的自信越強(qiáng)僻爽,你賦閑在家時的壓力就相對谐娴铩;反過來說胸梆,經(jīng)濟(jì)儲備不足敦捧,而且對于求職信心不足,裸辭反而會讓你個人非常非常非常焦慮碰镜,壓力會把你壓得喘不過氣來兢卵,這樣的話反而得不到放松思考的效果了,還不如騎牛找馬绪颖,找到下家了再平滑過度秽荤;
?? 3) 對于我個人來說還有一點(diǎn)是我是跨城市從廣州跳槽上海,雖然現(xiàn)在大部分大公司都支持電話交流柠横,但實際上我個人是覺得還是面對面聊天更靠譜一點(diǎn)窃款,所以我這邊除了裸辭之外其實沒其他很好的選擇。至于跨城市求職的話牍氛,如果經(jīng)濟(jì)儲備還行晨继,而且身上有貴重物品的,不妨找個1~2月的短租房搬俊,小豬短租紊扬,airbnb都是不錯的平臺蜒茄,有個好的地方住也有助于你一邊求職一邊專心整理,學(xué)習(xí)餐屎。
3. 對于外包公司的一些看法
??大多數(shù)人不建議年輕人進(jìn)外包公司檀葛,從我個人來說,包括人員外包和項目外包的公司我都做過啤挎,可以跟大家聊聊我的看法驻谆。
?? 1) 并不是所有的外包公司都是需要看甲方臉色的,這個跟自己同時也跟甲方公司文化有關(guān)系庆聘。不管是項目外包還是人員外包,作為乙方都需要和甲方對接這個毋庸置疑勺卢,有部分甲方公司會把乙方人員看做純粹是來干苦工的伙判,甚至覺得自己身份比對方高,這種乙方過去了基本上就是受氣的黑忱,而且可能得不到任何提升宴抚,去了就是一片黑暗的未來;
??而另一種甲方甫煞,除了讓乙方干活之外菇曲,也會把乙方看做是人才儲備,在部門有HC且乙方表現(xiàn)出色的情況下會考慮引薦抚吠,至少在我上一家公司常潮,領(lǐng)導(dǎo)(不管是我方還是甲方)其實都挺信任我,給了我很多嘗試實踐的機(jī)會(也因此犯了不少錯楷力,讓他們幫我背了黑鍋喊式,想想還是有點(diǎn)抱歉的),走的時候也是問過我要不要考慮加入他們萧朝。所以岔留,雖然我也并不推薦做外包,但如果在出路不多的情況下检柬,也沒必要鉆牛角尖寧愿餓死也不去外包献联,至少混口飯吃總是可以的;
?? 2)哪怕不用看臉色何址,在甲方的地盤上班還是會讓你明顯感覺出自己是個外人里逆。雖然我上面說了有部分公司(包括大部分知名外企,互聯(lián)網(wǎng)企業(yè)头朱,也包括一些文化相對開放的國企)甲方跟乙方的工作內(nèi)容和人員處于一個相對平等的地位运悲,但實際上在組織編制上,員工福利上项钮,提升機(jī)會上班眯,以及部分核心的保密的工作內(nèi)容上希停,你還是會在里面處處感覺自己像個外人,時間久了會越做心里越委屈(真的就是覺得委屈署隘,不是矯情)宠能,而且想要轉(zhuǎn)正也是需要等對方的HC,哪怕有了HC磁餐,人家也可能會更愿意拿來招211985的應(yīng)屆大學(xué)生而不是引薦你轉(zhuǎn)正违崇。
??所以其實說句比較尖銳的話就是,公司之所以招乙方诊霹,其實更多的是因為乙方人員好打發(fā)羞延,轉(zhuǎn)正不是完全沒機(jī)會,但其實有限脾还。至少我個人目前是不想再去外包公司了伴箩,除非是已經(jīng)沒有出路的情況下。
4. 寫簡歷需要注意的事情
??簡歷上盡量要求真務(wù)實鄙漏,有自知之明嗤谚,并且自信,自己會什么就寫什么怔蚌,對于自己擅長的點(diǎn)可以稍加筆墨詳細(xì)點(diǎn)去描述巩步,而對于自己只懂點(diǎn)皮毛的點(diǎn)則慎用熟悉,精通等詞桦踊,更建議用了解這個詞(見過有人用會用XXX這種描述寫到簡歷上的椅野,我只能說emmmm真睿智),因為你簡歷如果寫得太浮夸钞钙,自己明明只懂點(diǎn)皮毛偏要寫個精通上去鳄橘,最后面試的時候答不出題會異常尷尬,而且面試官對你的印象也會很差芒炼,覺得你在造假瘫怜。
5. 面試時的溝通技巧,怎么樣給面試官留下好印象
?? 1) 面試的時候其實也跟寫簡歷類似本刽,需要你有自知之明鲸湃,并且自信。①如果面試官提出了你不熟悉的問題子寓,直白點(diǎn)說出自己知道的東西暗挑,剩下的就直接說不知道或者不清楚,然后也可以主動提出說其實你的精力集中在了某方面斜友,所以對當(dāng)前問的這個問題理解不深炸裆,這樣來引導(dǎo)面試官去了解你擅長的方面;②如果面試官提出的問題剛好是你熟悉的鲜屏,下過苦工去鉆研的烹看,盡量多說點(diǎn)国拇,保持邏輯清晰,思路清楚惯殊,并且加入自己的理解最好酱吝,就我目前發(fā)現(xiàn)來說,面試官對于能說清楚知識點(diǎn)之余同時加入自己的思考和理解的人會很欣賞土思;
?? 2) 說話的時候有禮貌务热,條理清晰就好,其他的什么技巧其實也是細(xì)枝末節(jié)己儒。很多時候其實面試也講究一個相性的問題崎岂,你跟面試官的相性高,那很容易可以跟對方談笑風(fēng)生址愿;但大多數(shù)情況下兩個陌生人見面聊天也就是一個你問我答的過程该镣,有基本的禮貌,回答問題邏輯清晰响谓,保持跟對方的交流而不是你自己自顧自地說就好,其他的什么亂七八糟的什么微表情什么心理學(xué)的技巧都是畫蛇添足了省艳,你是去面試當(dāng)程序員而不是心理醫(yī)生娘纷;
?? 2) 面試的時候要心態(tài)好,不要覺得面試官身份比你高因而覺得緊張甚至害怕跋炕,面試官更愿意看到一個自信的赖晶,思維清晰的人。要知道面試是一個雙方互相選擇互相交流的過程辐烂,你跟面試官在這個過程中是平等的遏插,大家都是人,面試官可能無非就是技術(shù)比你好纠修,收入比你高胳嘲,難道他因為比你強(qiáng)一點(diǎn)就不是人而是神了嗎?
?? 3) 面試除了你回答面試官的問題之外扣草,其實也可以向他請教你的疑惑了牛。前面已經(jīng)說了,面試是一個雙方互相平等交流辰妙,選擇的過程鹰祸,有素質(zhì)的面試官,往往會在對你的提問結(jié)束后給你時間去提問密浑,這個時候除了關(guān)于公司的問題之外蛙婴,其實也可以提出你自己私人上一些疑惑和問題,實際上說不定還可以得到加分尔破,因為街图,你會產(chǎn)生疑惑浇衬,說明你是真的下了不少心思去鉆研它,而前面也提過台夺,部分面試官會非常欣賞有獨(dú)立思考能力的人径玖。
??以我個人舉例子的話,提問環(huán)節(jié)我會喜歡先提問公司的營業(yè)模式颤介,技術(shù)棧梳星,開發(fā)時會遇到的一些挑戰(zhàn)和難題,最后提出自己最近的一些疑惑滚朵,例如這陣子的面試冤灾,我都會提出【對于學(xué)習(xí)的深度與廣度上的取舍與平衡,您個人有經(jīng)驗可以分享下嗎辕近?】以及【如果自己學(xué)習(xí)到的新知識無法在公司的實際項目中得到實踐韵吨,如何自己創(chuàng)造機(jī)會去做實踐呢?】這兩個問題移宅,前輩們也都很友善地給我分享了他們的想法归粉,也不得不說每個人看問題的角度不一樣,綜合他們的經(jīng)驗下也讓我得到了不少收獲漏峰。
那么我個人的總結(jié)到這里結(jié)束了糠悼,下面就是我整理的印象比較深的面試題。
二浅乔、面試記錄
20190509 ebay初面:
一)開發(fā)計劃中的角色倔喂,職責(zé),代碼主要寫的什么內(nèi)容靖苇,涉及到什么邏輯之類的
1. 參與業(yè)務(wù)分析與開發(fā)方案的設(shè)計席噩,從業(yè)務(wù)需求轉(zhuǎn)換到具體的web api接口
2. 開發(fā)方面主要涉及到
- 微服務(wù)接口開發(fā),一般的邏輯包括:
1.) 入?yún)⒌谋靥铐椣捅冢蛘哂袟l件的必填項
2.) 貼合業(yè)務(wù)邏輯的代碼編寫悼枢,基本上就是CRUD,有可能根據(jù)需要外呼其他接口
3.) 若發(fā)生異常(程序異常芯砸,業(yè)務(wù)異常)根據(jù)不同異常情況返回提示信息
4.) 成功則根據(jù)消息格式返回 - 定時任務(wù)的開發(fā)萧芙,一般邏輯為:
1.) 檢查當(dāng)前異步程序的執(zhí)行要素是否齊全,不齊全則寫日志假丧,直接退出
2.) 根據(jù)執(zhí)行要素開始程序双揪,任務(wù)多為IO密集型,會開多線程
3.) 多線程包帚,為了保證一致性渔期,一般用
??i.生產(chǎn)者-消費(fèi)者模式,在主線程將數(shù)據(jù)進(jìn)行分割,避免沖突
??ii.無法避免沖突的情況下疯趟,使用鎖拘哨,鎖的粒度盡量小,以減少鎖占用時間
二)接口設(shè)計的個人體會和經(jīng)驗
- 考慮接口的出參和入?yún)⒏袷?/li>
- 考慮異常情況及異常發(fā)生時的提示
- 接口的擴(kuò)展性信峻,業(yè)務(wù)變更可能性
- 代碼追求簡潔高效倦青,SQL同理
20190510 平安壹錢包
一)簡單算法:
??如何翻轉(zhuǎn)字符串:
??當(dāng)時的回答:轉(zhuǎn)成char數(shù)組,循環(huán)長度的一半盹舞,頭尾交換值产镐;
??回答的算法是正確的,但可能說得太簡練踢步,而且也是最常見的方法癣亚,對方反饋一般般,下次算法題考慮說詳細(xì)點(diǎn)
二)zookeeper的使用和理解获印,以及原理
??這里簡單地答了應(yīng)用述雾,和服務(wù)發(fā)現(xiàn),注冊兼丰,心跳玻孟,負(fù)載均衡,和ZAB一致性協(xié)議鳍征,但因為原理研究不深取募,應(yīng)用也沒答全(沒有說分布式鎖,也沒說到集群管理之類的)蟆技,反饋一般
??考慮找時間詳細(xì)地補(bǔ)一下zookeeper的原理
??同理也應(yīng)該詳細(xì)補(bǔ)一下kafka的原理,甚至源碼
??redis只是簡單問了應(yīng)用斗忌,使用場景质礼,但后續(xù)估計會問到工作原理,有時間也需要準(zhǔn)備一下
??spring原理現(xiàn)在感覺都問爛了织阳,面試官都懶得問了眶蕉,我還特地花了那么多心思去鉆呢(殘念臉
三)有部分回答可能會顯得有些啰嗦,例如問到溝通唧躲,問到團(tuán)隊合作造挽,之類的,應(yīng)盡量簡潔高效地回答對方自己的處事方式和工作溝通
四)說出自己比較做得比較好的項目和理解弄痹,這一塊前面答得略微簡單饭入,可以考慮以下回答:
??簡單回答最近在CCB做的這個項目就是最有挑戰(zhàn)性的,因為前面都是單體式應(yīng)用肛真,這是第一次接觸分布式谐丢,并發(fā)量可能高達(dá)幾千上萬,同時數(shù)據(jù)量也達(dá)到了千萬級甚至億級,對開發(fā)工作的要求嚴(yán)格很多乾忱。我對于這個項目的研究和學(xué)習(xí)里對與分布式與微服務(wù)得到了不少的理解讥珍,同時也在這個項目中學(xué)習(xí)到了各種比較流行的,包括kafka窄瘟,redis等流行的中間件應(yīng)用衷佃,同時也會面對更復(fù)雜的業(yè)務(wù)場景,使我對于業(yè)務(wù)和技術(shù)結(jié)合有了更深的理解蹄葱。
??我在這個項目中負(fù)責(zé)相關(guān)的業(yè)務(wù)分析和開發(fā)方案的設(shè)計氏义,開發(fā)日程的討論,以及開發(fā)微服務(wù)接口和異步程序新蟆,除此之外也負(fù)責(zé)對新同事進(jìn)行基礎(chǔ)的技術(shù)和業(yè)務(wù)培訓(xùn)觅赊,給他們的開發(fā)工作進(jìn)行指導(dǎo)
20190513 eBay二面:
一) 第一個面試官,感覺考察的是架構(gòu)能力琼稻,問題的分析和追蹤能力吮螺,同時還順便考察了知識面的廣度
??一上來就先畫了一下他們某個電商微服務(wù)的架構(gòu)圖讓我分析問題,記錄如下:
(我就隨便跟著印象瞎畫一下帕翻,我知道很糟糕鸠补,希望未來的我看到了不要回來打現(xiàn)在的我)
??當(dāng)時初步提供的信息里沒提到持久層MQ,后來我問出來的嘀掸。
??提出的問題是:兩個請求A和B紫岩,A將value從F更新成T,B從T更新成F睬塌,執(zhí)行結(jié)束后在DB查到的結(jié)果是T泉蝌,但是log console里可以查到有A和B完整執(zhí)行的記錄,請查找原因
??在一步步的詢問查找揩晴,包括對框架的分析中可以知道勋陪,由于在log console中可以找到執(zhí)行日志,且前面從前端到scheduler到worker集群都是保證順序的硫兰,所以通過log console的結(jié)果可以看出問題并不在前面的步驟诅愚。
??最后得出的結(jié)論是在持久層API內(nèi)的問題,因為MQ并不是直接操作到持久層的劫映,而是發(fā)送請求到持久層违孝,由持久層API進(jìn)行操作,我一開始沒問清楚泳赋,以為持久層是直接操作雌桑。
??至于為什么會出問題,因為持久層的API也是集群(很雞賊摹蘑,我前面問的時候告訴我持久層可以看做是一個單體API筹燕,但是后來挑明之后又告訴我看做是單體API是從外部的角度來看,只向外部暴露了API,外部不需要知道內(nèi)部細(xì)節(jié)撒踪,但內(nèi)部實際上是一套持久層API的集群)过咬,在集群中,可能A和B被分配到了不同的持久層節(jié)點(diǎn)制妄,雖然MQ內(nèi)是有順序的掸绞,但是可能A在執(zhí)行過程中節(jié)點(diǎn)被阻塞,導(dǎo)致B的操作先完成了耕捞,最后導(dǎo)致A后更新衔掸。
??解決方法:一開始考慮了在持久層內(nèi)部使用raft算法或者別的選舉算法來定位一個Leader,由leader來保證順序俺抽,但是這樣對吞吐量不利敞映,實際上更多地應(yīng)該考慮使用樂觀鎖可以解決問題。
二) 第二個面試官磷斧,感覺側(cè)重在對以前項目的理解深度振愿,包括業(yè)務(wù),架構(gòu)和開發(fā)模式等等弛饭,順便也考察了面試者有沒有主動去對框架和架構(gòu)進(jìn)行了解學(xué)習(xí)的積極性冕末?另一方面就是重點(diǎn)考察基礎(chǔ)知識,特別是多線程
寫一個死鎖程序:
??媽蛋當(dāng)時太緊張忘了侣颂,后來面試完在路上突然間又想起來了档桃,但是也是因為對死鎖理解不夠深,多線程還要繼續(xù)補(bǔ)補(bǔ)憔晒,而且記住以后面試千萬不要緊張kafka(MQ)的分區(qū)藻肄,擴(kuò)展怎么擴(kuò),根據(jù)什么來擴(kuò)容拒担?
一開始以為這里問的是業(yè)務(wù)場景仅炊,但是回頭想想應(yīng)該問的是kafka的分區(qū)原理說一下線程同步,如何保證澎蛛?
對于線程同步的理解不夠清晰沒答好,后續(xù)補(bǔ)
回來查了一些資料之后我認(rèn)為相對靠譜的答案:線程同步蜕窿,從內(nèi)存的角度上來說谋逻,在多線程環(huán)境下,對同一個內(nèi)存地址進(jìn)行操作桐经,同一時間內(nèi)只能有一個線程進(jìn)行操作毁兆,其他線程必須要等待;從程序的角度上看的話阴挣,就是多線程環(huán)境下气堕,多個線程對同一個公共資源進(jìn)行操作時,這個資源的狀態(tài)的變化在所有線程角度上觀察是一致且有序的。
要保證線程同步茎芭,那就要保證每次對公共資源進(jìn)行寫操作的時候揖膜,只能有一個線程參與,其他線程只能等待梅桩。想要做到這一點(diǎn)壹粟,可以通過synchronized關(guān)鍵字或者lock接口對資源進(jìn)行加鎖
除了對資源進(jìn)行加鎖之外還可以對方法,或者片面的代碼塊進(jìn)行加鎖宿百,如此在執(zhí)行相關(guān)的代碼時就只能是單個線程參與趁仙。JVM如果發(fā)生OOM如何查問題
基本思路是對的,查看最近的接口是否有長時間存活的大對象垦页,是否對大文件讀寫沒注意雀费,查看是否集合類被一直引用;
跟蹤GC情況痊焊,用jstat –gcutil
生成堆快照盏袄,jmap
分析堆快照,jhat
還可以用包括eclipse等ide進(jìn)行分析問到了項目間用什么協(xié)議通訊
因為緊張把網(wǎng)絡(luò)協(xié)議的知識都忘了宋光,沒答好貌矿,說了TCP(扶額),實際上應(yīng)該是HTTP罪佳,內(nèi)部用流進(jìn)行傳輸
三) 第三個面試官跟第二個差不多逛漫,也是重點(diǎn)考察基礎(chǔ),基礎(chǔ)進(jìn)階赘艳,包括多線程和JVM等酌毡,同時還考察了方案設(shè)計能力
聊聊JVM的內(nèi)存結(jié)構(gòu),順便說說GC
當(dāng)時把VM棧和本地方法棧的作用忘了蕾管,其他答得還行
JVM棧記錄的是JAVA方法執(zhí)行的內(nèi)存模型枷踏,存儲了包括局部變量表,操作數(shù)棧掰曾,方法出口等等信息旭蠕,
本地方法棧同理,不過記錄的是native方法的信息講講簡歷中提到的旷坦,開發(fā)的定時任務(wù)掏熬,異步任務(wù)之類的思路
當(dāng)時常規(guī)地講到了大部分是IO密集型的數(shù)據(jù)處理任務(wù),然后跟他聊了聊常用的生產(chǎn)者-消費(fèi)者模式
詳細(xì)地問完秒梅,反問我旗芬,如果生產(chǎn)者對于數(shù)據(jù)的生產(chǎn)速度較慢,需要也用多線程生產(chǎn)怎么辦
生產(chǎn)者線程組跟消費(fèi)者生產(chǎn)組分隔開捆蜀,中間建立一個調(diào)度線程疮丛,調(diào)度線程負(fù)責(zé)對生產(chǎn)者的發(fā)送的數(shù)據(jù)作為一個緩沖幔嫂,緩沖池有個最大值,當(dāng)生產(chǎn)者檢查到緩沖池滿了誊薄,則休眠履恩,調(diào)度線程會喚醒消費(fèi)線程论颅;同理育瓜,消費(fèi)線程不運(yùn)作的時候會休眠索引
20190513 螞蟻金服初面,電面
一) 分布式事務(wù)
分布式事務(wù)叉存,首先可以圍繞著CAP定理開始聊
聊完之后考慮實現(xiàn)方式咐刨,包括2PC(二階段提交)和TCC(補(bǔ)償事務(wù))
也可以異步MQ記賬昙衅,最后通過日終核算以及人工補(bǔ)償達(dá)到最終一致性
二)問了排序算法,回答了冒泡排序和快速排序
后來被追問時間復(fù)雜度定鸟,忘記怎么算了而涉,撲街
20190515 花旗銀行
一)關(guān)于線程池,JDK原生提供的幾種線程池联予,自己創(chuàng)建線程池的話對于參數(shù)設(shè)置的心得
例如說某塊功能需要用線程池做處理啼县,有峰值低估,該怎么設(shè)置沸久?
原生提供的線程池包括single(單線程)季眷,fixed(固定長度),cache(可緩存可回收利用)卷胯,scheduled(定長子刮,支持周期性或定時任務(wù),用schedule方法而不是execute來執(zhí)行)
corePoolSize核心線程數(shù)(當(dāng)忙碌線程數(shù)小于核心線程數(shù)時窑睁,會將已有的空閑線程回收再用挺峡,節(jié)省資源),maximumPoolSize最大線程數(shù)担钮,線程池中允許線程數(shù)最大值
keepAliveTime 空閑線程的最大存活時間
workQueue 提供存放待運(yùn)行的任務(wù)隊列的隊列類型橱赠,有多種策略
RejectedExecutionHandler 拒絕策略接口
二)關(guān)于synchronized
部分基礎(chǔ)細(xì)節(jié)記不清楚,回答的時候很模糊箫津,記錄如下:
- 將synchronized加到方法定義上狭姨,起什么作用,分兩種情況苏遥,
- 如果是一般方法送挑,則相當(dāng)于將當(dāng)前對象加鎖,例如對象A暖眼,有method1和method2加了synchronized,那么當(dāng)線程T1調(diào)用A.method1纺裁,線程T2調(diào)用method2诫肠,由于是對A對象實例加鎖司澎,所以會根據(jù)加鎖順序,先執(zhí)行T1栋豫,再執(zhí)行T2
- 但是如果T1和T2調(diào)用的是不一樣的對象挤安,例如T1調(diào)用A.method1,T2調(diào)用B.method2丧鸯,那么兩個線程之間加鎖對象不一樣蛤铜,沒有順序,但有一種情況丛肢,如果method1和method2調(diào)用了靜態(tài)變量围肥,那么會產(chǎn)生對靜態(tài)變量的競爭,會自動對靜態(tài)變量加鎖蜂怎,所以也會有順序
- 如果是synchronized加到靜態(tài)方法上的話穆刻,就是對類進(jìn)行加鎖,而不是對對象實例進(jìn)行加鎖杠步,或者說是對類A的class對象加鎖
三)算法題問到的是一個動態(tài)規(guī)劃的應(yīng)用場景氢伟,但是相對簡單,用普通的遞歸也可以做
??這里回答得不太好幽歼,沒有一開始想到用動態(tài)規(guī)劃朵锣,稍微需要對算法也補(bǔ)一下
20190517 壹沓科技(爬蟲,大數(shù)據(jù)甸私,機(jī)器學(xué)習(xí))
一)問到項目內(nèi)相關(guān)技術(shù)選型的經(jīng)驗诚些,判斷標(biāo)準(zhǔn),并舉出具體例子
- 選型颠蕴,根據(jù)場景考慮需要用什么泣刹,然后對這個工具進(jìn)行初步的了解,學(xué)會它是怎么用的犀被,怎么樣可以解決目前的問題椅您,最后將其與其他類似或相同功能的東西進(jìn)行對比,判斷我為什么要用它寡键,同時也參考網(wǎng)絡(luò)上其他人的使用經(jīng)驗等掀泳,最后自己進(jìn)行參考,并且進(jìn)行實際的測試
- 例如說kafka西轩,我個人目前對它理解里比較看重的兩點(diǎn)是员舵,
- 它配合zk一起使用,可以對分區(qū)進(jìn)行靈活的擴(kuò)展藕畔,有助于提高吞吐量马僻,而且使用簡單;這一塊是對應(yīng)我們的業(yè)務(wù)場景之余也是考慮到我們公司的背景注服,我們那邊其實也是為了這塊的功能韭邓,第一次引入使用MQ措近,當(dāng)時考慮的是,選一款簡單易上手的MQ進(jìn)行使用女淑,甚至可能組內(nèi)別的功能會直接用我這邊搭建完成的現(xiàn)成的東西瞭郑,也想選一個對于分區(qū)上方便擴(kuò)展的東西來用,所以同時也是剛好我個人在學(xué)習(xí)kafka mq鸭你,我就自告奮勇的接下來了來做這個東西屈张;
- 關(guān)于第二點(diǎn)的話,我這邊了解到kafka對比其他的MQ袱巨,在實時性上的性能是比較遜色的阁谆,但是它有一個很好的特性就是它會使用到硬盤的log文件進(jìn)行一個消息的持久化,我們其實也是看重了這一點(diǎn)瓣窄,我們那邊是銀行機(jī)構(gòu)嘛笛厦,可能更傾向于使用容災(zāi)性強(qiáng)的,并且恢復(fù)簡單的工具俺夕,同時也想選用一個使用簡單方便培訓(xùn)的工具裳凸,后續(xù)擴(kuò)展,推廣可以開箱即用劝贸,kafka在這一點(diǎn)上也很符合我們的期望姨谷;
- 至于第三點(diǎn)就會比較簡單了,就是我個人在過程中也根據(jù)我們的業(yè)務(wù)場景去進(jìn)行了嘗試映九,當(dāng)時上游接口告訴我們說會有每秒5~7千梦湘,峰值可能會到達(dá)上萬的消息傳輸量,而我這邊進(jìn)行過自己的實測件甥,kafka哪怕是單分區(qū)情況下捌议,每秒鐘進(jìn)行2w的生產(chǎn)和消費(fèi)是完全沒有性能瓶頸的,這里已經(jīng)是達(dá)到了我們業(yè)務(wù)預(yù)測值的兩倍了引有,所以也會認(rèn)為它是符合我們的期望
就經(jīng)過上述幾點(diǎn)的考慮的話瓣颅,我們這邊引入了kafka作為我們對于MQ的第一次嘗試
20190521 拉卡拉(支付)
一)分布式架構(gòu)中該如何拆分微服務(wù)?可以按些什么標(biāo)準(zhǔn)譬正,有些什么方法論宫补?
當(dāng)時回答的是可以按業(yè)務(wù)拆分(這也是最常見的一種方式),至于如何確定拆分粒度曾我,當(dāng)時提出了一些《聊聊架構(gòu)》中的一些思想粉怕,包括核心生命周期與非核心生命周期。但因為這兩塊學(xué)得還不夠透徹抒巢,沒有形成足夠的知識積累贫贝,后面再深入學(xué)習(xí)架構(gòu)方面的知識。
二)還是問到了分布式事務(wù)的基礎(chǔ)蛉谜。同時問稚晚,如果一個分布式事務(wù)凤优,涉及到一個很長的調(diào)用鏈,而且橫跨多個模塊蜈彼,該如何設(shè)計它來盡量提高容錯率和正確率?直接設(shè)計一個可行的方案俺驶。
這里其實用不著什么2PC和TCC了幸逆,根本不實用,其實大型的分布式事務(wù)可以考慮使用異步MQ進(jìn)行調(diào)用鏈的合并暮现,最后用日終對賬/核算來處理異常情況还绘。
三)還是談到了中間件的選型,談到了kafka看中了它什么特性栖袋,回答說了前面提出過的回答拍顷,被追問,其他MQ也有持久化的策略塘幅,而且也有入門難度低且速度快的昔案,有沒有仔細(xì)對比過?
這一塊沒答出來电媳,后續(xù)考慮對技術(shù)選型方面的考慮和知識考慮更深點(diǎn)踏揣。