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:
Einige interessante Fragen
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:
Nachdem die Geschäftsmethode ausgeführt wurde, wird das Datenpaket gesendet?
Was ist der Unterschied im Threading-Modell zwischen netty3 und netty4?
Das Datenpaket erreicht den Socket-Puffer des Betriebssystems, was ist passiert?
Das vom Anbieter generierte Protokoll nimmt sehr wenig Zeit in Anspruch, aber auf der Verbraucherseite kommt es zu einer Zeitüberschreitung. Wie können wir das Problem beheben?
Kann das Datenpaket direkt über eine Pipe auf der physikalischen Ebene gesendet werden?
Consumer-Business-Thread wartet auf Bedingung, wann wird er aktiviert?
...
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.
Interessante Reise
1. Dubbo2.5.3 Consumer initiiert eine Anfrage
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队列中。
Als ich mir den Hauptthread noch einmal ansah, stellte ich fest, dass er im Zustand „DefaultFuture“ wartete. Ich wusste nicht, worauf er wartete oder wie lange er warten musste. Ich stand eine Weile in der Warteschlange writeTaskQueue und sah, dass der Netty3-IO-Worker-Thread die Ausführungsmethode endlos ausführte. Jeder nannte dies eine Endlosschleife.
Ich habe einfach aufgezeichnet, was ich heute gesehen habe, und es in ein Bild gezeichnet, die unwichtigen Teile habe ich natürlich ignoriert.
2. Das Betriebssystem sendet ein Datenpaket
Ich habe viele magische Dinge im Socket-Puffer des Betriebssystems erlebt.
An einer Stelle namens Transportschicht habe ich die Ziel-Portnummer und die Quell-Portnummer hinzugefügt
An einer Stelle namens Netzwerkschicht habe ich die Ziel-IP und die Quell-IP hinzugefügt und gleichzeitig Zeit, durch Die Ziel-IP wird mit der Maske UND-verknüpft, um die „nächste Hop“-IP zu finden🎜🎜🎜🎜An einer Stelle namens Datenverbindungsschicht habe ich die „nächste Hop“-Ziel-MAC-Adresse über die ARP-Protokollquelle hinzugefügt MAC-Adresse🎜
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.
3. Erfahrung auf der Anbieterseite
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
Ich werde noch eine Weile im Thread-Pool von AllChannelHandler bleiben, deshalb habe ich auch ein Bild gezeichnet, um die Reise aufzuzeichnen.
Seitdem ist meine Reise zu Ende und neue Geschichten werden mit neuen Datenpaketen fortgesetzt.
4. Ein neues Datenpaket wurde auf der Anbieterseite generiert
Ich bin ein Datenpaket, geboren in einer Stadt namens Dubbo2.7.3 Provider, meine Mission ist es, den vorgesehenen Thread aufzuwecken, als nächstes werde ich Sie Beginnen Sie eine Reise zu einem Ort namens Dubbo2.5.3 Consumer. Nachdem die Provider-Geschäftsmethode ausgeführt wurde
再经过io.netty.util. concurrent.SingleThreadEventExecutor#execute AddTask hinzufügen🎜🎜将任务放入队列io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue🎜🎜我便跟随着io.netty.channel.AbstractChannelHandlerContext$WriteTaskWird 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强的、追求极致的匠人精神。🎜
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的线程池,这是一个业务线程池。
Ich habe hier eine Weile gewartet und darauf gewartet, dass die Aufgabe geplant wird, und ich sah An diesem Punkt ist meine Mission abgeschlossen und diese Reise ist vorbei.
Zusammenfassung der Threading-Modelle von netty3 und netty4
Wir fassen die Threading-Modelle von netty3 und netty4 basierend auf den Selbstbeschreibungen der beiden Datenpakete zusammen.
1. netty4 , Pipeline Es wird vom E/A-Thread ausgeführt.
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!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn