오늘은 Dubbo IO 상호 작용에 대한 기사를 가져왔습니다.
이 기사는 동료가 흥미로운 단어를 사용하여 지루한 지식 포인트를 적어 놓은 것입니다. 이해하기 쉽고 매우 흥미로워서 작성자의 승인을 찾아 모두와 공유하고 싶습니다.
Dubbo는 복잡한 스레딩 모델을 갖춘 뛰어난 RPC 프레임워크입니다. 이 기사에서 저자는 내 피상적인 지식을 바탕으로 Dubbo의 전체 IO 프로세스를 분석합니다. 시작하기 전에 먼저 다음 질문을 살펴보겠습니다.
다음으로 저자는 소비자로 Dubbo2.5.3을 사용하고 공급자로 2.7.3을 사용하여 전체 상호 작용 프로세스를 설명합니다. 저자는 데이터 패킷의 관점에서 이를 설명합니다. 1인칭으로 안전벨트를 매세요.
나는 Dubbo2.5.3 Consumer라는 마을에서 태어난 데이터 패킷입니다. 여행.
어느 날 파견을 앞두고 있었는데, Dubbo 2.7.3 Provider라는 곳으로 가게 되었다고 하더군요.
이 날 비즈니스 스레드는 FailoverClusterInvoker#doInvoke code> 공급자를 선택한 다음 다양한 소비자 필터를 통과한 다음 Netty3 파이프라인을 통과하고 마지막으로 <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius : 4px ;여백: 0 2px;배경색: rgba(27,31,35,.05);글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: # ff6441; ">NioWorker#scheduleWriteIfNecessary
메소드, NioWorker의 writeTaskQueue 대기열에 왔습니다. FailoverClusterInvoker#doInvoke
我选择了一个Provider,然后经过各种Consumer Filter,再经过Netty3的pipeline,最后通过NioWorker#scheduleWriteIfNecessary
方法,我来到了NioWorker的writeTaskQueue队列中。
当我回头看主线程时,发现他在DefaultFuture中的Condition等待,我不知道他在等什么,也不知道他要等多久。
我在writeTaskQueue队列排了一会队,看到netty3 IO worker线程在永不停歇的执行run方法,大家都称这个为死循环。
最后,我很幸运,NioWorker#processWriteTaskQueue
운영체제 소켓 버퍼에서 마법 같은 일을 많이 경험했다.
가장 흥미로운 점은 케이블카를 구간별로 탈 때마다 대상 MAC 주소와 소스 MAC 주소를 수정해야 한다는 것입니다. 이 모드를 "Next Jump"라고 부르는 동일한 업계에서는 점프 후 점프를 뛰어넘습니다. 여기에는 많은 데이터 패킷이 있으며 큰 것은 하나의 케이블카에 있고 작은 것은 하나의 케이블카에 압착되어 있습니다. 더 큰 경우 여러 케이블로 분할해야합니다. (우리의 데이터 패킷에는 중요하지 않지만) 이것을 포장 풀기 및 붙이기라고 합니다. 이 기간 동안 우리는 스위치와 라우터를 통과했으며 이러한 장소는 매우 즐거웠습니다.
물론 불쾌한 일, 즉 혼잡도 있습니다. 목적지의 케이블카는 꽉 차서 데려갈 시간이 없어서 기다릴 수 밖에 없습니다.
마침내 목적지에 도착했습니다. "Zero Copy"라는 쾌속정을 타고 빠르게 netty4에 도착했습니다. 그는 포장 풀기와 접착을 처리할 수 있습니다. NioEventLoop#processSelectedKeys
,再经过pipeline中的各种入站handler,我来到了AllChannelHandler的线程池,当然我有很多选择,但是我随便选了一个目的地,这里会经历解码、一系列的Filter,才会来的目的地“业务方法”,NettyCodecAdapter#InternalDecoder
io.netty.channel.AbstractChannelHandlerContext#writeAndFlush
io.netty.channel.AbstractChannelHandlerContext#writeAndFlush
io.netty.util.concurrent.SingleThreadEventExecutor#execute
执行addTaskio.netty.util.concurrent.SingleThreadEventExecutor#taskQueue
io.netty.channel.AbstractChannelHandlerContext$WriteTask
等待NioEventLoop发车,等待的过程中,我记录了走过的脚步。在这里,我看到NioEventLoop是一个死循环,不停地从任务队列取任务,执行任务AbstractChannelHandlerContext.WriteAndFlushTask
,然后指引我们到socket缓冲区等候,永不知疲倦,我似乎领略到他身上有一种倔强的、追求极致的匠人精神。
经过io.netty.channel.AbstractChannel.AbstractUnsafe#write
io.netty.util. 동시.SingleThreadEventExecutor#execute
执行addTask🎜🎜将任务放入队列io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue
🎜🎜我便跟随着io.netty.channel.AbstractChannelHandlerContext$WriteTask
等待NioEventLoop发车,等待的过程中,我记录了走过的脚步。 여기에서 ,我看到NioEventLoop是一个死循环,不停地从任务队列取任务,执行任务AbstractChannelHandlerContext.WriteAndFlushTask
, 우리는 소켓을 사용하여 소켓을 사용하고 있습니다.匠人精神。🎜
经过io.netty.channel.AbstractChannel.AbstractUnsafe#write
과대다양한 장소, 也是做缆车达到目的地.
dubbo 2.5.3 Consumer 도착 후 운영체제 소켓 버퍼에서 잠시 기다리다가 "Zero Copy" 스피드보트를 타고 도착했다. 실제 목적지. 목적지 dubbo 2.5.3 소비자, 여기서 찾았습니다. NioWorker#run는 무한 루프가 된 후 <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px; background-color: rgba( 27,31,35,.05);글꼴 계열: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #ff6441;">NioWorker#processSelectedKeys
, NioWorker#read 읽는 방법으로 스레드 풀에 도달했습니다. AllChannelHandler의 비즈니스 스레드 풀입니다. NioWorker#run
是一个死循环,然后执行NioWorker#processSelectedKeys
,通过NioWorker#read
方式读出来,我就到达了AllChannelHandler的线程池,这是一个业务线程池。
我在这里等待一会,等任务被调度,我看见com.alibaba.dubbo.remoting.exchange.support.DefaultFuture#doReceived
com.alibaba .dubbo.remoting.exchange.support.DefaultFuture#doReceived
가 실행됨과 동시에 Condition의 시그널이 실행되었습니다. 멀리서 막힌 실이 깨어나는 것을 보니, 내가 도착했기 때문에 잠든 실이 깨어난 것임을 이해한 것 같았다. 이것이 내 삶의 의미가 되어야 한다고 생각한다. 이 시점에서 내 임무는 완료되었고 이번 여행도 끝났습니다. 위 내용은 골드 함량이 높은 더보 면접 질문 5가지!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!