Aujourd'hui, je vous propose un article sur l'interaction Dubbo IO.
Cet article est écrit par un collègue. Il utilise des mots intéressants pour écrire des points de connaissances ennuyeux. C'est facile à comprendre et très intéressant, j'ai donc hâte de trouver l'autorisation de l'auteur et de le partager avec tout le monde :
Dubbo est un excellent framework RPC avec des modèles de threads complexes Dans cet article, l'auteur analyse l'ensemble du processus IO de Dubbo sur la base de mes connaissances superficielles. Avant de commencer, examinons d'abord les questions suivantes :
Ensuite, l'auteur utilisera Dubbo2.5.3 comme consommateur et 2.7.3 comme fournisseur pour décrire l'ensemble du processus d'interaction. L'auteur se place dans la perspective du paquet de données et le raconte. à la première personne. Attachez votre ceinture.
Je suis un paquet de données, né dans une ville appelée Dubbo2.5.3 Consommateur, ma mission est de fournir des informations et j'apprécie également voyages.
Un jour, j'étais sur le point d'être envoyé. On a dit que j'allais à un endroit appelé Dubbo 2.7.3 Provider.
Ce jour-là, le fil métier a lancé un appel de méthode, dans FailoverClusterInvoker#doInvoke code> J'ai choisi un fournisseur, puis je suis passé par divers filtres grand public, puis par le pipeline Netty3, et enfin j'ai passé <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius : 4px ;marge : 0 2px ;couleur d'arrière-plan : rgba(27,31,35,.05) ;famille de polices : Operator Mono, Consolas, Monaco, Menlo, monospace ;saut de mot : break-all ;couleur : # ff6441; ">NioWorker#scheduleWriteIfNecessary
, je suis arrivé à la file d'attente writeTaskQueue de NioWorker. FailoverClusterInvoker#doInvoke
我选择了一个Provider,然后经过各种Consumer Filter,再经过Netty3的pipeline,最后通过NioWorker#scheduleWriteIfNecessary
方法,我来到了NioWorker的writeTaskQueue队列中。
当我回头看主线程时,发现他在DefaultFuture中的Condition等待,我不知道他在等什么,也不知道他要等多久。
我在writeTaskQueue队列排了一会队,看到netty3 IO worker线程在永不停歇的执行run方法,大家都称这个为死循环。
最后,我很幸运,NioWorker#processWriteTaskQueue
J'ai vécu beaucoup de choses magiques dans le tampon du socket du système d'exploitation.
Le plus intéressant c'est que nous avons pris un téléphérique section par section. Chaque fois que nous changeions de téléphérique, nous devions modifier l'adresse MAC cible et l'adresse MAC source. Plus tard, j'ai demandé à mes amis du paquet de données dans le. même industrie que ce mode s'appelle "Next Jump", sautez saut après saut. Il y a beaucoup de paquets de données ici. Les plus gros sont dans un seul téléphérique, et les plus petits sont regroupés dans un seul téléphérique. Il y a aussi une chose terrible s'ils sont plus gros, ils doivent être divisés en plusieurs câbles. voitures (bien que cela n'ait pas d'importance pour nos paquets de données). Question), cela s'appelle le déballage et le collage. Pendant cette période, nous avons croisé des commutateurs et des routeurs, et nous étions très heureux de jouer avec ces endroits.
Bien sûr, il y a aussi des choses désagréables, c'est-à-dire des embouteillages, le téléphérique à destination est plein, et il n'y a pas de temps pour être emporté, donc vous ne pouvez qu'attendre.
Finalement, je suis arrivé à destination, je suis monté sur un hors-bord appelé "Zero Copy" et je suis rapidement arrivé à netty4, c'était vraiment magnifique. Après NioEventLoop#processSelectedKeys
,再经过pipeline中的各种入站handler,我来到了AllChannelHandler的线程池,当然我有很多选择,但是我随便选了一个目的地,这里会经历解码、一系列的Filter,才会来的目的地“业务方法”,NettyCodecAdapter#InternalDecoder
decoder C'est génial, il peut s'occuper du déballage et du collage.
Je vais rester dans le pool de threads d'AllChannelHandler pendant un moment, j'ai donc également dessiné une image pour enregistrer le voyage.
Depuis, mon voyage est terminé, et de nouvelles histoires se poursuivront avec de nouveaux packages de données.
Je suis un paquet de données, né dans une ville appelée Dubbo2.7.3 Provider, ma mission est de réveiller le fil destiné, ensuite je vous le ferai. commencez un voyage vers un endroit appelé Dubbo2.5.3 Consumer.
Une fois la méthode commerciale du fournisseur exécutée
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🎜🎜将任务放入队列io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue
🎜🎜我便跟随着经过io.netty.channel.AbstractChannel.AbstractUnsafe#write
,和大多数数据包一样,也是做缆车达到目的地。🎜
5. Arrivée à Dubbo 2.5.3 Consumer
Après être arrivé à Dubbo 2.5.3 Consumer, j'ai attendu un moment dans le tampon de socket du système d'exploitation, puis j'ai pris le hors-bord "Zero Copy" et je suis arrivé au destination réelle. La destination dubbo 2.5.3 Consommateur, ici j'ai trouvé, NioWorker#run est une boucle infinie, puis exécute <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
, via NioWorker#read
façon de le lire, j'ai atteint le pool de threads de AllChannelHandler, il s'agit d'un pool de threads métier. NioWorker#run
是一个死循环,然后执行NioWorker#processSelectedKeys
,通过NioWorker#read
方式读出来,我就到达了AllChannelHandler的线程池,这是一个业务线程池。
我在这里等待一会,等任务被调度,我看见com.alibaba.dubbo.remoting.exchange.support.DefaultFuture#doReceived
com.alibaba .dubbo.remoting.exchange.support.DefaultFuture#doReceived
a été exécuté et le signal de Condition a été exécuté en même temps. J'ai vu un fil bloqué se réveiller au loin. J'ai semblé comprendre qu'à cause de mon arrivée, j'ai réveillé un fil endormi. Je pense que cela devrait être le sens de ma vie. À ce stade, ma mission est terminée et ce voyage est terminé. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!