一个会画图的工程师_第1页
一个会画图的工程师_第2页
一个会画图的工程师_第3页
一个会画图的工程师_第4页
一个会画图的工程师_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个会画图的工程师

发现小谢图画的很好,虽然有些也是他引用的,但是我觉得还是很好所以这里收集

下。

【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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论