Heim >Java >JavaInterview Fragen >5 Dubbo-Interviewfragen mit hohem Goldgehalt!
Heute bringe ich Ihnen einen Artikel über die Dubbo IO-Interaktion.
Dieser Artikel wurde von einem Kollegen geschrieben. Er verwendet interessante Worte, um langweilige Wissenspunkte aufzuschreiben. Er ist leicht zu verstehen und sehr interessant, daher kann ich es kaum erwarten, die Autorisierung zu finden und ihn mit allen zu teilen:
Dubbo ist ein hervorragendes RPC-Framework mit komplexen Threading-Modellen. In diesem Artikel analysiert der Autor den gesamten IO-Prozess von Dubbo basierend auf meinem oberflächlichen Wissen. Bevor wir beginnen, schauen wir uns zunächst die folgenden Fragen an:
Als nächstes verwendet der Autor Dubbo2.5.3 als Verbraucher und 2.7.3 als Anbieter, um den gesamten Interaktionsprozess zu beschreiben. Der Autor steht in der Perspektive des Datenpakets und erzählt es in der Ich-Perspektive. Anschnallen. Los geht's.
Ich bin ein Datenpaket, geboren in einer Stadt namens Dubbo2.5.3 Consumer, meine Mission ist es, Informationen zu liefern und auch Spaß zu haben reisen.
Eines Tages sollte ich rausgeschickt werden. Es hieß, ich würde zu einem Ort namens Dubbo 2.7.3 Provider gehen.
An diesem Tag initiierte der Geschäftsthread einen Methodenaufruf im FailoverClusterInvoker#doInvoke code> Ich habe einen Anbieter ausgewählt, dann verschiedene Verbraucherfilter durchlaufen, dann die Netty3-Pipeline und schließlich <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius" : rgba operator mono consolas monaco menlo monospace break-all ff6441>NioWorker#scheduleWriteIfNecessary
Methode, ich bin zur writeTaskQueue-Warteschlange von NioWorker gekommen. FailoverClusterInvoker#doInvoke
我选择了一个Provider,然后经过各种Consumer Filter,再经过Netty3的pipeline,最后通过NioWorker#scheduleWriteIfNecessary
方法,我来到了NioWorker的writeTaskQueue队列中。
当我回头看主线程时,发现他在DefaultFuture中的Condition等待,我不知道他在等什么,也不知道他要等多久。
我在writeTaskQueue队列排了一会队,看到netty3 IO worker线程在永不停歇的执行run方法,大家都称这个为死循环。
最后,我很幸运,NioWorker#processWriteTaskQueue
Ich habe viele magische Dinge im Socket-Puffer des Betriebssystems erlebt.
Das Interessanteste ist, dass wir jedes Mal, wenn wir eine Seilbahn wechselten, die Ziel-MAC-Adresse und die Quell-MAC-Adresse ändern mussten. Später fragte ich meine Datenpaketfreunde In derselben Branche heißt dieser Modus „Nächster Sprung“, springe von einem Sprung zum nächsten. Hier sind viele Datenpakete in einer einzigen Seilbahn, und die kleineren sind in einer Seilbahn gequetscht. Wenn sie größer sind, müssen sie auch in mehrere Seilbahnen aufgeteilt werden Autos (obwohl dies für unsere Datenpakete keine Rolle spielt), nennt man das Auspacken und Kleben. In dieser Zeit kamen wir an Switches und Routern vorbei, mit denen wir sehr gerne spielten.
Natürlich gibt es auch unangenehme Dinge, nämlich Staus am Zielort und es bleibt keine Zeit, sich Zeit zu nehmen, also kann man nur warten.
Endlich bin ich am Ziel angekommen und bin schnell bei Netty4 angekommen. Er beherrscht das Auspacken und Kleben. 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. concurrent.SingleThreadEventExecutor#execute
AddTask hinzufügen🎜🎜将任务放入队列io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue
🎜🎜我便跟随着io.netty.channel.AbstractChannelHandlerContext$WriteTask
Wird die NioEventLoop-Funktion verwendet, um die Funktion „NioEventLoop“ zu verwenden, um die Funktion „NioEventLoop“ zu verwenden. Anzeigen Sie können NioEventLoop verwenden, um eine Nachricht zu erhalten ;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #ff6441; ">AbstraktChannelHandlerContext.WriteAndFlushTask强的、追求极致的匠人精神。🎜
经过io.netty.channel.AbstractChannel.AbstractUnsafe#write
和大多数数据包一样,也是做缆车达到目的地.🎜
Nachdem ich bei Dubbo 2.5.3 Consumer angekommen war, wartete ich eine Weile im Betriebssystem-Socket-Puffer und nahm dann das Schnellboot „Zero Copy“ und kam an echtes Ziel. Das Ziel Dubbo 2.5.3 Consumer, hier habe ich gefunden, NioWorker#run ist eine Endlosschleife und führt dann <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);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #ff6441;">NioWorker#processSelectedKeys
, through NioWorker#read Um es vorzulesen, habe ich den Thread-Pool erreicht von AllChannelHandler, Dies ist ein Business-Thread-Pool. NioWorker#run
是一个死循环,然后执行NioWorker#processSelectedKeys
,通过NioWorker#read
方式读出来,我就到达了AllChannelHandler的线程池,这是一个业务线程池。
我在这里等待一会,等任务被调度,我看见com.alibaba.dubbo.remoting.exchange.support.DefaultFuture#doReceived
An diesem Punkt ist meine Mission abgeschlossen und diese Reise ist vorbei.
Wir fassen die Threading-Modelle von netty3 und netty4 basierend auf den Selbstbeschreibungen der beiden Datenpakete zusammen.
Das obige ist der detaillierte Inhalt von5 Dubbo-Interviewfragen mit hohem Goldgehalt!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!