Rumah >Java >JavaSoalan temu bual >5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!
Hari ini, saya membawakan anda artikel tentang interaksi Dubbo IO. .
Beberapa soalan menarik
Pada hari ini, urutan perniagaan memulakan panggilan kaedah, dalam FailoverClusterInvoker#doInvoke code> Saya memilih Penyedia, kemudian melalui pelbagai Penapis Pengguna, kemudian melalui saluran paip Netty3, dan akhirnya lulus <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius : 4px ;margin: 0 2px;warna latar belakang: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: # ff6441; ">NioWorker#scheduleWriteIfNecessary
kaedah, saya datang ke baris gilir writeTaskQueue NioWorker. FailoverClusterInvoker#doInvoke
我选择了一个Provider,然后经过各种Consumer Filter,再经过Netty3的pipeline,最后通过NioWorker#scheduleWriteIfNecessary
方法,我来到了NioWorker的writeTaskQueue队列中。
当我回头看主线程时,发现他在DefaultFuture中的Condition等待,我不知道他在等什么,也不知道他要等多久。
我在writeTaskQueue队列排了一会队,看到netty3 IO worker线程在永不停歇的执行run方法,大家都称这个为死循环。
最后,我很幸运,NioWorker#processWriteTaskQueue
NioWorker#processWriteTaskQueue
memilih saya, saya telah ditulis kepada penampan Soket sistem operasi Saya menunggu di penampan Bagaimanapun, saya akan merenungkan perjalanan hari ini, saya melalui dua kumpulan pelancongan, yang dipanggil rangkaian utama dan netty3 IO benang pekerja Baik, kedua-duanya Perkhidmatan semua kumpulan pelancongan adalah baik dan sangat cekap. Saya telah mengalami banyak perkara ajaib dalam penimbal soket sistem pengendalian.
Perkara yang paling menarik ialah kami mengambil bahagian kereta kabel setiap kali kami menukar kereta kabel, kami terpaksa mengubah suai alamat MAC sasaran dan alamat MAC sumber Saya kemudiannya, saya bertanya kepada rakan-rakan paket data saya industri yang sama dengan mod ini dipanggil "Lompat Seterusnya", lompat atas lompatan demi lompatan. Terdapat banyak paket data di sini Yang besar adalah dalam satu kereta kabel, dan yang lebih kecil diperah ke dalam satu kereta kabel Terdapat juga perkara yang mengerikan kereta (walaupun ini tidak penting kepada paket data kami), ini dipanggil membongkar dan melekat. Dalam tempoh ini, kami melepasi suis dan penghala, dan tempat ini sangat gembira untuk bermain.
Semestinya ada juga perkara yang tidak menyenangkan iaitu kesesakan kereta kabel di destinasi penuh, dan tiada masa untuk dibawa pergi, jadi tunggu sahaja. . dia boleh mengendalikan membongkar dan melekat.
NioEventLoop#processSelectedKeys
,再经过pipeline中的各种入站handler,我来到了AllChannelHandler的线程池,当然我有很多选择,但是我随便选了一个目的地,这里会经历解码、一系列的Filter,才会来的目的地“业务方法”,NettyCodecAdapter#InternalDecoder
4. Satu paket data baru telah dijana di sebelah Penyedia
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.AbstractChannelHandlerContext$WriteTask
等待NioEventLoop发车,等待的过程中,我记录了语。 >在这里,我看到NioEventLoop是一个死循环,不停地从任务队列取任务,执行任务AbstractChannelHandlerContext.WriteAndFlushTask
,然后指引我们到socket缓冲区等候,永不知疲倦,我似乎领们到socket缓冲区等候,永不知疲倦,我似乎领世略到乎领不强的、追求极致的匠人精神。🎜
经过io.netty.channel.AbstractChannel.AbstractUnsafe#write
,我到达了操作系统socket缓冲医统socket缓冲区。在冲区。在泱经和大多数数据包一样,也是做缆车达到目的地。🎜
Selepas tiba di dubbo 2.5.3 Pengguna, saya menunggu di buffer soket sistem operasi untuk seketika, dan kemudian mengambil "Zero Copy" di bot laju dan tiba Destinasi sebenar. Destinasi dubbo 2.5.3 Pengguna, di sini saya dapati, NioWorker#run ialah gelung tak terhingga, dan kemudian melaksanakan <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
, melalui NioWorker#read cara untuk membacanya, saya mencapai kumpulan benang daripada AllChannelHandler, Ini ialah kumpulan benang perniagaan. NioWorker#run
是一个死循环,然后执行NioWorker#processSelectedKeys
,通过NioWorker#read
方式读出来,我就到达了AllChannelHandler的线程池,这是一个业务线程池。
我在这里等待一会,等任务被调度,我看见com.alibaba.dubbo.remoting.exchange.support.DefaultFuture#doReceived
com.alibaba .dubbo.remoting.exchange.support.DefaultFuture#doReceived
telah dilaksanakan dan isyarat Keadaan telah dilaksanakan pada masa yang sama. Saya melihat benang yang tersumbat sedang dikejutkan di kejauhan. Pada ketika ini, misi saya telah selesai dan perjalanan ini telah berakhir. Rantaian Pengendali dalam ChannelPipeline dalam netty4 dijadualkan secara seragam secara bersiri oleh benang I/O Sama ada operasi baca atau tulis, operasi tulis dalam netty3 diproses oleh urutan perniagaan. Dalam netty4, penggunaan masa yang disebabkan oleh penukaran konteks antara utas boleh dikurangkan, tetapi dalam netty3, utas perniagaan boleh melaksanakan rantaian Pengendali secara serentak. Jika terdapat beberapa operasi Pengendali yang memakan masa yang akan membawa kepada kecekapan rendah netty4, anda boleh mempertimbangkan untuk melaksanakan operasi yang memakan masa ini terlebih dahulu pada urutan perniagaan dan bukannya memprosesnya dalam Pengendali. Memandangkan rangkaian perniagaan boleh dilaksanakan secara serentak, kecekapan juga boleh dipertingkatkan.
Atas ialah kandungan terperinci 5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!