一個(gè)會(huì)畫圖的工程師_第1頁
一個(gè)會(huì)畫圖的工程師_第2頁
一個(gè)會(huì)畫圖的工程師_第3頁
一個(gè)會(huì)畫圖的工程師_第4頁
一個(gè)會(huì)畫圖的工程師_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論