Rumah > Java > JavaSoalan temu bual > 5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

Lepaskan: 2023-08-17 16:04:16
ke hadapan
1123 orang telah melayarinya

Hari ini, saya membawakan anda artikel tentang interaksi Dubbo IO. .

Beberapa soalan menarik


Dubbo ialah rangka kerja RPC yang sangat baik dengan model benang yang rumit Dalam artikel ini, penulis menganalisis keseluruhan proses IO Dubbo daripada pengetahuan cetek saya sendiri. Sebelum kita mula, mari kita lihat dahulu soalan berikut:

Selepas kaedah perniagaan dilaksanakan, adakah paket data dihantar?

  • Apakah perbezaan dalam model benang antara netty3 dan netty4?
  • Paket data mencapai penimbal soket sistem pengendalian, apa yang berlaku?
  • Log yang dijana oleh Penyedia mengambil masa yang sangat singkat, tetapi pihak Pengguna tamat masa. Bagaimana kita boleh menyelesaikan masalah?
  • Bolehkah paket data dihantar terus melalui paip di lapisan fizikal?
  • Urutan perniagaan pengguna yang menanti adalah dalam Keadaan, pada pukul berapa ia terjaga?
  • ...
  • Seterusnya, penulis akan menggunakan Dubbo2.5.3 sebagai Pengguna dan 2.7.3 sebagai Pembekal untuk menerangkan keseluruhan proses interaksi Pengarang berdiri dalam perspektif paket data dan memberitahunya dalam orang pertama. Kencangkan tali pinggang keledar anda. . melancong.
    Pada suatu hari, saya hampir dihantar keluar, dan dikatakan bahawa saya akan pergi ke tempat bernama Dubbo 2.7.3 Provider.
  • 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

    Apabila saya melihat kembali pada utas utama, saya mendapati bahawa dia sedang menunggu dalam Condition dalam DefaultFuture Saya tidak tahu apa yang dia tunggu atau berapa lama dia perlu menunggu.

    Saya beratur dalam baris gilir writeTaskQueue untuk seketika dan melihat bahawa urutan pekerja IO netty3 sedang melaksanakan kaedah larian tanpa henti.
    5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!Akhirnya, saya bernasib baik, 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 hanya merakam apa yang saya lihat hari ini dan melukisnya ke dalam gambar Sudah tentu, saya mengabaikan bahagian yang tidak penting.

    2. Sistem pengendalian menghantar paket data
  1. Saya telah mengalami banyak perkara ajaib dalam penimbal soket sistem pengendalian.

  2. Di tempat yang dipanggil lapisan pengangkutan, saya menambah nombor port sasaran dan nombor port sumber

  3. Di tempat yang dipanggil lapisan rangkaian, saya menambah IP sasaran dan IP sumber, dan pada masa yang sama masa, melalui IP sasaran ANDed dengan topeng untuk mencari IP "lompat seterusnya"

    🎜🎜🎜🎜 Di tempat yang dipanggil lapisan pautan data, saya menambah alamat MAC sasaran "hop seterusnya" melalui protokol ARP. Alamat MAC sumber🎜

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.

Saya akan kekal dalam kumpulan benang AllChannelHandler buat sementara waktu, jadi saya juga melukis gambar untuk merakam perjalanan.

NioEventLoop#processSelectedKeys,再经过pipeline中的各种入站handler,我来到了AllChannelHandler的线程池,当然我有很多选择,但是我随便选了一个目的地,这里会经历解码、一系列的Filter,才会来的目的地“业务方法”,NettyCodecAdapter#InternalDecoder

Sejak itu, perjalanan saya telah berakhir, dan cerita baru akan diteruskan dengan pakej data baharu.
5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

4. Satu paket data baru telah dijana di sebelah Penyedia

5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!
Saya adalah paket data, dilahirkan di sebuah bandar bernama Dubbo2.7.3 Provider, misi saya adalah untuk membangunkan benang yang ditakdirkan, seterusnya Saya Akan mulakan perjalanan ke tempat yang dipanggil Dubbo2.5.3 Pengguna.

Selepas kaedah perniagaan Provider dilaksanakan

  • 由业务线程经过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 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

    在这里,我看到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发车,等待的过程中,我记录了语。 >
    5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

    在这里,我看到NioEventLoop是一个死循环,不停地从任务队列取任务,执行任务AbstractChannelHandlerContext.WriteAndFlushTask,然后指引我们到socket缓冲区等候,永不知疲倦,我似乎领们到socket缓冲区等候,永不知疲倦,我似乎领世略到乎领不强的、追求极致的匠人精神。🎜

    经过io.netty.channel.AbstractChannel.AbstractUnsafe#write,我到达了操作系统socket缓冲医统socket缓冲区。在冲区。在泱经和大多数数据包一样,也是做缆车达到目的地。🎜

    5 Tiba di dubbo 2.5.3 Pengguna

    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

    Saya menunggu di sini sebentar, menunggu tugasan dijadualkan, dan saya melihat 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.

    Ringkasan model threading netty3 dan netty4

    Kami meringkaskan model threading netty3 dan netty4 berdasarkan penerangan kendiri kedua-dua paket data.

    1. Proses menulis Netty3

    5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

    2. sebagai netty4 , saluran paip Ia dilaksanakan oleh benang IO.

    Ringkasan: Perbezaan antara model benang netty3 dan netty4 terletak pada proses penulisan Dalam netty3, saluran paip dilaksanakan oleh benang perniagaan, manakala dalam netty4, tanpa mengira membaca dan menulis, saluran paip dilaksanakan oleh benang IO. 5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!

    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.

    Some masalah masalah masalah yang sukar telah menemui beberapa masalah yang sukar, seperti ketika Didi.log yang dijanjikan oleh pembekal mengambil masa yang normal, tetapi masa pengguna keluar pada masa ini, ada yang berikut arahan penyelesaian masalah, didi.log Penapis sebenarnya berada pada tahap yang sangat dalam dan selalunya tidak dapat menggambarkan pelaksanaan sebenar kaedah perniagaan.

    Pembekal Selain pelaksanaan hala tuju perniagaan, siri mungkin juga memakan masa, jadi anda boleh menggunakan arthas untuk memantau kaedah terluar org.apache.dubbo.remoting.transport.DecodeHandler#diterima untuk mengecualikan kaedah perniagaan yang Memakan masa. soket melalui netstat, seperti Recv-Q , Send-Q dan Recv-Q ialah data yang telah tiba dalam penimbal penerima tetapi belum lagi dibaca oleh kod aplikasi. Send-Q telah mencapai penimbal penghantaran, tetapi pihak yang satu lagi belum membalas dengan data Ack. Kedua-dua jenis data ini secara amnya tidak terkumpul Jika terkumpul, mungkin terdapat masalah.
    1. Lihat sama ada kaedah Consumer NioWorker#processSelectedKeys (dubbo2.5.3) memakan masa.
    2. Hingga ke semua butiran keseluruhan pautan... masalah pasti dapat diselesaikan.
    5 soalan temuduga Dubbo dengan kandungan emas yang tinggi!
      Epilog
    1. Semasa keseluruhan proses interaksi, pengarang mengetepikan beberapa butiran panggilan tindanan benang dan butiran kod sumber, seperti bersiri dan penyahsirilan, cara dubbo membaca paket Penapis data yang lengkap, Bagaimana diisih dan diedarkan sebelum kaedah perniagaan dilaksanakan, dan bagaimanakah mod Reaktor Netty dilaksanakan? Ini adalah soalan yang sangat menarik...

    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!

    Label berkaitan:
    sumber:Java后端技术全栈
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan