




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个会画图的工程师
发现小谢图画的很好,虽然有些也是他引用的,但是我觉得还是很好所以这里收集
下。
【RocketMQ源码学习】2-Namesrv
1.PUT_KV_CONFIG
2.GET_KV_CONFIG
3-Remoting模块
rocketmq-remoting模块是RocketMQ中负责网络通信的模块,被其他所有需要网
络通信的模块依赖。它是基于Netty实现的,避免了网络编程很多tricky的问题。
首先来看下RocketMQNettyServer的Reactor线程模型,一个Reactor主线程负责
监听TCP连接请求,建立好连接后丢给Reactor线程池,它负责将建立好连接的
socket注册到selector上去(这里有两种方式,NIO和EpolL可配置),然后监
听真正的网络数据。拿到网络数据后,再丢给Worker线程池。
Worker拿到网络数据后,就交给Pipeline,从Head到Tail一个个Handler的走下
去,这些Handler是在创建Server的时候指定的。NettyEncoder和NettyDecoder
负责网络数据和RemotingCommand之间的编解码。NettyServerHandler拿到解码
得至!J的RemotingCommand后,根据RemotingCommand.type来判断是request还
是response,如果是request,就根据RomotingCommand的code(code用来标识不
同类型的请求)去processorTable找到对应的processor,然后封装成task后,丢给
对应的processor线程池,如果是response就根据RemotingCommand.opaque去
responseTable中拿到对应的ResponseFuture,把结果set给它。
对于Client,经过Pipeline的顺序是从Tail至!JHead。不管是Server和Client,并
不是每次数据流转都得经过所有的Handler,而是会根据Context中的一些信息去
判断。
整个数据流转过程中还有很多hook,比如处理command前,处理command后,
发送数据前,发送数据后等。
【RocketMQ源码学习】4-消息发送
Broker端,消息的处理和落地
|SendMessageProcessor|
CONSUMERSENDMSGBACK
|EndTransactionProcessor|
|ENDTRANSACTION一
【RocketMQ源码学习】5-消息消费
Pull的过程比较简单(因为应用代码要去做比较多的事情),所以这里我主要来梳
理一下Push方式的整个过程。
|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源码学习】6-消息存储
写消息MappedFileAppendMessage
[Put
MappedFile和物理文件是一一对应的,append的过程,消息的具体构成如图所示,
大部分字段都很好理解,这里重点关注下queueOffset和physicaloffset.
queueOffset是指对应的consumeQueue中的offset,physicaloffset是指该消息的
物理offset,即图中的wroteOffset,它等于fileFromOffset(当前mappedFile的物理
offset]力口上mappedFile对应的buffer的position(一个逻辑的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也是一个单独的线程,它负责构建ConsumeQueue和Indexo
ConsumeQueue的结构如图:
ConsumeQueue#mappedFileQueue
r..........30W*20
00000000000000000000
0
CommitLogOffset
00000000000006000000
MessageTagHashCode
00000000001200000000
IndexFile
SlotTable
JavaNio
作者jjenkov最后写了一个niodemo/fdx321/java-nio-server.
过了一遍源码,工作过程大致如图:
[Tomcat学习笔记】2-整体架构
下面是Tomcat的整体架构
Server
GlobalNamingResources
Connector
Realm
Connector
Alias
Connector
告MUNDIEnterprise
Naming配直
这个类图是Tomcat最主要的一个结构:
Engine>Host>Context、Wrapper四种Container者B可以配置Valve,即使不配置,
每个Container代码里都有默认的Valve(StandardEngineValve,
StandardHostValve...)是处理请求的时候必须经过的。关于Pipeline和Valve,就
是一个水管中间有多个阀门,每个数据流过来都在阀门的地方被处理一下。四个
容器的Pipeline串起来,可以用张图来描述一下:
【Tomcat学习笔记】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这个枚举类定义了生命周期的各个阶段,这个状态机是这样子滴:
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学习笔记】4-启动流程分析
它们是如何一层一层完成初始化和启动的
以StandardServer为例:
https:属
如下面的时序图所示:
【Tomcat学习笔记】9-ClassLoader
先来张图:
Tomcat的三大ClassLoader
为什么Tomcat里要自定义ClassLoader呢,先来考虑一个问题:一个Tomcat部署
两个应用,Appl和App2,Appl里定义了一个com.fdx.AAA类,App2也定义了一
个com.fdx.AAA类,但是里面的实现是不一样的,如果不自定义ClassLoader,
而都用AppClassLoader来加载的话,你让它加载哪一个呢,一个ClassLoader是
不能加载两个一样的类的。所以,ClassLoader最重要的一个功能就是类隔离。
【Tomcat学习笔记】14-Cluster
TomcatCluster这块代码较多,代码主要在org.apache.catalina.ha和
org.apache.catalina.tribes两个package,ha这个package主要做了两件事,或者说
Tomcatcluster主要就做了这两件事:集群间Session同步和集群War部署。
tribes则是Tomcat集群通讯模块。
Apache/Ngnix
Tomcat做了个集群的功能,大部分功能主要是解决session在集群中的同步,然
而在有点规模的互联网公司都不怎么用它。
1.对于无状态的应用,通过apache/ngnix负载均衡到各个tomcat就可以了
2.对于有状态的(session)应用,往往都自研分布式Session应用。分布式系统下
用Tomcat的session会有很多限制。
Tomcat还做了个功能,监控集群中应用的变更,如果有一台的War包发生了变化,
会通知其他机器自动重新部署。这个功能,在有点规模的互联网公司应该也不会用
它,肯定用自研的运维系统,可以支持更灵活的应用部署,方便和公司的运维体系
打通。
JavaVolatile学习笔记
图片
LocalDRAMOtherCPU
MemorySockets
L2CacheL2Cache
LICache
E
o
n
s
p
eU
sM
TT
ExecutionUnitsExecutionUnits•••
RegistersRegisters
Core1CoreN
说明:他引用的这个作者在JVM方面有一定的研究,图画的不错
/
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等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 有关油罐车车辆租赁合同
- 二手房居间买卖合同
- 消防水电工程合同
- 办公室行政人员聘用合同
- 聘用至退休合同续签书
- 小区智能化系统工程合同书
- 电信行业通信设备维护服务合同
- 9 种豆子 教学设计-2023-2024学年科学二年级下册冀人版
- 第6课 从隋唐盛世到五代十国 教学设计-2023-2024学年统编版(2019)高中历史必修中外历史纲要上册
- Unit 6 Nurturing Nature Developing ideas The best job in the world 教学设计 -2024-2025学年高二英语外研版(2019)选择性必修第一册
- 陕西省西安市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 3、变电站全面巡视记录
- 初中 初三 英语沪教牛津版 9AU7-1 Reading Tom Sawyer paints the fence 9A Unit Reading Tom Sawyer paints the fence
- 创建动物保护家园-完整精讲版课件
- 2021年6月大学英语四级考试真题全三套(含答案解析)
- 各种轴载换算计算方法
- 译林版五年级下册英语 Project 2课件
- 八年级英语15篇完形填空(附答案)
- GB∕T 9286-2021 色漆和清漆 划格试验
- 病假学生追踪记录表
- 手榴弹使用教案
评论
0/150
提交评论