2018-09-28

redis

持久化:AOF/RDB

IO多路復(fù)用:select epoll evport kqueue

Nmap 虛擬內(nèi)存 內(nèi)存映射

網(wǎng)絡(luò)轉(zhuǎn)換 分發(fā)

binlog記錄過程

redis 的AOF 只記錄結(jié)果

內(nèi)存數(shù)據(jù)結(jié)構(gòu) 支持更多的數(shù)據(jù)結(jié)構(gòu) 相對(duì)于memcached

linux

pgm -A `armory -leg projectnamehost` "grep 'Exception' /home/admin/projectname/logs/service.log"

BIONIOAIO

BIONIOAIO

aone/spring/maven

aone

  • 構(gòu)建:分支合并、編譯

  • 打二方包

  • 部署

  • 發(fā)布

  • 代碼規(guī)約

  • 集成測試

    構(gòu)建常見的問題:

    1. 環(huán)境變量缺失
    2. 多分支構(gòu)建時(shí),找不到某個(gè)類的某個(gè)方法/某個(gè)變量,但是本地編譯ok,啥原因?

分批發(fā)布:保持對(duì)外提供的服務(wù)在線,不影響線上使用;

第一批暫定:觀察,看日志,

## alitomcat&pandora

  1. tomcat原理

    啟動(dòng)時(shí)會(huì)加載自己lib/庫,以及應(yīng)用程序的lib,以及應(yīng)用程序類class。

    自身類庫與應(yīng)用程序所依賴類庫的隔離,如何實(shí)現(xiàn)的?

    通過類加載器實(shí)現(xiàn)的

    jvm的3種加載器:啟動(dòng)類加載器、擴(kuò)展加載器、系統(tǒng)加載器

    jsp是怎么被編譯的,加載器的機(jī)制是怎么樣的?

    jsp是一個(gè)servlet,被類加載器加載

  2. Spring-boot與tomcat的關(guān)系

    spring-boot集成了tomcat,所以spring-boot可以直接執(zhí)行main()函數(shù)進(jìn)行啟動(dòng),或者執(zhí)行jar相關(guān)命令即可

    而傳統(tǒng)的tomcat啟動(dòng)方式,需要依賴startup.sh啟動(dòng)腳本

    spring-boot

    的優(yōu)點(diǎn)和缺點(diǎn)?優(yōu)點(diǎn)很多,總結(jié)成一句話—減少各種配置、集成時(shí)間,提高開發(fā)和調(diào)試效率

  3. war包結(jié)構(gòu)

    web應(yīng)用打成war包之后,tomcat在部署時(shí)會(huì)先對(duì)其解壓,解壓后形成webapp/WEB-INF/classes和webapp*/WEB-INF/lib,classes下面放的是你的java包。

    spring-boot之后,我們打的是jar包,解壓生成的是webapp**/BOOT-INF

    發(fā)布完成之后,需要去服務(wù)器上看看這個(gè)目錄,尤其是lib目錄。尤其是當(dāng)出現(xiàn)jar包沖突時(shí),更要看看,是否真的有兩個(gè)一樣的jar包在該目錄下

HSF(同步調(diào)用)

hsf定義:添加hsf注解

hsf消費(fèi):spring-boot:在config中通過@Consumer注解定義

注意:

  1. 確定好自己服務(wù)的超時(shí)時(shí)間,一般是3秒;時(shí)間過長,占用連接池,阻塞應(yīng)用
  2. 異常處理,hsf接口返回值一般都封裝為result。為什么要封裝?和http訪問一樣,status,定義友好的返回信息
  3. 調(diào)用hsf服務(wù)時(shí),要先判斷result.isSuccess,接下來判斷result.data是否為null或者列表是否為空,否則可能NPE
  4. 循環(huán)調(diào)用:循環(huán)調(diào)用別人的hsf服務(wù)時(shí),要控制循環(huán)次數(shù),如果超過20次,容易把別人的hsf線程池打爆。如何解決?循環(huán)要控制次數(shù)
  5. 限流與降級(jí):大促期間根據(jù)qps,進(jìn)行限流和降級(jí)。
  6. 入?yún)⒋笮】刂疲喝绻嫌握{(diào)用時(shí)傳入的參數(shù)很大,如果調(diào)用很頻繁、并且內(nèi)部處理很耗時(shí),會(huì)導(dǎo)致什么結(jié)果?頻繁GC、甚至引發(fā)FGC,并造成hsf線程池被打爆,使整個(gè)系統(tǒng)不可用。如果入?yún)⒄娴暮艽?,怎么處?/li>

metaq(異步調(diào)用)

  1. 同一個(gè)topic,但是不同應(yīng)用消費(fèi)不同的內(nèi)容,需要加tag,形成topic+tag兩級(jí)標(biāo)識(shí)。特別是tag,直接在mq服務(wù)端就進(jìn)行過濾,不需要push到客戶端

  2. 消息風(fēng)暴:如果編程不當(dāng),或者消費(fèi)業(yè)務(wù)本身就很復(fù)雜,消費(fèi)一次要處理很久,導(dǎo)致本次消費(fèi)還沒結(jié)束,服務(wù)器以為消費(fèi)失敗,于是重發(fā)消息,從而導(dǎo)致應(yīng)用服務(wù)器消息堆積。這種堆積是指數(shù)級(jí)的,很快就會(huì)把應(yīng)用搞掛。通過mq控制臺(tái)可以看消息堆積量。解決辦法:重啟服務(wù)器;如果消息過多,重啟消息服務(wù)器不行的話,到消息平臺(tái),先清空消息。

    在代碼中如何避免?先返回給用戶成功,然后異步去處理;或者構(gòu)建緩存區(qū),來處理用戶的請(qǐng)求和消息

diamond

  1. 原理

    基于推拉模式,主要基于拉

    長連接和短連接的原理是啥? 需要看底層

    http協(xié)議,1.1開始就是長連接;長連接表示keepLive

    長短連接的優(yōu)缺點(diǎn)?

    長連接:建立連接之后,不斷開;優(yōu)點(diǎn):交流方便;缺點(diǎn):連接是系統(tǒng)資源,占用系統(tǒng)內(nèi)存

    一臺(tái)linux服務(wù)器支持的最大連接數(shù)是

    diamond

  2. double check 兩次檢查

    解析:文本按換行符split,遍歷數(shù)組,轉(zhuǎn)換成對(duì)象或map

    (1)推送開關(guān)時(shí),必須要double check

    (2)解析開關(guān)值時(shí),要注意健壯性。特例:

    若一個(gè)開關(guān)包含多個(gè)參數(shù),如果其中一個(gè)解析失敗,會(huì)帶來什么問題,如何解決?

JVM內(nèi)存

  1. jvm內(nèi)存

三大塊:堆 棧 方法區(qū)

so,有哪幾種oom場景?

堆的溢出、棧溢出、方法溢出

棧:方法調(diào)用是引用棧內(nèi)存,無限調(diào)用

方法區(qū):

堆:

只要有一個(gè)溢出,jvm就會(huì)直接退出

  1. 常見問題

    查詢DB沒做分頁,導(dǎo)致頻繁GC甚至FGC

    接受參數(shù)太大,并且QPS高,直接將系統(tǒng)搞死

    死循環(huán),導(dǎo)致stack oom

    批處理耗時(shí),并且QPS較高,系統(tǒng)load飆升,假死

  2. JVM問題排查

    top, jmap, jstack, jps, load, rt...

    各個(gè)工具怎么用,用來分析什么問題?

  3. 舉例

    某個(gè)hsf請(qǐng)求處理很耗時(shí),并且占用大量資源,怎么快速定位?

    top -h 那個(gè)線程跑的最多,最耗時(shí)

    jstack 根據(jù)pid,看對(duì)應(yīng)那個(gè)類

 ## tair(緩存)

 * 如何保證tair與db之間的一致性?



 * tair異常:寫成功,讀不到,啥原因?

 tair滿了,寫不進(jìn)去

 * tair失效:一定要進(jìn)行失效機(jī)制,這是保證數(shù)據(jù)一致性的根本措施。容忍短時(shí)間內(nèi)的數(shù)據(jù)不一致性,但是絕不允許長時(shí)間不一致
 * 寫>讀的場景下,是否要使用tair?不需要
 * 本地cache:tair自帶本地cache熱點(diǎn)數(shù)據(jù)功能,但是必須根據(jù)業(yè)務(wù)特點(diǎn)設(shè)置何時(shí)的失效期
 * 緩存分流:多個(gè)系統(tǒng)如果都依賴basic系統(tǒng)的緩存數(shù)據(jù),當(dāng)QPS很大時(shí),basic系統(tǒng)因?yàn)閠air訪問流量過大觸發(fā)tair限流,導(dǎo)致basic頻繁讀取DB,造成性能降低,如何破解?

 重復(fù)訪問少,緩存命中概率低





 ## mysql

 b+tree的結(jié)構(gòu)是啥?為啥比其他樹快

 status字段能建索引嗎?不需要鍵,因?yàn)闋顟B(tài)值比較少

 批量查詢時(shí),limit start step查詢?nèi)绾翁嵘? id,order by, 100w條的時(shí)候,需要注意



 ## eagleeye(鷹眼)

 load cpu時(shí)間片 任務(wù)

 在一個(gè)時(shí)間片內(nèi)沒做完,又來一個(gè)任務(wù),load+1

 一個(gè)時(shí)間片時(shí)間沒到就做完了,load=0



 load/qps的關(guān)系:

 qps高,load一定高嗎?

 load的含義是啥

 如何設(shè)計(jì)程序,使qps即使很低,load也很高

 4核處理器上,load的健康值是多少

 正常業(yè)務(wù)系統(tǒng)的qps健康值是多少

 正常業(yè)務(wù)系統(tǒng)的線程數(shù)量是多少

服務(wù)治理框架

 hsf:

序列化 hessian 支持跨語言,速度慢

dubbo序列化也是hessian2

普通的輪詢方案會(huì)給服務(wù)器帶來過多訪問壓力,而且很多時(shí)候輪詢請(qǐng)求都沒有配置更新,白跑一趟,Diamond采用的是改進(jìn)的長輪詢方案,長短輪詢結(jié)合,即輪詢配置是否更新時(shí),使用長輪詢,減少配置沒更新時(shí)無意義的訪問;在獲取配置時(shí),使用短輪詢,及時(shí)獲取配置。

基于Http長輪詢模型,這樣減少了無意義的輪詢請(qǐng)求量,提高了輪詢的效率;也降低了系統(tǒng)負(fù)載,提升了整個(gè)系統(tǒng)的資源利用率。這種推拉結(jié)合的策略,做到了在長連接和短連接之間的平衡,實(shí)現(xiàn)上讓服務(wù)端不用太關(guān)注連接的管理,效果上又獲得了類似TCP長連接的信息推送的實(shí)時(shí)性。由于輪詢之間的間隔,無法保證連續(xù)的配置更新,都會(huì)被客戶端接受,但最后一次的配置更新一定會(huì)被客戶端接受到,例如發(fā)布了A B C 配置,可能客戶端只接受到了 A C,也可能只接受到 B C,或者只接收到 C。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容