微博和知乎中的 feed 流是如何實現(xiàn)的?
http://www.reibang.com/p/1d8345c3404d
在瀏覽器地址欄輸入URL,按下回車后究竟發(fā)生了什么?
http://www.reibang.com/p/c5425486e90c
java實現(xiàn)在線文檔編輯
http://www.reibang.com/p/0163cda737ce
高并發(fā)設計方案二(秒殺架構(gòu))
http://www.reibang.com/p/37209226d04d
支付高并發(fā)
http://www.reibang.com/p/b5924730d5a9
高并發(fā)的架構(gòu)該如何設計,一張圖讓你徹底明白,俗語講的你肯定懂
http://www.reibang.com/p/11787c73be6d
緩存穿透滑黔,緩存擊穿,緩存雪崩解決方案分析
http://www.reibang.com/p/b29d06f16d2b
使用Mutex實現(xiàn)線程安全的鏈表功能
http://www.reibang.com/p/ac5bc209b463
應用服務器性能優(yōu)化
http://www.reibang.com/p/4a3257cac8af
每個程序員要注意的 9 種反模式
http://www.reibang.com/p/7e12152c5bfe
性能分析之-- JAVA Thread Dump 分析綜述
http://www.reibang.com/p/dc24f52e9832
三個實例演示 Java Thread Dump 日志分析
http://www.reibang.com/p/cd17d417342a
- 用一句話概括 Web 編程的特點
- Google是如何在一秒內(nèi)把搜索結(jié)果返回給用戶
- 哪種依賴注入方式你建議使用,構(gòu)造器注入略荡,還是 Setter方法注入
- 樹(二叉或其他)形成許多普通數(shù)據(jù)結(jié)構(gòu)的基礎庵佣。請描述一些這樣的數(shù)據(jù)結(jié)構(gòu)以及何時可以使用它們
- 線上系統(tǒng)突然變得異常緩慢,你如何查找問題
- 新浪微博是如何實現(xiàn)把微博推給訂閱者
- 簡要介紹下從瀏覽器輸入 URL 開始到獲取到請求界面之后 Java Web 應用中發(fā)生了什么
- 高并發(fā)下汛兜,如何做到安全的修改同一行數(shù)據(jù)
- 12306網(wǎng)站的訂票系統(tǒng)如何實現(xiàn)巴粪,如何保證不會票不被超賣
- 聊了下曾經(jīng)參與設計的服務器架構(gòu)
- 請思考一個方案,實現(xiàn)分布式環(huán)境下的 countDownLatch
- 請思考一個方案粥谬,設計一個可以控制緩存總體大小的自動適應的本地緩存
- 在你的職業(yè)生涯中验毡,算得上最困難的技術挑戰(zhàn)是什么
- 如何寫一篇設計文檔,目錄是什么
- 大寫的O是什么帝嗡?舉幾個例子
- 編程中自己都怎么考慮一些設計原則的晶通,比如開閉原則,以及在工作中的應用
- 解釋一下網(wǎng)絡應用的模式及其特點
- 設計一個在線文檔系統(tǒng)哟玷,文檔可以被編輯狮辽,如何防止多人同時對同一份文檔進行編輯更新
- 說出數(shù)據(jù)連接池的工作機制是什么
- 怎么獲取一個文件中單詞出現(xiàn)的最高頻率
- 描述一下你最常用的編程風格
- 如果有機會重新設計你們的產(chǎn)品,你會怎么做
- 如何搭建一個高可用系統(tǒng)
- 如何啟動時不需輸入用戶名與密碼
- 如何在基于Java的Web項目中實現(xiàn)文件上傳和下載
- 如何實現(xiàn)一個秒殺系統(tǒng)巢寡,保證只有幾位用戶能買到某件商品喉脖。
- 如何實現(xiàn)負載均衡,有哪些算法可以實現(xiàn)
- 如何設計一個購物車抑月?想想淘寶的購物車如何實現(xiàn)的
- 如何設計一套高并發(fā)支付方案树叽,架構(gòu)如何設計
- 如何設計建立和保持 100w 的長連接
- 如何避免瀏覽器緩存。
- 如何防止緩存雪崩
- 如果AB兩個系統(tǒng)互相依賴谦絮,如何解除依賴
- 如果有人惡意創(chuàng)建非法連接题诵,怎么解決
- 如果有幾十億的白名單,每天白天需要高并發(fā)查詢层皱,晚上需要更新一次性锭,如何設計這個功能
- 如果系統(tǒng)要使用超大整數(shù)(超過long長度范圍),請你設計一個數(shù)據(jù)結(jié)構(gòu)來存儲這種超大型數(shù)字以及設計一種算法來實現(xiàn)超大整數(shù)加法運算)
- 如果要設計一個圖形系統(tǒng)叫胖,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現(xiàn)
- 如果讓你實現(xiàn)一個并發(fā)安全的鏈表草冈,你會怎么做
- 應用服務器與WEB 服務器的區(qū)別?應用服務器怎么監(jiān)控性能瓮增,各種方式的區(qū)別怎棱?你使用過的應用服務器優(yōu)化技術有哪些
- 大型網(wǎng)站在架構(gòu)上應當考慮哪些問題
- 有沒有處理過線上問題?出現(xiàn)內(nèi)存泄露绷跑,CPU利用率標高拳恋,應用無響應時如何處理的
- 最近看什么書,印象最深刻的是什么
- 描述下常用的重構(gòu)技巧
- 你使用什么版本管理工具你踩?分支(Branch)與標簽(Tag)之間的區(qū)別在哪里
- 你有了解過存在哪些反模式(Anti-Patterns)嗎
- 你用過的網(wǎng)站前端優(yōu)化的技術有哪些
- 如何分析Thread dump
- 你如何理解AOP中的連接點(Joinpoint)诅岩、切點(Pointcut)讳苦、增強(Advice)、引介(Introduction)吩谦、織入(Weaving)鸳谜、切面(Aspect)這些概念
- 你是如何處理內(nèi)存泄露或者棧溢出問題的
- 你們線上應用的 JVM 參數(shù)有哪些
- 怎么提升系統(tǒng)的QPS和吞吐量
1. 用一句話概括 Web 編程的特點
由ASP,PHP式廷,JAVASCRIPT咐扭,JAVA,CGI等計算機腳本語言編寫出來的執(zhí)行靈活的互聯(lián)網(wǎng)網(wǎng)頁程序
2. Google是如何在一秒內(nèi)把搜索結(jié)果返回給用戶
1滑废、用戶發(fā)出搜索請求蝗肪。谷歌搜索質(zhì)量工程師 PatrickRiley 說:在大多數(shù)搜索中,你的搜索處于多個并行的控制過程或谷歌實驗室的創(chuàng)新項目組過程中蠕趁,可以說每一個查詢請求都會參與一些谷歌的創(chuàng)意實驗薛闪。我們都是小白鼠?
2、谷歌會對用戶輸入的關鍵詞提供一些建議俺陋。
3豁延、谷歌會用同義詞匹配與你的搜索關鍵詞語義相近的查詢結(jié)果。
4腊状、生成初步的查詢結(jié)果诱咏,雖然谷歌宣稱可以找到成千上萬的相關結(jié)果,但一般只顯示不到1000條缴挖,同時查詢結(jié)果將被進行本地化處理袋狞,本土站點在查詢結(jié)果中優(yōu)先出現(xiàn)。
搜索結(jié)果將如何被優(yōu)化?
1映屋、對查詢結(jié)果按權(quán)威性和 PageRank 進行排序苟鸯,重復的查詢結(jié)果被剔除。此時的查詢結(jié)果已接近最終形態(tài)秧荆,在這一基礎上倔毙,有兩個進程將分開進行–查詢結(jié)果優(yōu)化和為其匹配相應的廣告。我們先來看查詢結(jié)果優(yōu)化乙濒。
對查詢結(jié)果進行過濾處理
2、對查詢結(jié)果進行過濾處理卵蛉。包括以下幾點:
2.1颁股、對通常的查詢,谷歌會把相關的專題性垂直搜索結(jié)果(比如新聞傻丝、購物甘有、視頻、書籍葡缰、地圖等)也加到返回的查詢結(jié)果中亏掀。
2.2忱反、個性化,用戶訪問過的網(wǎng)站在查詢結(jié)果列表中會更靠上
2.3滤愕、大量使用錨點的網(wǎng)站有可能被從查詢結(jié)果中刪除
2.4温算、如果網(wǎng)頁被其他高 PageRank 的網(wǎng)站引用,則網(wǎng)頁的重要性會大大提高间影。
2.5注竿、趨勢分析:對搜索流量爆增或有大量新聞的搜索關鍵詞,谷歌會在新的查詢結(jié)果中增加額外的 PageRank 權(quán)值魂贬。
2.6巩割、同一個域名下的多個網(wǎng)頁如果具有相同的 PageRank 會被歸為一組。
2.7付燥、查詢結(jié)果最終形成(將與廣告一同顯示)
用戶所搜索的內(nèi)容如何與廣告相結(jié)合?
1宣谈、Google 根據(jù)關鍵詞、廣告類型键科、用戶所處位置找出相關的被競價拍賣的關鍵詞廣告
1.1闻丑、關鍵詞廣告必須遵守當?shù)胤蓷l文。廣告業(yè)主的非法廣告將被取締萝嘁,如果關鍵詞的搜索流量過低或關鍵詞廣告點擊量偏低梆掸,則會被自動禁用,出于商業(yè)策略牙言,像亞馬遜這樣的客戶會給予優(yōu)惠折扣酸钦。
1.2、關鍵詞相關廣告按收益潛力排序咱枉。
1.3卑硫、對廣告業(yè)主來說廣告內(nèi)容一般是固定的,但有時使用動態(tài)關鍵詞使關鍵詞廣告與搜索關鍵詞相關度更高蚕断。一些廣告允許增加附屬信息欢伏,比如網(wǎng)站鏈接、電話號碼亿乳、產(chǎn)品鏈接硝拧、地址等。
1.4葛假、如果廣告擁有相當高的點擊率障陶,則會顯示在搜索結(jié)果列表的上方,以使其更顯眼聊训。
1.5抱究、其余的廣告依序顯示在頁面右側(cè)
經(jīng)過上述一系列復雜的信息處理過程,最終返回給用戶的是一個個性化的带斑、具備地理位置特征的鼓寺、布局簡潔的查詢結(jié)果頁面勋拟,當然還精確匹配了廣告,所有這些步驟在總共不到1秒的時間內(nèi)完成妈候,每天3億次的點擊量給 Google 帶來了超過200億美元的年收入
3. 哪種依賴注入方式你建議使用敢靡,構(gòu)造器注入,還是 Setter方法注入
Setter
setter方法設定依賴關系顯得更加直觀州丹,更加自然醋安。
如果依賴關系(或繼承關系)較為復雜,那么構(gòu)造函數(shù)也會相當龐大(我們需要在構(gòu)造函數(shù)中設定所有依賴關系)
對于某些第三方類庫而言墓毒,可能要求我們的組件必須提供一個默認的構(gòu)造函數(shù)(如Struts中的Action)吓揪,此時構(gòu)造的依賴注入機制就體現(xiàn)出其局限性,難以完成我們期望的功能所计。
4. 樹(二叉或其他)形成許多普通數(shù)據(jù)結(jié)構(gòu)的基礎柠辞。請描述一些這樣的數(shù)據(jù)結(jié)構(gòu)以及何時可以使用它們
HashMap:java8改成數(shù)組+鏈表+紅黑樹的數(shù)據(jù)結(jié)構(gòu)
TreeMap實現(xiàn)SortedMap接口,底層紅黑樹數(shù)據(jù)結(jié)構(gòu)主胧,能夠把它保存的記錄根據(jù)鍵排序叭首,默認是按鍵值的升序排序,也可以指定排序的比較器
TreeSet:樹集踪栋,底層通過TreeMap實現(xiàn)焙格,有序非同步集合,用紅黑樹數(shù)據(jù)結(jié)構(gòu)夷都,每次添加到樹中時眷唉,都會添加到正確位置,迭代器可以按排好的順序訪問每個元素囤官,比散列表插入慢冬阳,查詢快
priority queue:優(yōu)先級隊列,可以任意順序插入党饮,但是按排序順序檢索肝陪,數(shù)據(jù)結(jié)構(gòu)用堆(heap)自我調(diào)整的二叉樹,add和remove操作會把最小的元素移動到根刑顺,非線程安全氯窍。
二叉樹:(遍歷按根節(jié)點遍歷順序分前中后)
前序遍歷:根節(jié)點->左子樹->右子樹
中序遍歷:左子樹->根節(jié)點->右子樹
后序遍歷:左子樹->右子樹->根節(jié)點
特點:排序二叉樹雖然可以快速檢索,但在最壞的情況下:如果插入的節(jié)點集本身就是有序的蹲堂,要么是由小到大排列荞驴,要么是由大到小排列,那么最后得到的排序二叉樹將變成鏈表:所有節(jié)點只有左節(jié)點(如果插入節(jié)點集本身是大到小排列)贯城;或所有節(jié)點只有右節(jié)點(如果插入節(jié)點集本身是小到大排列)。在這種情況下霹娄,排序二叉樹就變成了普通鏈表能犯,其檢索效率就會很差鲫骗。
紅黑樹,一種二叉查找樹踩晶,但在每個結(jié)點上增加一個存儲位表示結(jié)點的顏色执泰,可以是Red或Black。
通過對任何一條從根到葉子的路徑上各個結(jié)點著色方式的限制渡蜻,紅黑樹確保沒有一條路徑會比其他路徑長出倆倍术吝,因而是接近平衡的。
紅黑樹能夠以O(log2 n) 的時間復雜度進行搜索茸苇、插入排苍、刪除操作。此外学密,由于它的設計淘衙,任何不平衡都會在三次旋轉(zhuǎn)之內(nèi)解決。
5. 線上系統(tǒng)突然變得異常緩慢腻暮,你如何查找問題
- 首先就是想看日志彤守,后來想想看日志確實不太可行,并發(fā)量太大的情況下哭靖,查日志會很慢具垫,(看日志,pstack strace gdb)试幽。
- 應該從上到下看筝蚕。----網(wǎng)絡,系統(tǒng)抡草,應用饰及。任何一個環(huán)節(jié)都有可能有問題,首先看網(wǎng)絡監(jiān)控情況,然后看系統(tǒng)(內(nèi)存康震,cpu,負載 )情況燎含。
- 把線程dump出來,用jstack dump 線程調(diào)用鏈腿短,看線程卡到哪里了屏箍。然后定位代碼,看看賭在哪個函數(shù)橘忱,是不是調(diào)用了重函數(shù)赴魁。當然先定位到具體應用,再dump钝诚。
- 看接口故障率颖御,然后看數(shù)據(jù)庫有沒有鎖。
- 先看日志凝颇,排除了磁盤滿了潘拱,網(wǎng)絡慢疹鳄,然后看進程,具體到當時幾個線程芦岂,堵在哪兒瘪弓。
- 分布式服務一般都是服務治理的,可以看整個調(diào)用鏈的時間圖禽最。
- 看監(jiān)控腺怯,監(jiān)控只是能找到問題 但是不能找到問題原因渣触,什么請求溉箕、返回、錯誤惊畏、慢速舀透,這些都是要監(jiān)控的栓票,告警也要配置好,有問題第一時間知道愕够。
- 假如是網(wǎng)絡問題那就找臨近的防火墻看對應服務器的并發(fā)連接數(shù)是否新建連接/半開連接超高走贪,或者有突發(fā)流量擠占了資源。同時查對應服務器的磁盤I/O情況和對應那個應用的進程內(nèi)存占用曲線是否有突發(fā)惑芭。高并發(fā)應用我理解上日志肯定是沒法去看的坠狡,因為日志量太巨大了。
- 集群或多主機的系統(tǒng)遂跟,需要根據(jù)監(jiān)控 看各個主機的CPU 內(nèi)存 接口IO等逃沿,這些能分析一些,如果能得出具體的主機 再分析哪個應用的CPU 內(nèi)存 異常dump 等幻锁。如果涉及到接口機 可以看接口的失敗率凯亮,應用的話需要排查log了,有時候主機空間不足 內(nèi)存不足哄尔、硬件故障也會導致問題假消。
- 例子:在銀行做安全運維時候,那幫服務器的和網(wǎng)銀的一天到晚就說這是網(wǎng)絡問題岭接,這絕對網(wǎng)絡癱了富拗。。然后查一圈發(fā)現(xiàn)他們一個什么java的問題鸣戴,說是有個印度小哥把java runtime裝了最高版本啃沪。但是系統(tǒng)不支持,必須重新裝回低版本窄锅,就好了创千。
- 如果是分布式部署多臺機器,別的機器沒問題,但這臺機器有問題签餐。那么更有可能是因為網(wǎng)絡或者磁盤導致的寓涨,一般這些資源都有zabbix這樣的監(jiān)控÷乳埽看日志是肯定要的。
- 如果這些機器都是虛擬機的話也有可能是控制器系統(tǒng)的問題体捏。
- 擴展:
阿里冠摄,負載均衡和流量清洗系統(tǒng)強大,每年網(wǎng)購高峰期和那幾個“節(jié)”一過0點的突發(fā)流量几缭,很考驗負載均衡系統(tǒng)的部署策略河泳。高峰限流是關鍵,不能沖垮系統(tǒng)年栓,但高峰一限流拆挥。。購物車就無法結(jié)賬了某抓。(異步結(jié)帳)
京東纸兔,雙12 的時候。負載均衡也會出問題否副。有時候汉矿,負載不均衡的情況出現(xiàn),有針對應用的限流和熔斷的备禀,也有針對URL的限流和熔斷機制洲拇。
另外:DDOS攻擊、負載均衡算法沒設計好曲尸、CDN赋续、DNS等都有可能
6. 新浪微博是如何實現(xiàn)把微博推給訂閱者
這個鏈接寫的很詳細,就不復制在這里了:
微博和知乎中的 feed 流是如何實現(xiàn)的另患?
http://www.reibang.com/p/1d8345c3404d
7. 簡要介紹下從瀏覽器輸入 URL 開始到獲取到請求界面之后 Java Web 應用中發(fā)生了什么
- 首先嘛纽乱,你得在瀏覽器里輸入要網(wǎng)址:
- 瀏覽器查找域名的IP地址
- 瀏覽器給web服務器發(fā)送一個HTTP請求
- 服務的永久重定向響應
- 瀏覽器跟蹤重定向地址
- 服務器“處理”請求
- 服務器發(fā)回一個HTML響應
- 瀏覽器開始顯示HTML
- 瀏覽器發(fā)送獲取嵌入在HTML中的對象
- 瀏覽器發(fā)送異步(AJAX)請求
8. 高并發(fā)下,如何做到安全的修改同一行數(shù)據(jù)
- 將庫存字段number字段設為unsigned柴淘,當庫存為0時迫淹,因為字段不能為負數(shù),將會返回false
- 悲觀鎖
- 使用MySQL的事務为严,鎖住操作的行
- FIFO隊列思路
- 使用非阻塞的文件排他鎖
- 樂觀鎖敛熬,采用帶版本號(Version)更新
9. 12306網(wǎng)站的訂票系統(tǒng)如何實現(xiàn),如何保證不會票不被超賣
- 一個是java的對象鎖第股,用于線程同步应民;
- 另外一個是數(shù)據(jù)庫的鎖;這里只能用數(shù)據(jù)庫端的鎖來實現(xiàn)。
采用樂觀鎖即可解決此問題诲锹。樂觀鎖意思是不鎖定表的情況下繁仁,利用業(yè)務的控制來解決并發(fā)問題,這樣即保證數(shù)據(jù)的并發(fā)可讀性又保證保存數(shù)據(jù)的排他性归园,保證性能的同時解決了并發(fā)帶來的臟數(shù)據(jù)問題黄虱。
可以使用版本號實現(xiàn)樂觀鎖。
10. 聊了下曾經(jīng)參與設計的服務器架構(gòu)
略
電商系統(tǒng)架構(gòu)庸诱,Saas多租戶系統(tǒng)架構(gòu)捻浦,企業(yè)信息系統(tǒng)架構(gòu)(EIP)
11. 請思考一個方案,實現(xiàn)分布式環(huán)境下的 countDownLatch
CountDownLatch是一個同步的輔助類桥爽,它可以允許一個或多個線程等待朱灿,直到一組在其它線程中的操作執(zhí)行完成。
一個CountDownLatch會通過一個給定的count數(shù)來被初始化钠四。其中await()方法會一直阻塞盗扒,直到當前的count被減到0,而這個過程是通過調(diào)用countDown()方法來實現(xiàn)的缀去。在await()方法不再阻塞以后侣灶,所有等待的線程都會被釋放,并且任何await()的子調(diào)用都會立刻返回朵耕。
使用zookeeper實現(xiàn)分布式共享鎖炫隶,使用緩存實現(xiàn)countDownLatch
12. 請思考一個方案,設計一個可以控制緩存總體大小的自動適應的本地緩存
13. 在你的職業(yè)生涯中阎曹,算得上最困難的技術挑戰(zhàn)是什么
Spring系統(tǒng)底層的運行邏輯伪阶。
JVM的底層
系統(tǒng)的安全
14. 如何寫一篇設計文檔,目錄是什么
- 引言
1.1 編寫目的
1.2 背景
1.3 定義
1.4 參考資料 - 程序系統(tǒng)的結(jié)構(gòu)
- 程序設計說明
3.1 程序描述
3.2 功能
3.3 性能
3.4 輸入項
3.5 輸出項
3.6 算法
15. 大寫的O是什么处嫌?舉幾個例子
大寫的O描述的是栅贴,就數(shù)據(jù)結(jié)構(gòu)中的一系列元素而言,一個算法的性能熏迹。Collection類就是實際的數(shù)據(jù)結(jié)構(gòu)檐薯,我們通常基于時間注暗、內(nèi)存和性能坛缕,使用大寫的O來選擇集合實現(xiàn)。比如:
例子1:ArrayList的get(index i)是一個常量時間操作捆昏,它不依賴list中元素的數(shù)量赚楚。所以它的性能是O(1)。
例子2:一個對于數(shù)組或列表的線性搜索的性能是O(n)骗卜,因為我們需要遍歷所有的元素來查找需要的元素宠页。
16. 編程中自己都怎么考慮一些設計原則的左胞,比如開閉原則,以及在工作中的應用
參考鏈接
對擴展開放举户、對修改關閉
策略模式烤宙、簡單工廠、工廠方法俭嘁、抽象工廠躺枕、建造者模式、橋梁模式兄淫、外觀模式屯远、中介模式、迭代模式
- 抽象約束
第一捕虽,通過接口或者抽象類約束擴展,對擴展進行邊界限定坡脐,不允許出現(xiàn)在接口或抽象類中不存在的public方法泄私;
第二,參數(shù)類型备闲、引用對象盡量使用接口或者抽象類晌端,而不是實現(xiàn)類;
第三恬砂,抽象層盡量保持穩(wěn)定咧纠,一旦確定即不允許修改。 - 元數(shù)據(jù)(metadata)控制模塊行為
元數(shù)據(jù)就是用來描述環(huán)境和數(shù)據(jù)的數(shù)據(jù)泻骤,通俗地說就是配置參數(shù)漆羔,參數(shù)可以從文件中獲得,也可以從數(shù)據(jù)庫中獲得狱掂。
Spring容器就是一個典型的元數(shù)據(jù)控制模塊行為的例子演痒,其中達到極致的就是控制反轉(zhuǎn)(Inversion of Control) - 制定項目章程
在一個團隊中,建立項目章程是非常重要的趋惨,因為章程中指定了所有人員都必須遵守的約定鸟顺,對項目來說,約定優(yōu)于配置器虾。 - 封裝變化
對變化的封裝包含兩層含義:
第一讯嫂,將相同的變化封裝到一個接口或者抽象類中;
第二兆沙,將不同的變化封裝到不同的接口或抽象類中欧芽,不應該有兩個不同的變化出現(xiàn)在同一個接口或抽象類中。
17. 解釋一下網(wǎng)絡應用的模式及其特點
典型的網(wǎng)絡應用模式大致有三類:B/S挤悉、C/S渐裸、P2P巫湘。其中B代表瀏覽器(Browser)、C代表客戶端(Client)昏鹃、S代表服務器(Server)尚氛,P2P是對等模式,不區(qū)分客戶端和服務器洞渤。
B/S應用模式中可以視為特殊的C/S應用模式阅嘶,只是將C/S應用模式中的特殊的客戶端換成了瀏覽器,因為幾乎所有的系統(tǒng)上都有瀏覽器载迄,那么只要打開瀏覽器就可以使用應用讯柔,沒有安裝、配置护昧、升級客戶端所帶來的各種開銷魂迄。
P2P應用模式中,成千上萬臺彼此連接的計算機都處于對等的地位惋耙,整個網(wǎng)絡一般來說不依賴專用的集中服務器捣炬。網(wǎng)絡中的每一臺計算機既能充當網(wǎng)絡服務的請求者,又對其它計算機的請求作出響應绽榛,提供資源和服務湿酸。
通常這些資源和服務包括:信息的共享和交換、計算資源(如CPU的共享)灭美、存儲共享(如緩存和磁盤空間的使用)等推溃,這種應用模式最大的阻力是安全性、版本等問題届腐。
目前有很多應用都混合使用了多種應用模型铁坎,最常見的網(wǎng)絡視頻應用,它幾乎把三種模式都用上了梯捕。
補充:此題要跟"電子商務模式"區(qū)分開厢呵,因為有很多人被問到這個問題的時候馬上想到的是B2B(如阿里巴巴)、B2C(如當當傀顾、亞馬遜襟铭、京東)、C2C(如淘寶短曾、拍拍)寒砖、C2B(如威客)、O2O(如美團嫉拐、餓了么)哩都。
18. 設計一個在線文檔系統(tǒng),文檔可以被編輯婉徘,如何防止多人同時對同一份文檔進行編輯更新
java實現(xiàn)在線文檔編輯
剩下的就是鎖的問題了漠嵌。
http://www.reibang.com/p/0163cda737ce
19. 說出數(shù)據(jù)連接池的工作機制是什么
數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中咐汞,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設定的。無論這些數(shù)據(jù)庫連接是否被使用儒鹿,連接池都將一直保證至少擁有這么多的連接數(shù)量化撕。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當應用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時约炎,這些請求將被加入到等待隊列中植阴。
數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設置要考慮到下列幾個因素:
- 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應用程序?qū)?shù)據(jù)庫連接的使用量不大圾浅,將會有大量的數(shù)據(jù)庫連接資源被浪費掠手;
- 最大連接數(shù)是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過此數(shù)狸捕,后面的數(shù)據(jù)庫連接請求將被加入到等待隊列中喷鸽,這會影響之后的數(shù)據(jù)庫操作。
- 如果最小連接數(shù)與最大連接數(shù)相差太大灸拍,那么最先的連接請求將會獲利魁衙,之后超過最小連接數(shù)量的連接請求等價于建立一個新的數(shù)據(jù)庫連接。不過株搔,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時后被釋放纯蛾。
20. 怎么獲取一個文件中單詞出現(xiàn)的最高頻率
Linux命令參考鏈接
使用linux命令或者shell實現(xiàn):文件words存放英文單詞纤房,格式為每行一個英文單詞(單詞可以重復),統(tǒng)計這個文件中出現(xiàn)次數(shù)最多的前10個單詞翻诉。
cat words.txt | sort | uniq -c | sort -k1,1nr | head -10
Java算法的思路是:
- 從頭到尾遍歷文件炮姨,從文件中讀取遍歷到的每一個單詞。
- 把遍歷到的單詞放到hashmap中碰煌,并統(tǒng)計這個單詞出現(xiàn)的次數(shù)舒岸。
- 獲取最高頻率算法:
(1)遍歷hashmap,將遍歷到的單詞的出現(xiàn)次數(shù)放到優(yōu)先級隊列中芦圾。當優(yōu)先級隊列的元素個數(shù)超過k個時就把元素級別最低的那個元素從隊列中取出蛾派,這樣始終保持隊列的元素是k個。遍歷完hashmap个少,則隊列中就剩下了出現(xiàn)次數(shù)最多的那k個元素洪乍。
(2)最簡單的方法,冒泡或選擇排序夜焦,求出最大的k個元素壳澳,時間復雜度在O(kn);
(3)基于快排的選擇排序,在隨機化的情況下茫经,時間復雜度在O(n)巷波;
(4)局部淘汰法1萎津,取前k個元素,建立一個數(shù)組抹镊,然后遍歷所有元素锉屈,依次與數(shù)組中最小的元素比較,若大于髓考,則替換部念。這種方法時間復雜度為O(kn);
(5)局部淘汰法2,取前k個元素氨菇,維護一個小根堆儡炼,遍歷所有元素,依次與堆頂元素進行比較查蓉,若大于乌询,則替換并重新使其為小根堆,這種方法的時間復雜度為O(nlgk)
21. 描述一下你最常用的編程風格
22. 如果有機會重新設計你們的產(chǎn)品豌研,你會怎么做
略妹田,平時可以多想想
23. 如何搭建一個高可用系統(tǒng)
- 主備/集群模式,防止單點
- 限流鹃共,削峰鬼佣,防止后端壓力過大
- 熔斷機制,類似與限流
- 容災機制霜浴,多機房/異地部署
減少單點 – 去單點首先要識別整個系統(tǒng)所有主鏈路的單點晶衷,如機房(同城異地雙機房),應用服務器阴孟,DNS服務器晌纫,SFTP服務器,LBS永丝,緩存服務器锹漱,數(shù)據(jù)庫,消息服務器慕嚷,代理服務器和專線等哥牍,如系統(tǒng)通過專線調(diào)用對方服務,需要考慮同時拉聯(lián)通和電信的專線闯冷,聯(lián)通或電信的專線還是有一定概率會出現(xiàn)問題的砂心,但是同時出問題的概率會小非常多。優(yōu)先使用軟負載蛇耀,使用硬負載兜底辩诞。
減少依賴 – 減少DNS依賴,減少遠程服務依賴纺涤,DNS依賴可以嘗試設置本地host译暂,用工具給所有服務器推送最新的域名映射關系抠忘,通過本地緩存或近端服務減少RPC調(diào)用。
限制循環(huán) – 避免無限死循環(huán)外永,導致CPU利用率百分百崎脉,可以設置for循環(huán)的最大循環(huán)次數(shù),如最大循環(huán)1000次伯顶。
控制流量 – 避免異常流量對應用服務器產(chǎn)生影響囚灼,可以對指定服務設置流量限制,如QPS祭衩,TPS灶体,QPH(每小時總請求量)和QPD(每天總請求量)。
精準監(jiān)控 – 對CPU利用率掐暮,load蝎抽,內(nèi)存,帶寬路克,系統(tǒng)調(diào)用量化漆,應用錯誤量核行,PV枚抵,UV和業(yè)務量進行監(jiān)控柜候,避免內(nèi)存泄露和異常代碼對系統(tǒng)產(chǎn)生影響,配置監(jiān)控一定要精準灰羽,如平時內(nèi)存利用率是50%刁笙,監(jiān)控可以配置成60%進行報警,這樣可以提前感知內(nèi)存泄露問題谦趣,避免應用無響應。
無狀態(tài) – 服務器不能保存用戶狀態(tài)數(shù)據(jù)座每,如在集群環(huán)境下不能用static變量保存用戶數(shù)據(jù)前鹅,不能長時間把用戶文件存放在服務器本地。服務器有狀態(tài)會難以擴容峭梳,且出現(xiàn)單點問題舰绘。
容量規(guī)劃 – 定期對容量進行評估。如大促前進行壓測和容量預估葱椭,根據(jù)需要進行擴容捂寿。
功能開關 – 打開和關閉某些功能,比如消息量過大孵运,系統(tǒng)處理不了秦陋,把開關打開后直接丟棄消息不處理。上線新功能增加開關治笨,如果有問題關閉新功能驳概。
設置超時 – 設置連接超時和讀超時設置赤嚼,不應該太大,如果是內(nèi)部調(diào)用連接超時可以設置成1秒顺又,讀超時3秒更卒,外部系統(tǒng)調(diào)用連接超時可以設置成3秒,讀超時設置成20秒稚照。
重試策略 – 當調(diào)用外部服務異常時可以設置重試策略蹂空,每次重試時間遞增,但是需要設置最大重試次數(shù)和重試開關果录,避免對下游系統(tǒng)產(chǎn)生影響上枕。
隔離 – 應用隔離,模塊隔離雕憔,機房隔離和線程池隔離姿骏。可以按照優(yōu)先級斤彼,不變和變幾個維度來隔離應用和模塊分瘦,如抽象和不變的代碼放在一個模塊,這個模塊的代碼幾乎不會修改嘲玫,可用性高,經(jīng)常變的業(yè)務邏輯放在一個模塊里并扇,這樣就算有問題去团,也只會影響到某一個業(yè)務。不同的業(yè)務使用不同的線程池穷蛹,避免低優(yōu)先級任務阻塞高優(yōu)先級土陪,或高優(yōu)先級任務過多時影響低優(yōu)先級任務永遠不會執(zhí)行。
異步調(diào)用 – 同步調(diào)用改成異步調(diào)用肴熏,解決遠程調(diào)用故障或調(diào)用超時對系統(tǒng)的影響鬼雀。
熱點緩存 – 對熱點數(shù)據(jù)進行緩存,降低RPC調(diào)用蛙吏。如B系統(tǒng)提供名單服務源哩,B系統(tǒng)可以提供一個client SDK提供近端緩存服務,定期去服務器端取數(shù)據(jù)鸦做,減少RPC調(diào)用励烦。
緩存容災 – 當數(shù)據(jù)庫不可用時可以使用緩存的數(shù)據(jù)。并設置分級緩存泼诱,如優(yōu)先讀本地緩存坛掠,其次讀分布式緩存。
分級緩存 – 優(yōu)先讀本地緩存,其次讀分布式緩存却音。通過推模式更新本地緩存改抡。
系統(tǒng)分級 – 對系統(tǒng)進行分級,如ABC三個等級系瓢,高級別系統(tǒng)不依賴于低級別系統(tǒng)阿纤,并且高級別系統(tǒng)比底級別系統(tǒng)高可用率要高。
服務降級 – 如果系統(tǒng)出現(xiàn)響應緩慢等狀況夷陋,可以關閉部分功能欠拾,從而釋放系統(tǒng)資源,保證核心服務的正常運行骗绕。需要識別哪些服務可以降級藐窄,比如突然有大量消息流入,導致服務不可用酬土,我們會把消息直接丟棄掉荆忍。或通過設置流控撤缴,拒絕為低級別系統(tǒng)提供服務刹枉。
流量蓄洪 – 當流量陡增時,可以將請求進行蓄洪屈呕,如把請求保存在數(shù)據(jù)庫中微宝,再按照指定的QPS進行泄洪,有效的保護下游系統(tǒng)虎眨,也保證了服務的可用性蟋软。當調(diào)用對方系統(tǒng),對方系統(tǒng)響應緩慢或無響應時嗽桩,可采取自動蓄洪岳守。
服務權(quán)重 – 在集群環(huán)境中,可自動識別高性能服務碌冶,拒絕調(diào)用性能低的服務棺耍。如在集群環(huán)境中,對調(diào)用超時的服務器進行權(quán)重降低种樱,優(yōu)先調(diào)用權(quán)重高的服務器。
依賴簡化 – 減少系統(tǒng)之間的依賴俊卤,比如使用消息驅(qū)動嫩挤,A和B系統(tǒng)通過消息服務器傳遞數(shù)據(jù),A和B系統(tǒng)使用數(shù)據(jù)庫進行讀寫分離消恍,A系統(tǒng)負責往數(shù)據(jù)庫中寫數(shù)據(jù)岂昭,B系統(tǒng)負責讀數(shù)據(jù),因為數(shù)據(jù)存放在數(shù)據(jù)庫中狠怨,當A不可用時约啊,短時間內(nèi)不影響B(tài)系統(tǒng)提供服務邑遏。
彈性擴容 – 根據(jù)資源的使用率自動或手動進行擴容。如帶寬不夠用時恰矩,快速增加帶寬记盒。
灰度和回滾 – 發(fā)布新功能只讓部分服務器生效,且觀察幾天逐漸切流外傅,如果出現(xiàn)問題只影響部分客戶纪吮。出現(xiàn)問題快速回滾,或者直接下線灰度的機器萎胰。
減少遠程調(diào)用 – 優(yōu)先調(diào)用本地JVM內(nèi)服務碾盟,其次是同機房服務,然后是同城服務技竟,最后是跨城服務冰肴。如A調(diào)用B,B調(diào)用互聯(lián)網(wǎng)的C系統(tǒng)獲取數(shù)據(jù)榔组,B系統(tǒng)可以把數(shù)據(jù)緩存起來熙尉,并設置數(shù)據(jù)的保鮮度,減少B對C的依賴瓷患。配置中心把注冊服務的地址推送到調(diào)用服務的系統(tǒng)本地骡尽。參數(shù)中心把參數(shù)配置信息推送到系統(tǒng)的本地內(nèi)存,而不是讓系統(tǒng)去遠程服務器獲取參數(shù)信息擅编。
熔斷機制 – 增加熔斷機制攀细,當監(jiān)控出線上數(shù)據(jù)出現(xiàn)大幅跌漲時,及時中斷爱态,避免對業(yè)務產(chǎn)生更大影響谭贪。如我們做指標計算時,指標可以計算慢锦担,但是不能算錯俭识,如果發(fā)現(xiàn)某個用戶的指標環(huán)比或同比增長一倍或跌零,會考慮保存所有消息洞渔,并中止該用戶的指標計算套媚。
運行時加載模塊 – 我們會把經(jīng)常變的業(yè)務代碼變成一個個業(yè)務模塊,使用Java的ClassLoader在運行時動態(tài)加載和卸載模塊磁椒,當某個模塊有問題時候堤瘤,可以快速修復。
代碼掃描 – 使用IDEA代碼分析等工具進行代碼掃描浆熔,識別出程序中的BUG本辐,如空指針異常,循環(huán)依賴等。
自動備份 – 程序慎皱,系統(tǒng)配置和數(shù)據(jù)定期進行備份老虫。可使用linux命令和shell腳本定時執(zhí)行備份策略茫多,自動進行本地或異地祈匙。出現(xiàn)問題時能快速重新部署。
線上壓測 – 系統(tǒng)的對外服務需要進行壓測地梨,知道該服務能承受的QPS和TPS菊卷,從而做出相對準確的限流。
24. 如何啟動時不需輸入用戶名與密碼
(weblogic)修改服務啟動文件宝剖,增加 WLS_USER和WLS_PW項洁闰。也可以在boot.properties文件中增加加密過的用戶名和密碼.
25. 如何在基于Java的Web項目中實現(xiàn)文件上傳和下載
在Sevlet3以前,Servlet API中沒有支持上傳功能的API万细,因此要實現(xiàn)上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的文件扑眉,我們推薦使用Apache的commons-fileupload。
Sevlet3之后增加了Multipart支持可以直接實現(xiàn)文件的上傳和下載
26. 如何實現(xiàn)一個秒殺系統(tǒng)赖钞,保證只有幾位用戶能買到某件商品腰素。
設計這個系統(tǒng)是一個考慮全面的問題,可以發(fā)散出很多問題雪营,考察很多方面弓千,不是僅僅回答通過redis的自減操作完成
比如簡單的方案:
- 頁面開啟倒計時,要保證不能把下單接口暴露過早暴露出來献起,防止機器刷下單接口
- 前端限流洋访,比如nginx對下單接口限流,命中限流則返回302到秒殺頁
- 后端單獨部署谴餐,獨立域名和nginx姻政,與線上正常運行的系統(tǒng)隔離開來,避免影響到線上環(huán)境
- 由于生成訂單操作比較耗時岂嗓,采用隊列的方式來解耦下單成功和生成訂單汁展,針對進入后端的請求,采用redis自減厌殉,針對自減結(jié)果>0的請求則認為下單成功食绿,觸發(fā)一個生成訂單的消息,然后立即返回給用戶結(jié)果
- 用戶方面公罕,針對秒殺成功有兩種處理方式
a. 用戶端收到秒殺成功的結(jié)果器紧,則開啟提示頁面,并進入倒計時熏兄,倒計時時間為訂單生成的預估時間
b. 秒殺成功后,給當前用戶在redis中生成一個訂單生成狀態(tài)的標識,用戶端開啟提示頁面摩桶,loading桥状,并輪詢后端訂單生成狀態(tài),生成成功之后讓前端跳轉(zhuǎn)到訂單頁面 - 訂單服務訂閱下單系統(tǒng)發(fā)送的消息硝清,并開始生成訂單辅斟,生成訂單成功之后更新redis中用戶秒殺訂單的狀態(tài)為已生成訂單
系統(tǒng)應該有頁面和接口,頁面用于展示用戶界面芦拿,接口用于獲取數(shù)據(jù)
界面:秒殺頁面士飒,秒殺成功頁面,秒殺失敗頁面蔗崎,命中限流頁面(查看訂單頁面不算秒殺系統(tǒng)的功能)
接口:秒殺下單接口酵幕,秒殺成功獲取訂單生成狀態(tài)接口
http://www.reibang.com/p/37209226d04d
27. 如何實現(xiàn)負載均衡,有哪些算法可以實現(xiàn)
- 輪詢法
將請求按順序輪流地分配到后端服務器上缓苛,它均衡地對待后端的每一臺服務器芳撒,而不關心服務器實際的連接數(shù)和當前的系統(tǒng)負載。 - 隨機法
通過系統(tǒng)的隨機算法未桥,根據(jù)后端服務器的列表大小值來隨機選取其中的一臺服務器進行訪問笔刹。由概率統(tǒng)計理論可以得知,隨著客戶端調(diào)用服務端的次數(shù)增多冬耿,其實際效果越來越接近于平均分配調(diào)用量到后端的每一臺服務器舌菜,也就是輪詢的結(jié)果。 - 源地址哈希法
源地址哈希的思想是根據(jù)獲取客戶端的IP地址亦镶,通過哈希函數(shù)計算得到的一個數(shù)值日月,用該數(shù)值對服務器列表的大小進行取模運算,得到的結(jié)果便是客服端要訪問服務器的序號染乌。采用源地址哈希法進行負載均衡山孔,同一IP地址的客戶端,當后端服務器列表不變時荷憋,它每次都會映射到同一臺后端服務器進行訪問台颠。 - 加權(quán)輪詢法
不同的后端服務器可能機器的配置和當前系統(tǒng)的負載并不相同,因此它們的抗壓能力也不相同勒庄。給配置高串前、負載低的機器配置更高的權(quán)重,讓其處理更多的請实蔽;而配置低荡碾、負載高的機器,給其分配較低的權(quán)重局装,降低其系統(tǒng)負載坛吁,加權(quán)輪詢能很好地處理這一問題劳殖,并將請求順序且按照權(quán)重分配到后端。 - 加權(quán)隨機法
與加權(quán)輪詢法一樣拨脉,加權(quán)隨機法也根據(jù)后端機器的配置哆姻,系統(tǒng)的負載分配不同的權(quán)重。不同的是玫膀,它是按照權(quán)重隨機請求后端服務器矛缨,而非順序。 - 最小連接數(shù)法
最小連接數(shù)算法比較靈活和智能帖旨,由于后端服務器的配置不盡相同箕昭,對于請求的處理有快有慢,它是根據(jù)后端服務器當前的連接情況解阅,動態(tài)地選取其中當前積壓連接數(shù)最少的一臺服務器來處理當前的請求落竹,盡可能地提高后端服務的利用效率,將負責合理地分流到每一臺服務器瓮钥。
28.如何設計一個購物車筋量?想想淘寶的購物車如何實現(xiàn)的
購物車流程設計:
- 淘寶:
購物車操作規(guī)則:未登錄無法加入購物車并且無法進入購物車頁面,登陸后添加到購物車的商品在退出登錄又重新登錄之后還存在碉熄,
購物車操作屬于純接口操作桨武。
流程:列表–詳情–加入購物車–選擇–結(jié)算–確認訂單–提交訂單彈出支付寶付款界面 - 京東:
購物車操作規(guī)則:分為手機購物車和服務端購物車:
未登錄狀態(tài)下添加到購物車的商品,可以在購物頁面顯示锈津,在登陸之后會同步到服務端呀酸,同步成功之后就會清空本地購物車數(shù)據(jù)
流程:列表–詳情–加入購物車–選擇–去結(jié)算–填寫訂單–提交訂單彈出支付頁面–不付款選擇離開支付頁面進入訂單列表頁面
購買流程設計:
- 淘寶:
列表–詳情–立即購買–確認訂單–提交訂單彈出支付寶付款界面–不付款就進入訂單詳情(詳情頁有付款按鈕,此訂單目前為待付款狀態(tài))
–付款成功進入到支付成功頁面–查看訂單–訂單詳情頁面
(購買可以走“立即購買”也可以走“加入購物車”琼梆,生成訂單的商品就從購物車中自動刪除) - 京東:
列表–詳情–加入購物車–購物車–去結(jié)算–填寫訂單–提交訂單彈出支付頁面–付款成功進入到微信支付成功頁面–返回京東到訂單支付成功頁面–查看訂單–訂單列表頁
(只有“購物車”一種購買流程性誉,不可以直接購買)
總結(jié):簡單點就用純接口不做本地保存,復雜點就沒登錄時候存本地茎杂,登陸之后做同步并且清空本地數(shù)據(jù)
29. 如何設計一套高并發(fā)支付方案错览,架構(gòu)如何設計
庫分表:以uid為鍵,使用中間件進行分庫分表
訂單ID:時間戳+機器號+自增序列煌往,推薦Twitter的Snowflake倾哺,可以把分庫分表信息放在訂單前
數(shù)據(jù)異構(gòu):按業(yè)務bid異構(gòu)數(shù)據(jù)
讀寫分離、數(shù)據(jù)分離刽脖,緩存等
其余可參考26
(1) 客戶端層:調(diào)用方是瀏覽器或者手機APP
(2) 反向代理層:系統(tǒng)入口,反向代理
(3) 站點應用層:實現(xiàn)核心應用邏輯,返回html或者json
(4) 服務層:如果實現(xiàn)了服務化
(5) 數(shù)據(jù)-緩存層:緩存加速訪問存儲
(6) 數(shù)據(jù)-數(shù)據(jù)庫層:數(shù)據(jù)庫固化數(shù)據(jù)存儲
30. 如何設計建立和保持 100w 的長連接
可以使用Netty NIO框架羞海,但需要擴大JVM內(nèi)存,估計20G以上曲管,JVM內(nèi)存高了full GC時間會長可能會達到幾秒却邓,需要優(yōu)化GC算法,
可以使用代理服務器來分散連接
負載均衡 +反向代理院水。
31.如何避免瀏覽器緩存
- Cache-Control/Pragma
這個HTTP Head字段用于指定所有緩存機制在整個請求/響應鏈中必須服從的指令腊徙,如果知道該頁面是否為緩存简十,不僅可以控制瀏覽器,還可以控制和HTTP協(xié)議相關的緩存或代理服務器撬腾。
Cache-Control請求字段被各個瀏覽器支持得較好勺远,而且它的優(yōu)先級也比較高,它和其他一些請求字段(如Expires)同時出現(xiàn)時时鸵,Cache-Control會覆蓋其他字段。Pragma字段的作用和Cache-Control有點類似厅瞎,它也是在HTTP頭中包含一個特殊的指令饰潜,使相關的服務器來遵守,最常用的就是Pragma:no-cache和簸,它和Cache-Control:no-cache的作用是一樣的彭雾。 - Expires
Expires通常的使用格式是Expires:Sat,25Feb201212:22:17GMT,后面跟著一個日期和時間锁保,超過這個時間值后薯酝,緩存的內(nèi)容將失效,也就是瀏覽器在發(fā)出請求之前檢查這個頁面的這個字段爽柒,看該頁面是否已經(jīng)過期了吴菠,過期了就重新向服務器發(fā)起請求。 - Last-Modified/EtagLast-Modified字段
一般用于表示一個服務器上的資源的最后修改時間浩村,資源可以是靜態(tài)(靜態(tài)內(nèi)容自動加上Last-Modified字段)或者動態(tài)的內(nèi)容(如Servlet提供了一個getLastModified方法用于檢查某個動態(tài)內(nèi)容是否已經(jīng)更新)做葵,通過這個最后修改時間可以判斷當前請求的資源是否是最新的。一般服務端在響應頭中返回一個Last-Modified字段心墅,告訴瀏覽器這個頁面的最后修改時間酿矢,如Last-Modified:Sat,25Feb201212:55:04GMT,瀏覽器再次請求時在請求頭中增加一個If-Modified-Since:Sat,25Feb 201212:55:04GMT字段怎燥,詢問當前緩存的頁面是否是最新的瘫筐,如果是最新的就返回304狀態(tài)碼,告訴瀏覽器是最新的铐姚,服務器也不會傳輸新的數(shù)據(jù)策肝。 - Etag字段
這個字段的作用是讓服務端給每個頁面分配一個唯一的編號,然后通過這個編號來區(qū)分當前這個頁面是否是最新的谦屑。這種方式比使用Last-Modified更加靈活驳糯,但是在后端的Web服務器有多臺時比較難處理,因為每個Web服務器都要記住網(wǎng)站的所有資源氢橙,否則瀏覽器返回這個編號就沒有意義了酝枢。
32.如何防止緩存雪崩
緩存雪崩是指在我們設置緩存時采用了相同的過期時間,導致緩存在某一時刻同時失效悍手,請求全部轉(zhuǎn)發(fā)到DB帘睦,DB瞬時壓力過重雪崩袍患。
緩存失效時的雪崩效應對底層系統(tǒng)的沖擊非常可怕竣付。大多數(shù)系統(tǒng)設計者考慮用加鎖或者隊列的方式保證緩存的單線 程(進程)寫诡延,從而避免失效時大量的并發(fā)請求落到底層存儲系統(tǒng)上。這里分享一個簡單方案就時講緩存失效時間分散開古胆,比如我們可以在原有的失效時間基礎上增加一個隨機值肆良,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重復率就會降低,就很難引發(fā)集體失效的事件。
33.如果AB兩個系統(tǒng)互相依賴迂求,如何解除依賴
A > B应媚,同時B > A 解除這種雙向依賴的話,需要在AB之外增加一個C,用C封裝A依賴的B的那部分功能,讓A改為依賴C,C依賴B 然后就是這樣 A >C参淹,C >B,B >A 不過這樣依然存在環(huán)路依賴
34.如果有人惡意創(chuàng)建非法連接乏悄,怎么解決
DDos攻擊:
分布式拒絕服務(DDoS:Distributed Denial of Service)攻擊指借助于客戶/服務器技術浙值,將多個計算機聯(lián)合起來作為攻擊平臺,對一個或多個目標發(fā)動DDoS攻擊檩小,從而成倍地提高拒絕服務攻擊的威力亥鸠。通常,攻擊者使用一個偷竊帳號將DDoS主控程序安裝在一個計算機上识啦,在一個設定的時間主控程序?qū)⑴c大量代理程序通訊负蚊,代理程序已經(jīng)被安裝在網(wǎng)絡上的許多計算機上。代理程序收到指令時就發(fā)動攻擊颓哮。利用客戶/服務器技術家妆,主控程序能在幾秒鐘內(nèi)激活成百上千次代理程序的運行。
這種攻擊方式可分為以下幾種:
- 通過使網(wǎng)絡過載來干擾甚至阻斷正常的網(wǎng)絡通訊冕茅;
- 通過向服務器提交大量請求伤极,使服務器超負荷;
- 阻斷某一用戶訪問服務器姨伤;
- 阻斷某服務與特定系統(tǒng)或個人的通訊哨坪。
防范:
主機設置
所有的主機平臺都有抵御DoS的設置,總結(jié)一下乍楚,基本的有幾種:
- 關閉不必要的服務
- 限制同時打開的Syn半連接數(shù)目
- 縮短Syn半連接的time out 時間
- 及時更新系統(tǒng)補丁
網(wǎng)絡設置
網(wǎng)絡設備可以從防火墻與路由器上考慮当编。這兩個設備是到外界的接口設備,在進行防DDoS設置的同時徒溪,要注意一下這是以多大的效率犧牲為代價的忿偷,對你來說是否值得金顿。 - 防火墻
禁止對主機的非開放服務的訪問 限制同時打開的SYN最大連接數(shù) 限制特定IP地址的訪問 啟用防火墻的防DDoS的屬性 嚴格限制對外開放的服務器的向外訪問 第五項主要是防止自己的服務器被當做工具去害人。 - 路由器
設置SYN數(shù)據(jù)包流量速率 升級版本過低的ISO 為路由器建立log server
35.如果有幾十億的白名單鲤桥,每天白天需要高并發(fā)查詢揍拆,晚上需要更新一次,如何設計這個功能
負載均衡茶凳,緩存(結(jié)合本地緩存和集中式緩存)嫂拴,分庫分表,更新數(shù)據(jù)也按表分贮喧,然后再單表樂觀鎖更新顷牌。
36.如果系統(tǒng)要使用超大整數(shù)(超過long長度范圍),請你設計一個數(shù)據(jù)結(jié)構(gòu)來存儲這種超大型數(shù)字以及設計一種算法來實現(xiàn)超大整數(shù)加法運算)
37.如果要設計一個圖形系統(tǒng)塞淹,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現(xiàn)
Java圖形這塊略。
38.如果讓你實現(xiàn)一個并發(fā)安全的鏈表罪裹,你會怎么做
參考鏈接
這里使用mutex互斥鎖實現(xiàn)
39.應用服務器與WEB 服務器的區(qū)別饱普?應用服務器怎么監(jiān)控性能,各種方式的區(qū)別状共?你使用過的應用服務器優(yōu)化技術有哪些
Apache套耕、Tomcat、JBOSS峡继、Jetty冯袍、Nginx
區(qū)別
- Apache是Web服務器,Tomcat是應用(Java)服務器碾牌。
Tomcat在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用康愤。
Apache支持靜態(tài)頁,Tomcat支持動態(tài)的舶吗。 - Jetty是由Tomcat內(nèi)核作為其Servlet容器引擎征冷,并加以審核和調(diào)優(yōu). 大中型系統(tǒng)可以應用。能夠提供數(shù)據(jù)庫連接池服務, 還支持其他Web技術的集成誓琼,譬如PHP检激、.NET兩大陣營。
3, JBoss是一個管理EJB的容器和服務器腹侣,但JBoss核心服務不包括支持servlet/JSP的WEB容器叔收,一般與Tomcat或Jetty綁定使用。 - Nginx是目前性能最高的HTTP服務器傲隶。其特點是占有內(nèi)存少饺律,并發(fā)能力強。Nginx代碼完全用C語言從頭寫成跺株。
所以:Apache—Nginx蓝晒;Tomcat—Jetty腮出;JBoss。這三組可以組合了芝薇。
性能監(jiān)控 參考鏈接
- 核心基礎設施監(jiān)控(Core Infrastructure Monitoring胚嘲,CIM)
- 應用級別監(jiān)控(Application Level Monitoring,ALM)
- 微服務監(jiān)控(Micro Service Monitoring洛二,MSM)
- 多租戶日志監(jiān)控(Multitenant Log Monitoring馋劈,MLM)
應用服務器性能優(yōu)化總結(jié) 參考鏈接
分布式緩存、異步操作晾嘶、使用集群妓雾、代碼優(yōu)化(多線程、資源復用垒迂、數(shù)據(jù)結(jié)構(gòu)械姻、數(shù)據(jù)異構(gòu))
40. 大型網(wǎng)站在架構(gòu)上應當考慮哪些問題
- 海量數(shù)據(jù)的處理
- 數(shù)據(jù)并發(fā)的處理
- 文件存貯的問題
- 數(shù)據(jù)關系的處理
- 數(shù)據(jù)索引的問題
- 分布式處理
- Ajax的利弊分析
- 數(shù)據(jù)安全性的分析
- 數(shù)據(jù)同步和集群的處理的問題
- 數(shù)據(jù)共享的渠道以及OPENAPI趨勢
41. 有沒有處理過線上問題?出現(xiàn)內(nèi)存泄露机断,CPU利用率標高楷拳,應用無響應時如何處理的
有很多,比如:
數(shù)據(jù)庫響應慢吏奸,通過服務器查看欢揖,有些進程令CPU特別高,有些sql太復雜奋蔚,子查詢太多她混,導致數(shù)據(jù)庫性能變慢。
應用服務器因為對exception的處理沒有到位泊碑,導致linux服務器的file open too many錯誤坤按。
有些單例的模式?jīng)]有寫健壯,導致程序邏輯出錯馒过。
42. 最近看什么書晋涣,印象最深刻的是什么
看個人了
43. 描述下常用的重構(gòu)技巧
No.1:重復代碼的提煉
No.2:冗長方法的分割
No.3:嵌套條件分支的優(yōu)化(1)
No.4:嵌套條件分支的優(yōu)化(2)
No.5:去掉一次性的臨時變量
No.6:消除過長參數(shù)列表
No.7:提取類或繼承體系中的常量
No.8:讓類提供應該提供的方法
No.9:拆分冗長的類
No.10:提取繼承體系中重復的屬性與方法到父類
44. 你使用什么版本管理工具?分支(Branch)與標簽(Tag)之間的區(qū)別在哪里
從svn命令操作的角度沉桌,branches和tags是一樣的谢鹊,都是分支標記功能,兩者的區(qū)別主要在于默認的使用用途留凭。
一般來說:
- branches下用于存放“分支”佃扼,比如用于測試的分支、用于不同版本開發(fā)的分支蔼夜、用于缺陷處理的分支等等兼耀,“分支”下存放的內(nèi)容是會繼續(xù)修改的;
- tags下用于存放“標記”,比如某個發(fā)布版本的標記瘤运,“標記”下存放的內(nèi)容通常來說是固定不變的窍霞。
比如:開發(fā)進行到1.0版本測試完成,要進行對外軟件發(fā)布了拯坟,同時項目組后續(xù)會拆分成兩個小組但金,一個小組負責1.0版本的BUG維護,另一個小組開始在1.0基礎上進行2.0版本的開發(fā)郁季。此時冷溃,就可以把當前版本從trunk拉到tags下一份,標記為release1_0梦裂,然后對外發(fā)布時就從這個文件夾獲人普怼;然后再把當前版本拉到branches下一份年柠,標記為bugfix1_0凿歼,負責1.0版維護的小組以后就在這個文件夾下進行修復工作,負責2.0版開發(fā)的小組繼續(xù)在trunk下工作冗恨。
從配置管理的角度來看答憔,打基線就是把庫中的某些內(nèi)容打個標記,就是拖到tags文件夾下派近。
45. 你有了解過存在哪些反模式(Anti-Patterns)嗎
反模式(英文:Anti-patterns或pitfalls), 是指用來解決問題的帶有共同性的不良方法。它們已經(jīng)經(jīng)過研究并分類洁桌,以防止日后重蹈覆轍渴丸,并能在研發(fā)尚未投產(chǎn)的系統(tǒng)時辨認出來。
軟件膨脹:隨著版本的升級另凌,軟件越來越消耗系統(tǒng)資源谱轨。
反抽象:需要的功能并不暴露給用戶,導致用戶要在較高層次重新實現(xiàn)一些功能吠谢。
萬能類︰在一個類的設計中土童,聚集了太多的函數(shù)。
硬編碼(Hard Code):或稱寫死工坊。在實現(xiàn)某系統(tǒng)用途上設死該系統(tǒng)的運作環(huán)境献汗。
超布爾邏輯︰不必要的比較,或是過于抽象的布爾計算王污。
剪貼編程(Copy-n-paste programming):寧愿拷貝(并修改)現(xiàn)存代碼而非創(chuàng)造通用的解決方案罢吃。
掩耳盜鈴: 假設一個已知的bug不會出現(xiàn)。
DLL地獄:由于動態(tài)連接庫的版本昭齐、存在與否尿招、和重復所造成的種種問題,特別是在Microsoft Windows。
每個程序員要注意的 9 種反模式: 參考鏈接
- 過早優(yōu)化
- 單車車庫
- 分析癱瘓
- 上帝類
- 新增類恐懼癥
- 內(nèi)部平臺效應
- 魔法數(shù)和字符串
- 數(shù)字管理
- 無用的(幽靈)類
46. 你用過的網(wǎng)站前端優(yōu)化的技術有哪些
47. 如何分析Thread dump
dump 文件里就谜,值得關注的線程狀態(tài)有:
死鎖怪蔑,Deadlock(重點關注)
執(zhí)行中,Runnable
等待資源丧荐,Waiting on condition(重點關注)
等待獲取監(jiān)視器缆瓣,Waiting on monitor entry(重點關注)
暫停,Suspended
對象等待中篮奄,Object.wait() 或 TIMED_WAITING
阻塞捆愁,Blocked(重點關注)
停止,Parked
參考:
性能分析之-- JAVA Thread Dump 分析綜述
三個實例演示 Java Thread Dump 日志分析
48.你如何理解AOP中的連接點(Joinpoint)窟却、切點(Pointcut)昼丑、增強(Advice)、引介(Introduction)夸赫、織入(Weaving)菩帝、切面(Aspect)這些概念
- 連接點(Joinpoint):程序執(zhí)行的某個特定位置(如:某個方法調(diào)用前、調(diào)用后茬腿,方法拋出異常后)呼奢。一個類或一段程序代碼擁有一些具有邊界性質(zhì)的特定點,這些代碼中的特定點就是連接點切平。Spring僅支持方法的連接點握础。
- 切點(Pointcut):如果連接點相當于數(shù)據(jù)中的記錄,那么切點相當于查詢條件悴品,一個切點可以匹配多個連接點禀综。Spring AOP的規(guī)則解析引擎負責解析切點所設定的查詢條件,找到對應的連接點苔严。
- 增強(Advice):增強是織入到目標類連接點上的一段程序代碼定枷。Spring提供的增強接口都是帶方位名的,如:BeforeAdvice届氢、AfterReturningAdvice、ThrowsAdvice等。很多資料上將增強譯為“通知”衣吠,這明顯是個詞不達意的翻譯,讓很多程序員困惑了許久忧换。
說明: Advice在國內(nèi)的很多書面資料中都被翻譯成"通知"酪耳,但是很顯然這個翻譯無法表達其本質(zhì)梢夯,有少量的讀物上將這個詞翻譯為"增強"颂砸,這個翻譯是對Advice較為準確的詮釋人乓,我們通過AOP將橫切關注功能加到原有的業(yè)務邏輯上色罚,這就是對原有業(yè)務邏輯的一種增強戳护,這種增強可以是前置增強竟终、后置增強榆芦、返回后增強驻右、拋異常時增強和包圍型增強。 - 引介(Introduction):引介是一種特殊的增強恨豁,它為類添加一些屬性和方法爬迟。這樣,即使一個業(yè)務類原本沒有實現(xiàn)某個接口付呕,通過引介功能,可以動態(tài)的未該業(yè)務類添加接口的實現(xiàn)邏輯象颖,讓業(yè)務類成為這個接口的實現(xiàn)類。
- 織入(Weaving):織入是將增強添加到目標類具體連接點上的過程活箕,AOP有三種織入方式:①編譯期織入:需要特殊的Java編譯期(例如AspectJ的ajc);②裝載期織入:要求使用特殊的類加載器克蚂,在裝載類的時候?qū)︻愡M行增強;③運行時織入:在運行時為目標類生成代理實現(xiàn)增強赤屋。Spring采用了動態(tài)代理的方式實現(xiàn)了運行時織入,而AspectJ采用了編譯期織入和裝載期織入的方式嗜逻。
- 切面(Aspect):切面是由切點和增強(引介)組成的涩僻,它包括了對橫切關注功能的定義,也包括了對連接點的定義栈顷。
49.你是如何處理內(nèi)存泄露或者棧溢出問題的
內(nèi)存溢出是由于沒被引用的對象(垃圾)過多造成JVM沒有及時回收逆日,造成的內(nèi)存溢出。如果出現(xiàn)這種現(xiàn)象可行代碼排查:
- 是否App中的類中和引用變量過多使用了static修飾 如public static Student s萄凤;在類中的屬性中使用 static修飾的最好只用基本類型或字符串室抽。如public static int i = 0; //public static String str;
- 是否App中使用了大量的遞歸或無限遞歸(遞歸中用到了大量的建新的對象)
- 是否App中使用了大量循環(huán)或死循環(huán)(循環(huán)中用到了大量的新建的對象)
- 檢查App中是否使用了向數(shù)據(jù)庫查詢所有記錄的方法。即一次性全部查詢的方法靡努,如果數(shù)據(jù)量超過10萬多條了坪圾,就可能會造成內(nèi)存溢出晓折。所以在查詢時應采用“分頁查詢”。
- 檢查是否有數(shù)組兽泄,List已维,Map中存放的是對象的引用而不是對象,因為這些引用會讓對應的對象不能被釋放已日。會大量存儲在內(nèi)存中垛耳。
- 檢查是否使用了“非字面量字符串進行+”的操作。因為String類的內(nèi)容是不可變的飘千,每次運行"+"就會產(chǎn)生新的對象堂鲜,如果過多會造成新String對象過多,從而導致JVM沒有及時回收而出現(xiàn)內(nèi)存溢出护奈。
棧溢出的原因
- 是否有遞歸調(diào)用
- 是否有大量循環(huán)或死循環(huán)
- 全局變量是否過多
- 數(shù)組缔莲、List、map數(shù)據(jù)是否過大
- 使用DDMS工具進行查找大概出現(xiàn)棧溢出的位置
50.你們線上應用的 JVM 參數(shù)有哪些
-Xmx4g
設置JVM最大可用內(nèi)存為4g霉旗。
-Xms4g
設置JVM初始內(nèi)存為4g痴奏。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存厌秒。
-XX:NewRatio=2
設置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)读拆。設置為2,則年輕代與年老代所占比值為1:2鸵闪,年輕代占整個堆棧的1/3
-XX:SurvivorRatio=4
年輕代中Eden區(qū)與兩個Survivor區(qū)的比值檐晕。注意Survivor區(qū)有兩個。如:4蚌讼,表示Eden:Survivor=4:2辟灰,一個Survivor區(qū)占整個年輕代的1/6
-XX:PermSize=256m
設置持久代大小為256m
-XX:MaxPermSize=512m
設置持久代最大為512m
-Xss256k
設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M篡石,以前每個線程堆棧大小為256K芥喇。更具應用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下凰萨,減小這個值能生成更多的線程继控。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成沟蔑,經(jīng)驗值在3000~5000左右湿诊。
-XX:+DisableExplicitGC
關閉System.gc()
-XX:+UseParNewGC
設置年輕代為并行收集狱杰,可與CMS收集同時使用瘦材,JDK5.0以上,JVM會根據(jù)系統(tǒng)配置自行設置,所以無需再設置此值
-XX:ParallelGCThreads=4
并行收集器的線程數(shù),此值最好配置與處理器數(shù)目相等 同樣適用于CMS
-XX:+UseConcMarkSweepGC
使用CMS內(nèi)存收集
-XX:+UseCMSCompactAtFullCollection
在FULL GC的時候仿畸,對年老代的壓縮食棕,CMS是不會移動內(nèi)存的朗和,因此非常容易產(chǎn)生碎片,導致內(nèi)存不夠用簿晓,因此內(nèi)存的壓縮這個時候就會被啟用眶拉。增加這個參數(shù)是個好習慣°径可能會影響性能,但是可以消除碎片
-XX:+CMSParallelRemarkEnabled
降低標記停頓
-XX:MaxTenuringThreshold=3
垃圾最大年齡忆植,即對象在Survivor區(qū)存在的年齡為3(復制一次年齡+1),如果設置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代. 對于年老代比較多的應用,可以提高效率.如果將此值設置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的概率該參數(shù)只有在串行GC時才有效.
-XX:+CMSParallelRemarkEnabled
降低標記停頓(線上配置重復了)
-XX:CMSInitiatingOccupancyFraction=70
使用cms作為垃圾回收谒臼,使用70%后開始CMS收集朝刊,為了保證不出現(xiàn)promotion failed(見下面介紹)錯誤,該值的設置需要滿足以下公式CMSInitiatingOccupancyFraction計算公式
CMSInitiatingOccupancyFraction值與Xmn的關系公式:
上面介紹了promontion faild產(chǎn)生的原因是EDEN空間不足的情況下將EDEN與From survivor中的存活對象存入To survivor區(qū)時,To survivor區(qū)的空間不足,再次晉升到old gen區(qū)蜈缤,而old gen區(qū)內(nèi)存也不夠的情況下產(chǎn)生了promontion faild從而導致full gc.那可以推斷出:eden+from survivor < old gen區(qū)剩余內(nèi)存時拾氓,不會出現(xiàn)promontion faild的情況,即:
(Xmx-Xmn)(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2))
進而推斷出:
CMSInitiatingOccupancyFraction <=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)100
例如:
當xmx=128 xmn=36 SurvivorRatior=1時 CMSInitiatingOccupancyFraction<=((128.0-36)-(36-36/(1+2)))/(128-36)100 =73.913
當xmx=128 xmn=24 SurvivorRatior=1時 CMSInitiatingOccupancyFraction<=((128.0-24)-(24-24/(1+2)))/(128-24)100=84.615…
當xmx=3000 xmn=600 SurvivorRatior=1時 CMSInitiatingOccupancyFraction<=((3000.0-600)-(600-600/(1+2)))/(3000-600)*100=83.33
CMSInitiatingOccupancyFraction低于70% 需要調(diào)整xmn或SurvivorRatior值底哥。
-XX:CMSFullGCsBeforeCompaction=0
多少次后進行內(nèi)存壓縮咙鞍,由于并發(fā)收集器不對內(nèi)存空間進行壓縮,整理,所以運行一段時間以后會產(chǎn)生"碎片",使得運行效率降低.此值設置運行多少次GC以后對內(nèi)存空間進行壓縮,整理.
-XX:+UseFastAccessorMethods
原始類型的快速優(yōu)化
-XX:+UseBiasedLocking
鎖機制的性能改善
-Dcom.sun.management.jmxremote
使用jvisualvm通過JMX的方式遠程監(jiān)控JVM的運行情況,還要求再配置ssl趾徽、port续滋、authenticate等參數(shù),單獨配置這個可能沒有孵奶,或者可以使用默認配置吃粒,需要確認?拒课?徐勃?
-Djava.awt.headless=true
有時我們會在我們的J2EE工程中使用一些圖表工具如:jfreechart,用于在web網(wǎng)頁輸出GIF/JPG等流早像,在winodws環(huán)境下僻肖,一般我們的app server在輸出圖形時不會碰到什么問題,但是在linux/unix環(huán)境下經(jīng)常會碰到一個exception導致你在winodws開發(fā)環(huán)境下圖片顯 示的好好可是在linux/unix下卻顯示不出來卢鹦,因此加上這個參數(shù)以免避這樣的情況出現(xiàn).
調(diào)試參數(shù):
-verbose:gc
表示輸出虛擬機中GC的詳細情況
-XX:+PrintGC
加上參數(shù)可以在輸出日志中可以查看垃圾回收前后堆的大小, 即打印gc日志
-XX:+PrintGCDetails
打印gc日志的更加詳細的信息
-XX:+PrintGCDateStamps
(-XX:+PrintGCDateStamps或者-XX:+PrintGCTimeStamps)臀脏,輸出GC發(fā)生時,gc發(fā)生的時間
-XX:+PrintAdaptiveSizePolicy
打印自適應收集的大小冀自。默認關閉揉稚。
-XX:+PrintHeapAtGC
打印GC前后的詳細堆棧信息
-XX:+PrintTenuringDistribution
查看每次minor GC后新的存活周期的閾值
-Xloggc:/***/gc.log
把相關日志信息記錄到文件以便分析(gc.log)
-XX:ErrorFile=/**/hs_err_pid.log
生成error 文件的路徑(hs_err_pid.log)
-XX:HeapDumpPath=/**/java.hprof
指定HeapDump的文件路徑或目錄(java.hprof)
配置地址:
-Dconfig.home=/**/config
config配置文件路徑
-Dlogback.configurationFile=/**/logback.xml
logback配置文件logback.xml文件位置
51. 怎么提升系統(tǒng)的QPS和吞吐量
集群+負載均衡、增加緩存熬粗、系統(tǒng)拆分搀玖、分庫分表、垂直拆分+水平拆分驻呐、異步化+MQ灌诅。等等技術手段芳来。
原文鏈接:https://blog.csdn.net/u013898617/java/article/details/78824077