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队列中。
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.
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
Saya telah mengalami banyak perkara ajaib dalam penimbal soket sistem pengendalian.
Di tempat yang dipanggil lapisan pengangkutan, saya menambah nombor port sasaran dan nombor port sumber
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.
Sejak itu, perjalanan saya telah berakhir, dan cerita baru akan diteruskan dengan pakej data baharu.
4. Satu paket data baru telah dijana di sebelah Penyedia
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
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的线程池,这是一个业务线程池。
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
2. sebagai netty4 , saluran paip Ia dilaksanakan oleh benang IO.
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!
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