版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一個(gè)會(huì)畫圖的工程師
發(fā)現(xiàn)小謝圖畫的很好,雖然有些也是他引用的,但是我覺得還是很好所以這里收集
下。
【RocketMQ源碼學(xué)習(xí)】2-Namesrv
1.PUT_KV_CONFIG
2.GET_KV_CONFIG
3-Remoting模塊
rocketmq-remoting模塊是RocketMQ中負(fù)責(zé)網(wǎng)絡(luò)通信的模塊,被其他所有需要網(wǎng)
絡(luò)通信的模塊依賴。它是基于Netty實(shí)現(xiàn)的,避免了網(wǎng)絡(luò)編程很多tricky的問題。
首先來看下RocketMQNettyServer的Reactor線程模型,一個(gè)Reactor主線程負(fù)責(zé)
監(jiān)聽TCP連接請(qǐng)求,建立好連接后丟給Reactor線程池,它負(fù)責(zé)將建立好連接的
socket注冊(cè)到selector上去(這里有兩種方式,NIO和EpolL可配置),然后監(jiān)
聽真正的網(wǎng)絡(luò)數(shù)據(jù)。拿到網(wǎng)絡(luò)數(shù)據(jù)后,再丟給Worker線程池。
Worker拿到網(wǎng)絡(luò)數(shù)據(jù)后,就交給Pipeline,從Head到Tail一個(gè)個(gè)Handler的走下
去,這些Handler是在創(chuàng)建Server的時(shí)候指定的。NettyEncoder和NettyDecoder
負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)和RemotingCommand之間的編解碼。NettyServerHandler拿到解碼
得至!J的RemotingCommand后,根據(jù)RemotingCommand.type來判斷是request還
是response,如果是request,就根據(jù)RomotingCommand的code(code用來標(biāo)識(shí)不
同類型的請(qǐng)求)去processorTable找到對(duì)應(yīng)的processor,然后封裝成task后,丟給
對(duì)應(yīng)的processor線程池,如果是response就根據(jù)RemotingCommand.opaque去
responseTable中拿到對(duì)應(yīng)的ResponseFuture,把結(jié)果set給它。
對(duì)于Client,經(jīng)過Pipeline的順序是從Tail至!JHead。不管是Server和Client,并
不是每次數(shù)據(jù)流轉(zhuǎn)都得經(jīng)過所有的Handler,而是會(huì)根據(jù)Context中的一些信息去
判斷。
整個(gè)數(shù)據(jù)流轉(zhuǎn)過程中還有很多hook,比如處理command前,處理command后,
發(fā)送數(shù)據(jù)前,發(fā)送數(shù)據(jù)后等。
【RocketMQ源碼學(xué)習(xí)】4-消息發(fā)送
Broker端,消息的處理和落地
|SendMessageProcessor|
CONSUMERSENDMSGBACK
|EndTransactionProcessor|
|ENDTRANSACTION一
【RocketMQ源碼學(xué)習(xí)】5-消息消費(fèi)
Pull的過程比較簡(jiǎn)單(因?yàn)閼?yīng)用代碼要去做比較多的事情),所以這里我主要來梳
理一下Push方式的整個(gè)過程。
|Rcbuucclmpl|[rabalanceSerrlce]
BubscriptionZaner
AnamorvAddrListMbiertpitoaDati
PullMeaaageServlca
Scheduled線程
topicSubacrib?lnfoTabla
--SiSPulIM*
____clanOfllineBrokcr
send!lanbatToAHBrokcrWithLockPullKaquait
pullKwueatQuoua
?updataToplcRoutalnfoFrooli
|DcfaultMqProducerlmpl|
topicPublisMnfoTable
IMQCUrntliutanccI
producttrrabls
erovplMQFr?duc*rlBMr
|OefaultMQPu>h<'nn?umer|
Broiip:MQHr*du?rln??r
clicBtCoafig
叫rb?l?r5*mT;M?p<br?k?]<Ud<lrw]
各和API
?|DefaultMQPuihCon?umerlinc
【RocketMQ源碼學(xué)習(xí)】6-消息存儲(chǔ)
寫消息MappedFileAppendMessage
[Put
MappedFile和物理文件是一一對(duì)應(yīng)的,append的過程,消息的具體構(gòu)成如圖所示,
大部分字段都很好理解,這里重點(diǎn)關(guān)注下queueOffset和physicaloffset.
queueOffset是指對(duì)應(yīng)的consumeQueue中的offset,physicaloffset是指該消息的
物理offset,即圖中的wroteOffset,它等于fileFromOffset(當(dāng)前mappedFile的物理
offset]力口上mappedFile對(duì)應(yīng)的buffer的position(一個(gè)邏輯的offset).
1024*1024*1024
00000000000000000000
TOTALSIZE
MAGICCOOE
BOOYCRC
QUEUEID
00000000001073741824
PHYSICALOFFSET
00000000002147483648
:YSFSG
BORNTIMESTAMP
SIORtlIMtSIAfP
STOREIP
currentPos/wrotePosition=xxxxxSTOREPORT
RECONSUMETIMES
wroteOffset(物理Offset)=fileFromOfTset+currentPos
=00000000002147483648+xxxxx、、
fileFromOfTset=00000000002147483648PreparedTransactionOffset
oodyLengtn
txxlyContent
topicLength|topic
propertiesLengtpropertiesData
ReputMessageService也是一個(gè)單獨(dú)的線程,它負(fù)責(zé)構(gòu)建ConsumeQueue和Indexo
ConsumeQueue的結(jié)構(gòu)如圖:
ConsumeQueue#mappedFileQueue
r..........30W*20
00000000000000000000
0
CommitLogOffset
00000000000006000000
MessageTagHashCode
00000000001200000000
IndexFile
SlotTable
JavaNio
作者jjenkov最后寫了一個(gè)niodemo/fdx321/java-nio-server.
過了一遍源碼,工作過程大致如圖:
[Tomcat學(xué)習(xí)筆記】2-整體架構(gòu)
下面是Tomcat的整體架構(gòu)
Server
GlobalNamingResources
Connector
Realm
Connector
Alias
Connector
告MUNDIEnterprise
Naming配直
這個(gè)類圖是Tomcat最主要的一個(gè)結(jié)構(gòu):
Engine>Host>Context、Wrapper四種Container者B可以配置Valve,即使不配置,
每個(gè)Container代碼里都有默認(rèn)的Valve(StandardEngineValve,
StandardHostValve...)是處理請(qǐng)求的時(shí)候必須經(jīng)過的。關(guān)于Pipeline和Valve,就
是一個(gè)水管中間有多個(gè)閥門,每個(gè)數(shù)據(jù)流過來都在閥門的地方被處理一下。四個(gè)
容器的Pipeline串起來,可以用張圖來描述一下:
【Tomcat學(xué)習(xí)筆記】3-組件聲明周期
?lnterface?
?lnterface?
Lifecycle
MBeanRegistration
+init()
+preRegister()
+start()
+postRegister()
+stop()
+preDeregiter()
+destroy()
+postDeregiter()
+addLifecycleListener
LifecycleEvent
+type
+data
LifecycleSupport
+listeners:LifecycleListener[]<
+fireLifecycIeEvent()
?lnterface?
LifecycleListener
+lifecycleEvent
LifecycleState這個(gè)枚舉類定義了生命周期的各個(gè)階段,這個(gè)狀態(tài)機(jī)是這樣子滴:
start()
Iinit()
NEW-?—INITIALIZING
|auto
\|/start()\autoautostop()
INITIALIZEDSTARTINGPREPSTARTINGSTARTED
destroy()I
autoauto
MUSTSTOP
\l/autoautostart()
STOPPINGPREPSTOPPINGSTOPPED
stop()
auto
MUST_DESTROY
|auto
destroy;)M/destroy()
FAILEDDESTROYING
destroy。|auto
\|/
DESTROYED
stop()
【Tomcat學(xué)習(xí)筆記】4-啟動(dòng)流程分析
它們是如何一層一層完成初始化和啟動(dòng)的
以StandardServer為例:
https:屬
如下面的時(shí)序圖所示:
【Tomcat學(xué)習(xí)筆記】9-ClassLoader
先來張圖:
Tomcat的三大ClassLoader
為什么Tomcat里要自定義ClassLoader呢,先來考慮一個(gè)問題:一個(gè)Tomcat部署
兩個(gè)應(yīng)用,Appl和App2,Appl里定義了一個(gè)com.fdx.AAA類,App2也定義了一
個(gè)com.fdx.AAA類,但是里面的實(shí)現(xiàn)是不一樣的,如果不自定義ClassLoader,
而都用AppClassLoader來加載的話,你讓它加載哪一個(gè)呢,一個(gè)ClassLoader是
不能加載兩個(gè)一樣的類的。所以,ClassLoader最重要的一個(gè)功能就是類隔離。
【Tomcat學(xué)習(xí)筆記】14-Cluster
TomcatCluster這塊代碼較多,代碼主要在org.apache.catalina.ha和
org.apache.catalina.tribes兩個(gè)package,ha這個(gè)package主要做了兩件事,或者說
Tomcatcluster主要就做了這兩件事:集群間Session同步和集群War部署。
tribes則是Tomcat集群通訊模塊。
Apache/Ngnix
Tomcat做了個(gè)集群的功能,大部分功能主要是解決session在集群中的同步,然
而在有點(diǎn)規(guī)模的互聯(lián)網(wǎng)公司都不怎么用它。
1.對(duì)于無狀態(tài)的應(yīng)用,通過apache/ngnix負(fù)載均衡到各個(gè)tomcat就可以了
2.對(duì)于有狀態(tài)的(session)應(yīng)用,往往都自研分布式Session應(yīng)用。分布式系統(tǒng)下
用Tomcat的session會(huì)有很多限制。
Tomcat還做了個(gè)功能,監(jiān)控集群中應(yīng)用的變更,如果有一臺(tái)的War包發(fā)生了變化,
會(huì)通知其他機(jī)器自動(dòng)重新部署。這個(gè)功能,在有點(diǎn)規(guī)模的互聯(lián)網(wǎng)公司應(yīng)該也不會(huì)用
它,肯定用自研的運(yùn)維系統(tǒng),可以支持更靈活的應(yīng)用部署,方便和公司的運(yùn)維體系
打通。
JavaVolatile學(xué)習(xí)筆記
圖片
LocalDRAMOtherCPU
MemorySockets
L2CacheL2Cache
LICache
E
o
n
s
p
eU
sM
TT
ExecutionUnitsExecutionUnits???
RegistersRegisters
Core1CoreN
說明:他引用的這個(gè)作者在JVM方面有一定的研究,圖畫的不錯(cuò)
/
Socket1Socket2
Registers/Buffers
~1cycle<1ns
~3cycles~1ns
~12cycles~3ns
~38cycles~12ns
QPI~40ns
~65ns
終于搞清楚Java的日志了
Java的日志框架很多,JUL,Log4J,Lobback,JCL,SLF4J等
先來看下slf4j官方的一張圖:
SLF4Jboundtologback-classicwithSLF4JboundtoIog4jwith
redirectionofcommons-logging,Iog4jredirectionofcommons-logging
andjava.util.loggingtoSLF4Jandjava.util.loggingtoSLF4J
SLF4Jboundtojava.util.loggingwith
redirectionofcommons-loggingand
Iog4jtoSLF4J
Thesediagramsillustrateallpossible
redirectionsforvariousbindingsfor
reasonsofconvenienceandexpediency.
Redirectionsshouldbeperformedonly
whennecessary.Forinstance,itmakes
nosensetoredirectjava.util.loggingto
SLF4Jifjava.util.loggingis
notbeingusedinyourapplication.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025股份代持合同協(xié)議書范本標(biāo)準(zhǔn)版
- 2025建筑安裝工程拆遷房屋合同模板
- 2024年果樹種植基地建設(shè)與運(yùn)營(yíng)合同
- 2024事業(yè)單位員工終止聘用合同及離職手續(xù)及工作交接及安置協(xié)議3篇
- 2024年版加工承攬合同:服裝制造商與品牌商之間的服裝生產(chǎn)與質(zhì)量要求
- 2024年度中小企業(yè)知識(shí)產(chǎn)權(quán)融資合同3篇
- 虛擬現(xiàn)實(shí)中石化施工合同
- 廣場(chǎng)環(huán)保活動(dòng)租賃合同
- 工業(yè)煙囪維修施工合同
- 影視行業(yè)招投標(biāo)風(fēng)險(xiǎn)與防控
- Unit2Whattimedoyougotoschool?大單元整體教學(xué)設(shè)計(jì)人教版七年級(jí)英語下冊(cè)
- 建筑防雷與接地-等電位連接
- 2024行政法與行政訴訟法論述題
- 國(guó)際貨運(yùn)代理業(yè)現(xiàn)狀及發(fā)展對(duì)策分析-以KX公司為例
- 施工現(xiàn)場(chǎng)安全文明施工管理處罰細(xì)則
- 重慶洪崖洞旅游營(yíng)銷策劃
- 消費(fèi)者調(diào)查訪談提綱模板
- 山東建筑大學(xué)混凝土結(jié)構(gòu)原理期末考試復(fù)習(xí)題
- 消化道腫瘤的診斷和治療
- 護(hù)理病例報(bào)告范文5篇
- 班主任基本功大賽:模擬情景題及參考答案匯編(小學(xué)組)
評(píng)論
0/150
提交評(píng)論