Heim > Java > JavaInterview Fragen > Hauptteil

5 Dubbo-Interviewfragen mit hohem Goldgehalt!

Freigeben: 2023-08-17 16:04:16
nach vorne
1009 Leute haben es durchsucht

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队列中。

当我回头看主线程时,发现他在DefaultFuture中的Condition等待,我不知道他在等什么,也不知道他要等多久。

我在writeTaskQueue队列排了一会队,看到netty3 IO worker线程在永不停歇的执行run方法,大家都称这个为死循环。

最后,我很幸运,NioWorker#processWriteTaskQueue

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.
5 Dubbo-Interviewfragen mit hohem Goldgehalt!Endlich hatte ich Glück, NioWorker#processWriteTaskQueue hat mich ausgewählt, ich wurde in den Socket-Puffer des Betriebssystems geschrieben. Wie dem auch sei, es gab genug Zeit, um über die heutige Reise nachzudenken, nämlich den Haupt-Thread und den Netty3-IO Worker-Thread. Nun, beide Reisegruppendienste sind alle gut und sehr effizient.

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
  1. Ich habe viele magische Dinge im Socket-Puffer des Betriebssystems erlebt.

  2. An einer Stelle namens Transportschicht habe ich die Ziel-Portnummer und die Quell-Portnummer hinzugefügt

  3. 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

5 Dubbo-Interviewfragen mit hohem Goldgehalt!
Ich werde noch eine Weile im Thread-Pool von AllChannelHandler bleiben, deshalb habe ich auch ein Bild gezeichnet, um die Reise aufzuzeichnen.

5 Dubbo-Interviewfragen mit hohem Goldgehalt!
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.channel.AbstractChannelHandlerContext#writeAndFlush
  • io.netty.channel.AbstractChannelHandlerContext#writeAndFlush
  • 再经过io.netty.util.concurrent.SingleThreadEventExecutor#execute 执行addTask
  • 将任务放入队列io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue
  • 我便跟随着io.netty.channel.AbstractChannelHandlerContext$WriteTask等待NioEventLoop发车,等待的过程中,我记录了走过的脚步。
  • 5 Dubbo-Interviewfragen mit hohem Goldgehalt!

    在这里,我看到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$WriteTaskWird die NioEventLoop-Funktion verwendet, um die Funktion „NioEventLoop“ zu verwenden, um die Funktion „NioEventLoop“ zu verwenden.
    5 Dubbo-Interviewfragen mit hohem Goldgehalt!

    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和大多数数据包一样,也是做缆车达到目的地.🎜

    5. Ankunft bei Dubbo 2.5.3 Consumer

    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

    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.

    Zusammenfassung: Der Unterschied zwischen den Thread-Modellen netty3 und netty4 liegt im Schreibprozess. In netty3 wird die Pipeline vom Geschäftsthread ausgeführt, während die Pipeline in netty4 unabhängig vom Lesen und Schreiben vom IO-Thread ausgeführt wird. 5 Dubbo-Interviewfragen mit hohem Goldgehalt!

    Die Handlerkette in der ChannelPipeline in netty4 wird vom E/A-Thread einheitlich seriell geplant. Unabhängig davon, ob es sich um einen Lese- oder Schreibvorgang handelt, wird der Schreibvorgang in netty3 vom Geschäftsthread verarbeitet. In netty4 kann der durch den Kontextwechsel zwischen Threads verursachte Zeitverbrauch reduziert werden, in netty3 können Geschäftsthreads jedoch Handlerketten gleichzeitig ausführen. Wenn es einige zeitaufwändige Handler-Vorgänge gibt, die zu einer geringen Effizienz von netty4 führen, können Sie erwägen, diese zeitaufwändigen Vorgänge zuerst im Geschäftsthread auszuführen, anstatt sie im Handler zu verarbeiten. Da Geschäftsthreads gleichzeitig ausgeführt werden können, kann auch die Effizienz verbessert werden.

    Einige schwierige Problembehebung

    Ich bin auf einige typische schwierige Probleme gestoßen, z. B. wenn das vom Anbieter versprochene didi.log normale Zeit in Anspruch nimmt, die Verbraucherseite jedoch eine Zeitüberschreitung erfährt Anweisungen zur Fehlerbehebung, didi.log Der Filter befindet sich tatsächlich auf einer sehr inneren Ebene und kann oft nicht die tatsächliche Ausführung von Geschäftsmethoden widerspiegeln.

    1. Provider Neben der Ausführung der Geschäftsrichtung kann die Serialisierung auch zeitaufwändig sein. Daher können Sie arthas verwenden, um die äußerste Methode org.apache.dubbo.remoting.transport.DecodeHandler#received zu überwachen und Geschäftsmethoden auszuschließen, die vorhanden sind zeitaufwendig. Frage

    2. Ob es Zeit braucht, Datenpakete im Provider zu schreiben? Überwachen Sie die io.netty.channel.AbstractChannelHandlerContext#invokeWrite-Methode

    3. Sie können auch einige Informationen zum aktuellen TCP überprüfen Socket über Netstat, wie Recv-Q , Send-Q und Recv-Q sind Daten, die im Empfangspuffer angekommen sind, aber noch nicht vom Anwendungscode gelesen wurden. Send-Q hat den Sendepuffer erreicht, aber die andere Partei hat noch nicht mit den Ack-Daten geantwortet. Diese beiden Arten von Daten sammeln sich im Allgemeinen nicht an. Wenn sie sich ansammeln, liegt möglicherweise ein Problem vor.

    5 Dubbo-Interviewfragen mit hohem Goldgehalt!
    1. Überprüfen Sie, ob die Consumer NioWorker#processSelectedKeys (dubbo2.5.3)-Methode zeitaufwändig ist.

    2. Bis in alle Details des gesamten Links... das Problem ist definitiv lösbar.

    Epilog

    Während des gesamten Interaktionsprozesses lässt der Autor einige Details zu Thread-Stack-Aufrufen und Quellcodedetails aus, wie z. B. Serialisierung und Deserialisierung, wie Dubbo das vollständige Datenpaket liest, wie die Filter sind sortiert und verteilt, bevor die Geschäftsmethode ausgeführt wird, und wie wird der Reaktormodus von Netty implementiert? Das sind sehr interessante Fragen...

    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!

    Verwandte Etiketten:
    Quelle:Java后端技术全栈
    Erklärung dieser 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
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!