消息隊(duì)列
-
kafka
核心概念:
Broker:服務(wù)器節(jié)點(diǎn)為broker
Topic:消息類別
Partition:一個(gè)Topic分隔為1個(gè)或多個(gè)Partition,單個(gè)Partition中是有序的,如果需要保證topic有序需要將partition設(shè)置為1
Producer:
Consumer:
Counsumer Group: 消費(fèi)者再平衡rebalance,將分區(qū)分配給對(duì)應(yīng)的消費(fèi)者湿酸。一個(gè)分區(qū)對(duì)于同一個(gè)消費(fèi)組只對(duì)應(yīng)一個(gè)消費(fèi)者,但是可以對(duì)應(yīng)多個(gè)不同消費(fèi)組的消費(fèi)者
Leader:
Follwer:kafka使用Zookeeper來(lái)做協(xié)調(diào)服務(wù)闲擦,controller來(lái)負(fù)責(zé)partition的分配和leader選舉
ISR: in sync replicas 同步副本
AR: assigned replicas
OSR: out sync replicas
AR = ISR + OSR
順序?qū)懀?/p>
零拷貝
mmap
多副本同步, 集群拓展,高可用
partition分區(qū)數(shù)決定了同組消費(fèi)者個(gè)數(shù)的上限
消費(fèi)組保存了offset
Kafka的分區(qū)數(shù)和消費(fèi)者個(gè)數(shù)
參考
spring.kafka.producer.acks取值:
- acks=0 生產(chǎn)者不會(huì)等待來(lái)自服務(wù)器的任何確認(rèn)究抓,該記錄將立即添加到套接字緩沖區(qū)并視為已發(fā)送邪财,這種情況下,無(wú)法保證服務(wù)器已經(jīng)收到記錄应狱,并且重試配置也不會(huì)生效(因?yàn)榭蛻舳送ǔ2粫?huì)知道任何故障)
- acks=1 這意味著leader會(huì)將記錄寫入本地日志共郭,但無(wú)需等待所有副本服務(wù)器的完全確認(rèn)即可做出回應(yīng),在這種情況下疾呻,如果leader在確認(rèn)記錄后立即失敗除嘹,但在將數(shù)據(jù)復(fù)制到所有副本服務(wù)器之前,則記錄將會(huì)丟失
- acks=all 這意味著leader將等待完整的同步副本集以確認(rèn)記錄岸蜗,這保證了只要至少一個(gè)副本服務(wù)器任然存活就不會(huì)丟失尉咕,這是最強(qiáng)有力的保證,相當(dāng)于acks=-1的設(shè)置
kafka消費(fèi)模式
AbstractMessageListenerContainer.AckMode的枚舉中定義
- MANUAL
- MANUAL_IMMEDIATE
- RECORD
- TIME
- COUNT
kafka高可用
20道經(jīng)典的Kafka面試題詳解
kafka面試題
kafka為什么這么快
kafka&RocketMq順序消費(fèi)
kafka集成springboot
kafka集成springcloud todo
kafka的文件系統(tǒng)結(jié)構(gòu)設(shè)計(jì):
文件系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
-
RocketMQ
Broker: 集群中的節(jié)點(diǎn)
NameServer:無(wú)狀態(tài)節(jié)點(diǎn)璃岳,集群部署年缎,節(jié)點(diǎn)之間無(wú)信息同步,主要是維護(hù)Broker的信息铃慷,Topic信息晦款,broker會(huì)定時(shí)發(fā)送心跳信息到NameServer
Topic:主題
Tag:標(biāo)簽
Queue:隊(duì)列,一個(gè)topic會(huì)對(duì)應(yīng)多個(gè)Queue,順序消息的話需要設(shè)置為順序消費(fèi)枚冗,發(fā)送時(shí)通過(guò)隊(duì)列選擇器將數(shù)據(jù)發(fā)送到同一個(gè)隊(duì)列
事務(wù)消息: 流程:
1.發(fā)送half消息
2.執(zhí)行本地事務(wù)
3.根據(jù)本地事務(wù)成功或者失敗發(fā)送狀態(tài)
4.如果因?yàn)榫W(wǎng)絡(luò)等其他因素沒(méi)有收到事務(wù)執(zhí)行的狀態(tài),mq服務(wù)端通過(guò)回查接口獲取事務(wù)的執(zhí)行狀態(tài)
RocketMQ架構(gòu)設(shè)計(jì)圖
架構(gòu)設(shè)計(jì)圖
MySQL
1.數(shù)據(jù)庫(kù)分表分庫(kù)蛇损,shardingjdbc
概念:1.邏輯表 2.廣播表
2.mvcc機(jī)制 multi version concurrency control
3.索引底層數(shù)據(jù)結(jié)構(gòu)
b+樹(shù)赁温,b樹(shù)
4.redolog undolog
5.事務(wù)隔離級(jí)別
讀未提交 Read Uncommitted
讀已提交 Read Committed
可重復(fù)讀-mysql默認(rèn)隔離級(jí)別 Repeatable Read
串行化 Serial
6.鎖機(jī)制
間隙鎖,可重復(fù)讀機(jī)制下的鎖機(jī)制淤齐,主鍵命中記錄為行鎖股囊,否則鎖區(qū)間
行鎖
表鎖
7.索引失效情況
8.物理結(jié)構(gòu) 最小的存儲(chǔ)單位是頁(yè)
9.索引分類
1.聚族索引 2.非聚族索引
MVCC
- trx_id: 事務(wù)id,遞增的
- roll_pointer 回滾指針,指向undolog中的上一個(gè)版本的位置
- 可重復(fù)讀Repeatable Read和讀已提交Read Committed隔離級(jí)別下的實(shí)現(xiàn)
- ReadView: 讀視圖更啄,RR在第一次select時(shí)生成ReadView稚疹,RC在每次select是都會(huì)生成一個(gè)新的ReadView
- 參考
間隙鎖
- 記錄鎖、間隙鎖祭务、臨鍵鎖内狗,都屬于排它鎖;
- 記錄鎖就是鎖住一行記錄义锥;
- 間隙鎖只有在事務(wù)隔離級(jí)別 RR 中才會(huì)產(chǎn)生柳沙;
- 唯一索引只有鎖住多條記錄或者一條不存在的記錄的時(shí)候,才會(huì)產(chǎn)生間隙鎖拌倍,指定給某條存在的記錄加鎖的時(shí)候赂鲤,只會(huì)加記錄鎖噪径,不會(huì)產(chǎn)生間隙鎖;
- 普通索引不管是鎖住單條数初,還是多條記錄找爱,都會(huì)產(chǎn)生間隙鎖;
間隙鎖會(huì)封鎖該條記錄相鄰兩個(gè)鍵之間的空白區(qū)域泡孩,防止其它事務(wù)在這個(gè)區(qū)域內(nèi)插入车摄、修改、刪除數(shù)據(jù)珍德,這是為了防止出現(xiàn) 幻讀 現(xiàn)象练般; - 普通索引的間隙,優(yōu)先以普通索引排序锈候,然后再根據(jù)主鍵索引排序(多普通索引情況還未研究)薄料;
- 事務(wù)級(jí)別是RC(讀已提交)級(jí)別的話,間隙鎖將會(huì)失效
- 參考
- MySQL加鎖問(wèn)題
索引失效情況
- 查詢條件 or ,not in ,<> ,is null, is not null
- 隱式類型轉(zhuǎn)換(不同的字符集或者不同的數(shù)據(jù)類型)
- like查詢非前綴匹配
- 復(fù)合索引沒(méi)有用左列字段
- 對(duì)where字段進(jìn)行函數(shù)操作
- 參考
分表分庫(kù)
shardingjdbc實(shí)戰(zhàn)
京東shardingjdbc
shardingjdbc實(shí)戰(zhàn)問(wèn)題分析
shardingjdbc
redis
1.數(shù)據(jù)結(jié)構(gòu)
String
Hash
BitMap
List
可靠隊(duì)列泵琳。RPOPLPUSH,LREM
Set
ZSet skipList跳表
Geo
Pub-sub
jedis,lettuces
2.redis的持久化機(jī)制
RDB:快照摄职,會(huì)有丟失情況
AOF:寫命令的日志追加,文件過(guò)大
3.內(nèi)存淘汰策略
內(nèi)存淘汰機(jī)制:
A:定時(shí)刪除获列,在設(shè)置了過(guò)期時(shí)間的key中隨機(jī)抽取一部分谷市,將過(guò)期的刪除掉,如果過(guò)期的比例達(dá)到一定值則繼續(xù)此動(dòng)作
B:惰性刪除
LRU:最近最少使用
LFU: 使用頻率最低
a.no-evication
b.allkeys-lru
c.volatile-lru
d.allkeys-random
e.volatile-random
f.allkeys-lfu
j.volatile-lfu
k.volatile-ttl
4.一致性hash
5.部署模式
1.單點(diǎn)
2.主從击孩,一主多從迫悠,需要手動(dòng)切換
3.集群 16384個(gè)槽,crc16算法計(jì)算屬于哪個(gè)槽巩梢。然后定向到哪一臺(tái)服務(wù)器
4.哨兵模式
a.哨兵是一個(gè)單獨(dú)的進(jìn)程创泄。原理是哨兵通過(guò)發(fā)送命令,等待服務(wù)器響應(yīng)括蝠,從而監(jiān)控運(yùn)行的多個(gè)redis實(shí)例鞠抑,
b.failover故障切換,主觀下線:一個(gè)哨兵檢測(cè)到主服務(wù)器不可用忌警,當(dāng)多個(gè)哨兵都監(jiān)測(cè)到哨兵不可用時(shí)就會(huì)發(fā)起一次投票搁拙,進(jìn)行failover.切換成功,通過(guò)發(fā)布訂閱通知主服務(wù)器切換法绵,成為客觀下線箕速。
c.哨兵除了監(jiān)控redis服務(wù)器外,各個(gè)哨兵節(jié)點(diǎn)也會(huì)進(jìn)行監(jiān)控礼烈。
d.哨兵模式部署弧满,1主2從3哨兵
5.redission
6.分布式鎖
setNX set if not exist ,如果不存在的話設(shè)置成功,如果存在則設(shè)置失敗此熬,加鎖失敗
7.緩存穿透 明顯不存的數(shù)據(jù)庭呜。布隆過(guò)濾器或者緩存控制
8.緩存擊穿 熱點(diǎn)數(shù)據(jù)失效導(dǎo)致數(shù)據(jù)擊穿緩存請(qǐng)求數(shù)據(jù)庫(kù)滑进,提前更新,分布式鎖
9.緩存雪崩 緩存同時(shí)失效募谎。導(dǎo)致請(qǐng)求到數(shù)據(jù)庫(kù)扶关,從而拖垮數(shù)據(jù)庫(kù),分散過(guò)期時(shí)間数冬。
10.熱點(diǎn)數(shù)據(jù)全部集中到一臺(tái)redis服務(wù)器节槐,可以使用隨機(jī)值將數(shù)據(jù)分布到多臺(tái)服務(wù)器,減少請(qǐng)求傾斜
11.緩存一致性問(wèn)題 [https://blog.csdn.net/hukaijun/article/details/81010475]
1.更新數(shù)據(jù)拐纱,刪除緩存
2.刪除緩存铜异,更新數(shù)據(jù)庫(kù) 延時(shí)雙刪(del cache,udate database,sleep,del cache)
3.cache aside pattern:
a.失效Missing: 從數(shù)據(jù)查詢,加載到緩存
b.命中Hit: 返回
c.更新:更新數(shù)據(jù)庫(kù)秸架,失效緩存
zookeeper
分布式協(xié)調(diào)服務(wù),kafka. dubbo.
zookeeper分布式鎖原理:
利于zookeeper的臨時(shí)順序節(jié)點(diǎn)东抹,第一個(gè)客戶端創(chuàng)建臨時(shí)順序節(jié)點(diǎn)蚂子,創(chuàng)建成功則加鎖成功,后續(xù)的客戶端查詢是否為集合中的第一個(gè)節(jié)點(diǎn)缭黔,如果不是一個(gè)節(jié)點(diǎn)食茎,會(huì)監(jiān)控前一個(gè)節(jié)點(diǎn)是否被刪除,刪除代表釋放了鎖馏谨。判斷是否為第一個(gè)節(jié)點(diǎn)别渔,如果是則加鎖成功。[https://www.cnblogs.com/ysw-go/p/11444993.html]
InterProcessMutex lock = InterProcessMutex(client,"/lock/my_lock")
lock.acqiure();// 獲取鎖
lock.release();// 釋放鎖
JVM
[https://www.cnblogs.com/chenpt/p/9803298.html]
jvm內(nèi)存模型
1.java虛擬機(jī)棧:線程私有 棧幀惧互,局部變量钠糊、操作數(shù)棧、動(dòng)態(tài)鏈接壹哺、方法出口
2.本地方法棧:線程私有
3.程序計(jì)數(shù)器:線程私有 當(dāng)前線程的行號(hào)指示器
4.堆:線程共享
年輕代:survivor區(qū),Eden區(qū)
老年代:
5.方法區(qū):線程共享 類信息艘刚,常量管宵,靜態(tài)變量,運(yùn)行時(shí)常量池
內(nèi)存分配:
方法逃逸攀甚,鎖消除箩朴,鎖粗化
即時(shí)編譯JIT
棧上分配-> TLAB(Thread Local Allocation Buffer線程本地分配緩存區(qū)) -> 是否需要分配到老年代,如果不需要?jiǎng)t分配到Eden區(qū)
TLAB:默認(rèn)占用Eden區(qū)的1%
GC垃圾回收
1.垃圾回收判斷機(jī)制:
a.可達(dá)性分析秋度,GCROOT引用鏈炸庞,一個(gè)對(duì)象到GCRoot沒(méi)有任何引用鏈時(shí)則認(rèn)為對(duì)象不可用,可以作為GCRoot對(duì)象的有荚斯,虛擬機(jī)棧中引用的對(duì)象埠居,常量查牌,靜態(tài)屬性,native引用的對(duì)象
b.引用計(jì)數(shù)法滥壕,相互引用問(wèn)題
2.垃圾回收算法
a.復(fù)制回收算法纸颜,主要是年輕代
b.標(biāo)記清除,會(huì)產(chǎn)生內(nèi)存碎片
c.標(biāo)記整理 老年代 CMS收集器
d.分代回收
3.垃圾回收器
a.serial
b.ParNew
c.Parallel Scavenge
d.serial Old 作為CMS收集器的后備方案绎橘,在并發(fā)收集Concurent Mode Failure時(shí)使用胁孙。
e.parallel old
f.CMS
A:初始標(biāo)記。B:并發(fā)標(biāo)記 C:重新標(biāo)記 D:并發(fā)清除
j.G1 (garbage first)
A:可預(yù)測(cè)的停頓称鳞,將堆內(nèi)存劃分為多個(gè)Region區(qū)域涮较,根據(jù)允許的時(shí)間,收集部分Region冈止,從而能在指定時(shí)間內(nèi)完成垃圾回收
4.垃圾回收概念
a.并行:多個(gè)線程同時(shí)收集
b.并發(fā):垃圾回收線程工作的同時(shí)狂票,用戶線程可以繼續(xù)運(yùn)行
c.吞吐量:CPU運(yùn)行用戶代碼的時(shí)間與CPU總運(yùn)行時(shí)間的比值
d.STW:Stop the world
方法區(qū)垃圾回收
A.廢棄常量和無(wú)用的類
回收條件:a.該類的實(shí)例都已經(jīng)被回收 b.加載該類的ClassLoader被回收 c.該類對(duì)應(yīng)的Class沒(méi)有在任何地方引用,無(wú)法通過(guò)反射訪問(wèn)該類的方法
5.jvm調(diào)優(yōu)
[https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html] 參數(shù)詳解
-Xmx 最大堆
-Xms 最小堆
-Xmn 年輕代
-Xss 棧大小
6.java類加載過(guò)程
加載 -> 驗(yàn)證 -> 準(zhǔn)備 -> 解析 -> 初始化
7.雙親委派機(jī)制:
當(dāng)某個(gè)類加載器需要加載某個(gè).class文件時(shí)靶瘸,它首先把這個(gè)任務(wù)委托給他的上級(jí)類加載器苫亦,遞歸這個(gè)操作,如果上級(jí)的類加載器沒(méi)有加載怨咪,自己才會(huì)去加載這個(gè)類屋剑。
JVM 鎖升級(jí)過(guò)程:
- jdk1.6之前,synchronized是只有兩種鎖狀態(tài)诗眨,無(wú)鎖和重量級(jí)鎖唉匾,加鎖依賴操作系統(tǒng)的互斥量mutex,因此效率低下。
- jdk1.6之后匠楚,對(duì)synchronized進(jìn)行了優(yōu)化巍膘,鎖的狀態(tài)分為四種,無(wú)鎖芋簿、偏向鎖峡懈、輕量級(jí)鎖、重量級(jí)鎖与斤。
- 無(wú)鎖:默認(rèn)就是無(wú)鎖狀態(tài)
- 偏向鎖:當(dāng)一個(gè)線程訪問(wèn)同步代碼塊時(shí)肪康,就會(huì)將鎖狀態(tài)置為偏向鎖狀態(tài)
- 輕量級(jí)鎖:當(dāng)存在鎖競(jìng)爭(zhēng)(鎖競(jìng)爭(zhēng)的定義:如果多個(gè)線程輪流獲取鎖,并且每次獲取都很順利撩穿,不存在阻塞磷支,那就不存在鎖競(jìng)爭(zhēng),只有當(dāng)某個(gè)線程嘗試獲取鎖時(shí)食寡,發(fā)現(xiàn)鎖已經(jīng)被占用雾狈,只能等待其釋放,這才發(fā)生了競(jìng)爭(zhēng))抵皱,偏向鎖將會(huì)升級(jí)為輕量級(jí)鎖善榛,沒(méi)有搶到鎖的線程將自旋獲取鎖(通過(guò)CAS操作將markWord中的線程id修改為自己線程id),這就是一種忙等待的狀態(tài)辩蛋。會(huì)消耗CPU
- 重量級(jí)鎖:當(dāng)鎖競(jìng)爭(zhēng)比較嚴(yán)重的時(shí)候(自旋次數(shù)達(dá)到一定的次數(shù),默認(rèn)是10次锭弊,可以通過(guò)jvm[-XX:PreBlockSpin=<n>]參數(shù)修改)堪澎,鎖將升級(jí)為重量級(jí)鎖,這時(shí)候,其他線程想要獲取鎖的線程將處于阻塞狀態(tài)味滞。
G1收集器可調(diào)參數(shù)
- 暫停時(shí)間: -XX:MaxGcPauseMills 默認(rèn)是200ms,垃圾回收器會(huì)盡量達(dá)成這個(gè)時(shí)間
- Region大小 -XX:G1RegionHeapSize,來(lái)指定樱蛤,若未指定則默認(rèn)最多生成2048塊,每塊的大小需要為2的冪次方剑鞍,如1,2,4,8,16,32昨凡,最大值為32M。Region的大小主要是關(guān)系到Humongous Object的判定蚁署,當(dāng)一個(gè)對(duì)象超過(guò)Region大小的一半時(shí)便脊,則為巨型對(duì)象,那么其會(huì)至少獨(dú)占一個(gè)Region光戈,如果一個(gè)放不下哪痰,會(huì)占用連續(xù)的多個(gè)Region。當(dāng)一個(gè)Humongous Region放入了一個(gè)巨型對(duì)象久妆,可能還有不少剩余空間晌杰,但是不能用于存放其他對(duì)象,這些空間就浪費(fèi)了筷弦。所以如果應(yīng)用里有很多大小差不多的巨型對(duì)象肋演,可以適當(dāng)調(diào)整Region的大小,盡量讓他們以普通對(duì)象的形式分配烂琴,合理利用Region空間
- 新生代比例:-XX:G1NewSizePercent爹殊,默認(rèn)值5%,上限值-XX:G1MaxNewSizePercent(默認(rèn)值60%)
- 參考來(lái)源
Java基礎(chǔ)
HashMap原理
數(shù)組加鏈表
默認(rèn)大小是16
擴(kuò)容 2的冪次方
負(fù)載因子 0.75
數(shù)組不可變奸绷,所以如果在知道容量大小的情況下梗夸,初始化容量。減少因?yàn)閿?shù)組復(fù)制導(dǎo)致的開(kāi)銷号醉。
線程不安全绒瘦,線程安全版本ConcurrentHashMap.
1.8優(yōu)化,鏈表的長(zhǎng)度大于8時(shí)扣癣,鏈表轉(zhuǎn)為紅黑樹(shù),小于6時(shí)會(huì)轉(zhuǎn)回鏈表
ConcurrentHashMap
線程安全
1.7通過(guò)分段鎖機(jī)制
1.8轉(zhuǎn)為通過(guò)CAS加synchronized憨降。數(shù)據(jù)結(jié)構(gòu)也轉(zhuǎn)為紅黑樹(shù)
ArrayList&LinedkList
ArrayList:
數(shù)組實(shí)現(xiàn)父虑,支持隨機(jī)訪問(wèn),搜索和讀取效率高授药。刪除數(shù)據(jù)效率低士嚎,因?yàn)橐苿?dòng)后面的數(shù)據(jù)呜魄,默認(rèn)容量為10,擴(kuò)容1.5倍莱衩。
LinkedList:
鏈表實(shí)現(xiàn)爵嗅,不支持隨機(jī)訪問(wèn),搜索效率低笨蚁。插入刪除效率高睹晒。
CAS
無(wú)鎖化
自旋 消耗CPU
volatile:
內(nèi)存屏障,禁止指令重排括细,內(nèi)存可見(jiàn)性伪很,對(duì)volatile修飾的變量的修改會(huì)立即同步到主內(nèi)存,讀取時(shí)也會(huì)直接從主內(nèi)存讀取奋单,而不會(huì)讀取工作內(nèi)存
鎖升級(jí)
- 偏向鎖:?jiǎn)蝹€(gè)線程锉试,Java偏向鎖旨在對(duì)于無(wú)并發(fā)爭(zhēng)用的前提下,進(jìn)行真正意義上的無(wú)鎖同步
- 輕量級(jí)鎖:多于一個(gè)線程競(jìng)爭(zhēng)時(shí)會(huì)升級(jí)為輕量級(jí)鎖
- 重量級(jí)鎖: 有實(shí)際競(jìng)爭(zhēng)览濒,且鎖競(jìng)爭(zhēng)時(shí)間長(zhǎng)
鎖粗化呆盖,鎖消除
- 在開(kāi)啟逃逸分析和鎖消除的情況下(-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks),如果編譯器認(rèn)為鎖定區(qū)域沒(méi)有逃出作用域贷笛,不存在共享數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題就會(huì)消除不必要的加鎖
單例模式应又,雙重檢查鎖機(jī)制
1.懶漢模式
2.餓漢模式
public class SafeDoubleCheckedLocking {
private volatile static Instance instance;
public static Instance getInstance() {
if (instance == null) {
synchronized (SafeDoubleCheckedLocking.class) {
if (instance == null)
instance = new Instance();//instance為volatile,現(xiàn)在沒(méi)問(wèn)題了
}
}
return instance;
}
}
線程池
1.線程池核心參數(shù)
核心線程數(shù)
最大線程數(shù)
隊(duì)列
拒絕策略
a.直接丟棄 discard
b.丟棄最老的 discardOldest
c.拋出異常 abort
d.調(diào)用線程執(zhí)行 callerRunPolicy
keepAliveTime:線程的空閑存活時(shí)間
線程池execute時(shí)的邏輯:
- 如果此時(shí)線程池中的數(shù)量小于corePoolSize昨忆,即使線程池中的線程都處于空閑狀態(tài)丁频,也要?jiǎng)?chuàng)建新的線程來(lái)處理被添加的任務(wù)。
如果此時(shí)線程池中的數(shù)量等于 corePoolSize邑贴,但是緩沖隊(duì)列 workQueue未滿席里,那么任務(wù)被放入緩沖隊(duì)列。 - 如果此時(shí)線程池中的數(shù)量大于corePoolSize拢驾,緩沖隊(duì)列workQueue滿奖磁,并且線程池中的數(shù)量小于maxPoolSize,建新的線程來(lái)處理被添加的任務(wù)繁疤。
- 如果此時(shí)線程池中的數(shù)量大于corePoolSize咖为,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量等于maxPoolSize稠腊,那么通過(guò)handler所指定的策略來(lái)處理此任務(wù)躁染。也就是:處理任務(wù)的優(yōu)先級(jí)為:核心線程corePoolSize、任務(wù)隊(duì)列workQueue架忌、最大線程 maximumPoolSize吞彤,如果三者都滿了,使用handler處理被拒絕的任務(wù)。
- 當(dāng)線程池中的線程數(shù)量大于corePoolSize時(shí)饰恕,如果某線程空閑時(shí)間超過(guò)keepAliveTime挠羔,線程將被終止。這樣埋嵌,線程池可以動(dòng)態(tài)的調(diào)整池中的線程數(shù)破加。
線程的幾個(gè)狀態(tài) 參考
image.png
image.png
springboot
springboot自動(dòng)配置原理
@EnableAutoConfiguration
加載META-INF下的spring.factories下的EnableAutoConfiguration的值,將這些值作為自動(dòng)配置類導(dǎo)入到spring容器中雹嗦。這些自動(dòng)配置類通過(guò)@Condition條件式注解加載相應(yīng)的bean到spring容器
BeanFactory,FactoryBean,ApplicationContext
spring ioc
依賴注入范舀,控制反轉(zhuǎn),將對(duì)象的創(chuàng)建獲取交給spring容器來(lái)管理俐银。降低耦合
springboot 生命周期
Bean實(shí)例化
↓
bean屬性注入
↓
BeanNameAware.setBeanName
↓
BeanFactoryAware.setBeanFactory
↓
ApplicationContextAware.setApplicationContext
↓ bean的初始化
BeanPostProcessor.postProcessBeforeInitialization
↓
IninitalizingBean.afterPropertiesSet
↓
init-method
↓
BeanPostProcessor.postProcessAfterInitialization
↓
bean的使用
↓ bean的銷毀
DisposableBean.Destory
↓
destory-method方法
AOP:基于動(dòng)態(tài)代理模式
jdk動(dòng)態(tài)代理:實(shí)現(xiàn)接口
cglib動(dòng)態(tài)代理:字節(jié)碼生成技術(shù)尿背,繼承類,對(duì)final類無(wú)效
動(dòng)態(tài)代理:實(shí)現(xiàn)InvocationHandler
靜態(tài)代理:實(shí)現(xiàn)相同的接口
springboot自動(dòng)裝配原理
spring如何解決循環(huán)依賴問(wèn)題
一級(jí)緩存:
/** 保存所有的singletonBean的實(shí)例 */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
二級(jí)緩存:
/** 保存所有早期創(chuàng)建的Bean對(duì)象捶惜,這個(gè)Bean還沒(méi)有完成依賴注入 */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
三級(jí)緩存:
/** singletonBean的生產(chǎn)工廠*/
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** 保存所有已經(jīng)完成初始化的Bean的名字(name) */
private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);
/** 標(biāo)識(shí)指定name的Bean對(duì)象是否處于創(chuàng)建狀態(tài) 這個(gè)狀態(tài)非常重要 */
private final Set<String> singletonsCurrentlyInCreation =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
spring cloud
注冊(cè)中心
eureka,consul,zookeeper田藐,nacos
網(wǎng)關(guān)
springcloud gateway,zuul
斷路器
hystrix,sentinel
hystrix:基于線程隔離、信號(hào)量吱七,控制影響范圍汽久。斷路器,當(dāng)失敗次數(shù)達(dá)到一定比例后會(huì)開(kāi)啟熔斷踊餐,返回fallback,定時(shí)探測(cè)景醇,當(dāng)服務(wù)恢復(fù)后,可以關(guān)閉熔斷機(jī)制吝岭。命令模式三痰。hystrixCommand
openFeign
ribbon
springcloud Bus,Stream
配置中心
nacos,spring config,disconf,阿波羅,consul
鏈路追蹤
zipkin,sluth
分布式事務(wù)
zookeeper和eureka
CAP定理,一致性窜管,可用性散劫,分區(qū)容錯(cuò)性,只能同時(shí)滿足兩項(xiàng)
BASE理論:基本可用幕帆,軟狀態(tài)获搏,最終一致性
seta:強(qiáng)一致性方案
基于消息表的最終一致性
基于事務(wù)消息
兩階段提交
spring cloud 組件
consul配置中心
consul注冊(cè)中心
eureka注冊(cè)中心心跳機(jī)制
Hystrix
Feign
Dubbo
Dubbo架構(gòu)圖
Dubbo Arctitecture
Dubbo注解配置示例
Dubbo SPI
Dubbo 負(fù)載均衡
- 最少活躍數(shù)LeastActive: 發(fā)送請(qǐng)求數(shù)據(jù)減去返回請(qǐng)求數(shù)的值越少的優(yōu)先調(diào)用,能者多勞
sPI
ElasticSearch
golang
channel