1. 怎么實(shí)現(xiàn)高可用的架構(gòu):
- 通信模型
NIO - 多活模式
- 減少組件依賴 (核心接口不強(qiáng)依賴非核心接口,需要有相應(yīng)預(yù)案策略,比如降級或者熔斷)
降低由于引入第三方依賴服務(wù)導(dǎo)致的服務(wù)不可用問題 - 去中心化
減少復(fù)雜性?選舉過程會導(dǎo)致STW权旷? - 容災(zāi)機(jī)制
主備、數(shù)據(jù)備份
2. 定時/延時任務(wù)
- 延遲任務(wù)實(shí)現(xiàn):
https://www.cnblogs.com/haoxinyue/p/6663720.html - Jesque 基礎(chǔ)入門
https://blog.csdn.net/xiaojia1100/article/details/48004337 - jesque代碼庫
https://github.com/gresrun/jesque - 聊聊jesque的WorkerImpl與WorkerPool
http://www.reibang.com/p/52a9fc801c16
3. vim命令總結(jié):
- gg跳到第一行
- shift+g跳到最后一行
- /xxx 匹配某一字符串
4. linux命令
- find 文件名(支持模糊匹配) |xargs grep -ri 指定字符 -l :查找指定字符在文件中是否有出現(xiàn),并且只返回滿足條件的文件的文件名
- awk '{print 2..}'妄田,用于文本分析,默認(rèn)空格驮捍、制表符為分隔符疟呐,1輸出第一個被分隔的字符串东且,以此類推$2...
5. arthas命令
每隔10s監(jiān)控調(diào)用情況(請求數(shù)等信息):
monitor -c 10 demo.MathGame primeFactors
打印調(diào)用堆棧信息:
trace demo.MathGame primeFactors
觀察方法入?yún)⒑头祷刂担?/strong>
watch demo.MathGame primeFactors {params,returnObj}
觀察方法入?yún)⒑头祷刂挡⑶抑付ǖ谝粋€參數(shù)的值:
watch com.demo.service.DemoService getUser "{params,returnObj}" "params[0].equals('demo')" -x 2
** java.的類不能被arthas代理启具,這個時候可以參考如下進(jìn)行解決:*
https://github.com/alibaba/arthas/issues/47
7. TCP三次握手和四次揮手?
- 為什么三次握手:保證延遲的消息會被正確的回收
- 為什么四次揮手:TCP連接的關(guān)閉是雙方都需要確認(rèn)的珊泳,另外一方面TIME_WAIT的作用:保證連接的正確關(guān)閉鲁冯,等待2MSL,如果在這個時間內(nèi)色查,被動關(guān)閉方?jīng)]有收到ACK報文的話薯演,會重新發(fā)送FIN報文
8. 什么是單元化,單元化的作用
每個單元可以獨(dú)立的負(fù)責(zé)用戶的請求秧了,能夠向其它單元同步數(shù)據(jù)的單元叫做中心
- 作用:異地多活跨扮,提高穩(wěn)定性,保證RPC的響應(yīng)效率
- 對該單元進(jìn)行切流+禁寫(保證數(shù)據(jù)的一致性验毡,因?yàn)橹行倪€沒有把數(shù)據(jù)同步過來) - 可以類比redis主從異步復(fù)制的場景
步驟可以分為:禁寫(禁止更新)衡创、切流、同步晶通、執(zhí)行(恢復(fù)寫)
9. 分布式事務(wù)
XA:兩階段提交之XA璃氢,prepare commit/rollback
TCC:try-precomit-commit
FMT:在XA和TCC之間找到平衡點(diǎn)(性能和耦合性),通過記錄日志狮辽,類似于undolog(但是如果數(shù)據(jù)被改了要如何恢復(fù)-依賴框架的事務(wù)一也,需要鎖定被修改的行,但是如果這行是熱點(diǎn)數(shù)據(jù)的話隘竭,會導(dǎo)致性能的下降)
XA存在的問題:事務(wù)協(xié)調(diào)器的單點(diǎn)故障塘秦、從第一階段就鎖定資源(數(shù)據(jù)庫鏈接,鎖等資源)影響性能
TCC存在的問題:需要自己實(shí)現(xiàn)大量的回滾代碼动看、在第一階段鎖定資源后就釋放資源了
10. mysql索引
- 大字段如何建立索引尊剔?
使用前綴索引,可以通過
select count(distinct 索引字段) / count() from 表名; 查詢索引的區(qū)分度菱皆,返回的值越大說明區(qū)分度越高
select count(distinct left(索引字段, 取多少個字段)) / count() from 表名;
當(dāng)兩者值大致相近時须误,說明區(qū)分度已經(jīng)接近了
為什么使用前綴索引挨稿?解決索引占用空間的問題
會有什么問題?不可以使用覆蓋索引了 - 對于身份證號碼這類字段京痢,前綴區(qū)分度不高奶甘,如何建立索引呢?
1)可以存儲倒序字段祭椰,建立倒序字段的前綴索引
2)通過建立hash字段臭家,但是為了精確匹配,在where條件還得加上hash前字段的等值比較
11. mysql優(yōu)化
- limit如何優(yōu)化
假設(shè)有如下表:
create table a (int id, int fr_id, varchar field, pk id, key fr_id)
先來看下面一句sql
select * from table_a order by fr_id limit 10000,100
上面這一段sql存在的問題:
雖讓fr_id有索引方淤,查詢時可以用到fr_id索引钉赁,但是由于查詢了所有字段會導(dǎo)致回表,并且隨機(jī)讀嚴(yán)重携茂,掃面更多的頁你踩,最終會使整體sql的執(zhí)行性能不佳
如何優(yōu)化呢?
使用延遲關(guān)聯(lián):第一步先利用覆蓋索引查詢id讳苦,再做關(guān)聯(lián)查詢
select * from table a inner join (select id from table_a order by fr_id limit 10000,100) as b on a.id = b.id
如何進(jìn)一步優(yōu)化带膜?
根據(jù)業(yè)務(wù)場景,如果不需要支持跳頁(即只支持翻頁鸳谜,解決深度分頁問題)膝藕,可以考慮用如下進(jìn)行優(yōu)化
第一次查詢
select * from fr_id > 0 order by fr_id limt 100
第二次查詢
假設(shè)第一次查詢的結(jié)果的最大fr_id為200,那么第二次查詢的如下
select * from fr_id > 200 order by fr_id limt 100
使用翻頁要考慮的問題時卿堂,字段一定要是單調(diào)自增的束莫,不然在翻頁的過程中會有漏數(shù)據(jù)
所以整體優(yōu)化思路為:
1懒棉、使用延遲關(guān)聯(lián)草描,解決兩個問題(1.使用覆蓋索引 2.避免隨機(jī)讀,提高性能)
2策严、根據(jù)業(yè)務(wù)場景穗慕,是否需要支持跳頁查詢?
12. jdk工具
jps:查看進(jìn)程
jstack pid:查看進(jìn)程堆棧
jstat -gc pid 3000[ms]:查看進(jìn)程gc情況妻导,每3s一次
jmap -heap pid:查看進(jìn)行的堆和堆占用情況
jmap -histo pid | head -n 10:查看排行前10占用最多的對象
13. 網(wǎng)絡(luò)
三次握手:(不是二次握手的原因:防止已經(jīng)失效的連接請求報文生效)
最后一次握手逛绵,避免如果是只有兩次握手時由于第一次握手由于網(wǎng)絡(luò)延遲的問題,導(dǎo)致后續(xù)服務(wù)端占用了無效連接資源
四次揮手:
在主動關(guān)閉方收到第三次揮手時發(fā)送ack后會進(jìn)入time_wait:維持2msl倔韭,即報文的最大持續(xù)時間
1)解決第三次揮手報文丟失(不是真正丟失的意思术浪,比方說滯留時間過長),服務(wù)端可以進(jìn)行重發(fā)
2)如果沒有time_wait的話寿酌,此時如果允許創(chuàng)建連接胰苏,可能會出現(xiàn)新創(chuàng)建的連接收到之前丟失的報文,導(dǎo)致后續(xù)程序處理出現(xiàn)異常
14. 線程池
池化管理的思想醇疼,提供的好處:
- 降低資源消耗
創(chuàng)建和銷毀帶來的開銷硕并,可以做到線程復(fù)用 - 提高響應(yīng)速度
請求到達(dá)時法焰,無需耗費(fèi)創(chuàng)建線程帶來的開銷 - 線程管理
統(tǒng)一管理,避免線程泛濫 - 提供高級功能
延遲任務(wù)倔毙、定時任務(wù)
15. 關(guān)于異常處理
16. 關(guān)于日志的正確使用
17. 數(shù)據(jù)遷移經(jīng)驗(yàn)
18. mvn:deploy
該命令用于將maven項目打包埃仪,并上傳自本地和遠(yuǎn)程的maven倉庫
release和snapshot的區(qū)別:
使用snapshot,假如遠(yuǎn)程倉庫發(fā)生變化了陕赃,依賴了snapshot的項目會從遠(yuǎn)程倉庫加載依賴
使用release卵蛉,假如某個版本號的依賴在遠(yuǎn)程倉庫發(fā)生變化了,依賴了該版本號的maven項目會優(yōu)先從本地倉庫加載依賴
19.G1回收器
CMS的缺點(diǎn):內(nèi)存碎片么库、對大堆回收不友好(需要掃描整個堆)毙玻、浮動垃圾
何時使用G1:
- 堆內(nèi)存大、多核CPU
- 期望停頓時間可預(yù)測廊散,避免停頓時間無法預(yù)估導(dǎo)致的服務(wù)雪崩
- 不期望有太多的內(nèi)存碎片
20桑滩、守護(hù)線程
守護(hù)線程的作用是為普通、非守護(hù)線程提供服務(wù)的允睹,比如GC線程运准。假如虛擬機(jī)運(yùn)行過程中,沒有非守護(hù)線程在執(zhí)行了缭受,那么虛擬機(jī)可以退出
使用守護(hù)線程胁澳,必須注意:
1、setDaemon(true)必須在調(diào)用start方法之前米者,否則會拋出異常
2韭畸、不要在守護(hù)線程中做業(yè)務(wù)邏輯操作,因?yàn)闊o法預(yù)測非守護(hù)線程執(zhí)行完畢之后蔓搞,守護(hù)線程是否已經(jīng)執(zhí)行完畢該做的任務(wù)
3胰丁、守護(hù)線程中創(chuàng)建的線程也屬于守護(hù)線程
21、線程和線程池的狀態(tài)
https://blog.csdn.net/qq_24384579/article/details/93199116
22喂分、git rebase 和 git merge
git rebase稱作變基锦庸,會以rebase的分支為基準(zhǔn),將當(dāng)前分支提交的記錄提交到rebase的分支的最后提交記錄之后
git rebase :帶來的影響:會篡改修改記錄蒲祈、無法確認(rèn)當(dāng)前分支是從哪個節(jié)點(diǎn)checkout出來的
git merge:歷史提交記錄都在甘萧,每次merge會生成一條新的提交記錄
23、idea中查看類梆掸、方法扬卷、屬性的調(diào)用鏈/引用鏈
https://blog.csdn.net/qq_37126357/article/details/101055230
24、性能優(yōu)化
如何找到可優(yōu)化點(diǎn):壓測酸钦、arthas
日志怪得、json.toJsonString, json.ParseObject、批量查詢、預(yù)熱(熱點(diǎn)代碼JIT即使編譯)
25汇恤、stream流優(yōu)化
https://blog.csdn.net/weixin_29088655/article/details/114935548
幾個概念:水平執(zhí)行庞钢、垂直執(zhí)行
26、內(nèi)存管理
Linux中Swap與Memory內(nèi)存區(qū)別
https://blog.csdn.net/xili2532/article/details/122875250