


Sepuluh Perbincangan tentang Pengaturcaraan Rangkaian Berprestasi Tinggi Linux
Sepuluh blog teknikal "Ten Talks on Linux High-Performance Network Programming" telah ditulis selama beberapa bulan, saya fikir saya akan menulis ringkasan untuk menyemak kerja saya dalam beberapa tahun yang lalu hampir 8 Walaupun saya menghabiskan banyak masa bekerja pada skru, saya masih belajar banyak daripada pengalaman saya dalam evolusi seni bina berprestasi tinggi, daripada penyertaan, pengoptimuman kepada reka bentuk akhir seni bina.
1. Reka bentuk terlebih dahulu atau evolusi perniagaan?
Semua orang sepatutnya mengalami proses projek dari 0 hingga 1. Saya ingin bertanya: Dalam banyak kes, adakah seni bina berkembang dengan perniagaan atau adakah ia direka lebih awal
Sesetengah orang mungkin telah mempelajari buku seni bina yang berkaitan Kebanyakan buku ini percaya bahawa seni bina berkembang dengan pembangunan perniagaan. Walau bagaimanapun, terdapat juga ramai arkitek yang menegaskan bahawa seni bina harus direka lebih awal. Di sini, saya tidak akan membuat kesimpulan buat masa ini, tetapi meneroka evolusi seni bina melalui pengalaman saya sendiri.
2. Daripada PHP kepada C++
2.1 Seni bina PHP yang ringkas
PHP, sebagai bahasa yang ringkas dan mudah, harus ada di semua jabatan kilang besar Pada masa itu, saya menggunakan dua bahasa untuk kerja: C++ dan PHP Menggunakan PHP untuk membangunkan fungsi adalah sangat pantas adalah banyak perpustakaan matang, jadi ia membentuk seni bina nginx Klasik
+php-fpm+memcache.
php seni bina
Di bawah seni bina semasa, ia bukan masalah besar untuk mesin 8c8g tunggal untuk menyokong 1000qps, jadi untuk perniagaan, ia pada masa ini kurang daripada 1wqps Jelas sekali, beberapa mesin lagi boleh menyokongnya. Mengenai reka bentuk lapisan cache, apabila redis belum dibangunkan dengan baik, memcache ialah komponen cache arus perdana pada masa itu, dan ia mudah untuk perniagaan dan dok dengan PHP. Namun, dengan perkembangan perniagaan, mengikut keluk pengiraan pada masa itu, ia mungkin mencapai 5wqps dalam masa setahun Adakah munasabah untuk menggunakan seni bina nginx + php-fpm + memcache Selepas perbincangan, matlamatnya adalah prestasi tinggi pada pelayan sisi, jadi kami memulakan perjalanan penemuan berprestasi tinggi.
Pada masa itu, untuk melaksanakan rangka kerja sisi pelayan berprestasi tinggi, orang ramai mencuba beberapa penyelesaian Salah satunya adalah menggunakan fungsi pemalam PHP untuk menyepadukan fungsi pelayan ke dalam bahasa skrip. Pendekatan ini mencapai matlamat prestasi tinggi pada tahap tertentu. Sebagai contoh, swole PHP kini merupakan hasil pembangunan kaedah ini.
pelayan-php
- Biasa dengan senario penggunaan sambungan PHP untuk mengelakkan perangkap
- Masalah kebocoran memori dalam penggunaan PHP itu sendiri
- Kos penyelesaian masalah apabila masalah berlaku Sebagai contoh, apabila masalah berlaku, kadangkala kita perlu memahami kod sumber PHP, tetapi dengan ratusan ribu baris kod, kos ini agak tinggi
- . PHP adalah mudah untuk digunakan Ini sebenarnya agak benar Dengan kebangkitan Docker, era yang berdiri sendiri sudah pasti akan berlalu.
- …
- Berdasarkan pemikiran dan analisis perkembangan perniagaan di atas, sebenarnya adalah lebih munasabah untuk kami melaksanakan sendiri pelayan atau menggunakan rangka kerja C++ sedia ada untuk melaksanakan satu set pelayan lapisan perniagaan Oleh itu, selepas pertimbangan, kami menerima pakai rangka kerja SPP syarikat . Seni binanya adalah seperti berikut:
Dapat dilihat bahawa SPP adalah seni bina pelbagai proses Seni binanya serupa dengan Nginx dan terbahagi kepada proses Proksi dan proses Pekerja, antaranya:
Proses proksi menggunakan handle_init untuk melakukan permulaan, handle_route dimajukan kepada proses pemprosesan pekerja yang ditentukan untuk pelaksanaan dan handle_input mengendalikan kemasukan paket permintaan
- Proses pekerja menggunakan handle_init untuk melakukan pemula, handle_process memproses pakej dan logik perniagaan serta pengembalian
- Selepas menggunakan seni bina C++, prestasi mesin tunggal dipertingkatkan secara langsung kepada 6kqps, yang pada asasnya memenuhi keperluan prestasi Ia boleh menyokong lebih banyak perniagaan pada mesin yang sama.
2.3 Memperkenalkan coroutine
Menggunakan C++ telah memenuhi keperluan prestasi, tetapi terdapat banyak masalah dalam kecekapan pembangunan, seperti mengakses redis Untuk mengekalkan prestasi tinggi perkhidmatan, logik kod menggunakan panggilan balik tak segerak, sama seperti berikut:
.... int ret = redis->GetString(k, getValueCallback) ...
GetValueCallback ialah fungsi panggil balik Jika terdapat banyak operasi io, panggilan balik di sini akan menjadi sangat menyusahkan Walaupun ia dirangkumkan dalam kaedah penyegerakan yang sama, ia akan menjadi sangat menyusahkan untuk dikendalikan pada masa itu std::async tidak diperkenalkan.
Sebaliknya, berdasarkan fakta bahawa qps berikutnya mungkin mencapai tahap 10~20w, coroutine akan mempunyai lebih banyak kelebihan dalam prestasi pemprosesan perkhidmatan multi-IO, jadi kami mula mengubah kaedah coroutine dan menggantikan semua tempat io dengan coroutines, untuk pembangunan perniagaan, kodnya menjadi seperti ini:
... int ret = redis->GetString(k, value) ...
Nilai ialah nilai pulangan yang boleh digunakan secara langsung Setelah terdapat io dalam kod, lapisan bawah akan menggantikan io dengan API coroutine Dengan cara ini, semua operasi io yang disekat akan menjadi primitif penyegerakan, struktur kod kecekapan pembangunan. Kedua-duanya telah banyak bertambah baik (untuk pelaksanaan coroutine khusus, sila rujuk siri artikel "Sepuluh Ceramah tentang Pengaturcaraan Rangkaian Berprestasi Tinggi Linux | Coroutines").
Coroutine
Masih tidak banyak perubahan dalam seni bina Pendekatan pelbagai proses + coroutine telah menyokong pembangunan perniagaan selama beberapa tahun Walaupun tiada pertumbuhan eksponen dalam prestasi, kami telah memperoleh lebih banyak pengalaman dalam penerokaan dan pemendakan berprestasi tinggi.
3. Asal awan
Perniagaan terus berkembang, dan jurutera sentiasa mengikuti konsep Cloud native yang paling canggih, sebagai titik teknologi yang popular dalam beberapa tahun kebelakangan ini, secara semula jadi tidak akan diabaikan, sebelum memasuki cloud native, jika pasukan anda tidak mempunyai a Konsep pembangunan DevOps, ini Ia akan menjadi satu proses yang menyakitkan yang memerlukan pembayaran balik hutang teknikal pada reka bentuk seni bina dan pemilihan rangka kerja.
3.1 Laksanakan konsep DevOps
Pada masa lalu, saya menganggap prestasi tinggi semasa membuat seni bina, dengan pemahaman saya tentang seni bina, saya mendapati prestasi tinggi hanyalah satu bidang reka bentuk seni bina yang kecil Jika anda ingin membina seni bina yang baik, anda memerlukan proses yang lebih tangkas konsep tadbir urus perkhidmatan
- Penyepaduan Berterusan: Pembangun menyepadukan kod ke dalam repositori kongsi berbilang kali sehari, dan setiap perubahan terpencil pada kod diuji serta-merta untuk mengesan dan mencegah isu penyepaduan
- Penghantaran Berterusan: Penghantaran Berterusan (CD) memastikan setiap versi kod yang diuji dalam repositori CI sedia untuk dikeluarkan
- Penyerahan berterusan: Ini termasuk penggunaan skala kelabu, keluaran biru-hijau, dsb. Tujuannya adalah untuk lelaran dengan cepat Selepas ujian penyepaduan yang agak lengkap, pengesahan skala kelabu boleh dicapai
- Penemuan perkhidmatan: Tukar perkhidmatan kepada perkhidmatan mikro untuk memudahkan panggilan antara perkhidmatan
- Rangka kerja RPC: Rangka kerja pelayan yang mengejar prestasi tinggi juga perlu mempertimbangkan sokongan komponen asas seperti pengehadan arus dan pemutus litar
- Sistem pemantauan: Bersepadu dengan Promethues, OpenTracing dan fungsi lain, ia boleh menemui masalah dalam talian dengan cepat dalam proses pembangunan tangkas
- Pengkontenaan: Untuk menyatukan alam sekitar dan mempertimbangkan senario asli awan terlebih dahulu, kontena adalah penting dalam proses pembangunan
- …
DevOps
3.2 Berbilang benang
Berdasarkan DevOps, digabungkan dengan rangka kerja Pelayan C++ di atas, kami mendapati bahawa pelbagai proses tidak lagi dapat memenuhi keperluan seni bina. Sebabnya adalah seperti berikut:
- Pelbagai proses tidak konsisten dengan konsep proses tunggal bekas Docker
- Proses pekerja mempunyai beban yang tidak sekata, cara menggunakan berbilang teras dengan lebih baik
- Bersambung dengan berkesan dengan sistem pemantauan
- Konfigurasi perniagaan dimuatkan berulang kali dan pusat konfigurasi perlu disesuaikan semula
- Adalah tidak munasabah untuk menggunakan pelbagai proses untuk menyediakan perkhidmatan stateful
- …
(1)Penyelidikan gRPC
gRPC
Pelayan Ia mempunyai ekosistem yang matang, pelbagai perisian tengah, menyokong berbilang bahasa, dll. Ia adalah pilihan yang baik untuk pembangunan perniagaan dari 0 hingga 1, tetapi ia menghadapi cabaran untuk migrasi perniagaan, seperti membangun. penemuan perkhidmatan penyesuaian Middleware anda sendiri, pusat konfigurasi, dsb., protokol transformasi mengikut pengekodan dan penyahkodan tersuai, cara menggabungkan coroutine, dsb., supaya ia dapat memuaskan sesetengah perniagaan, tetapi ia masih perlu disepadukan dengan lebih baik dengan RPC
Pelayan daripada komponen syarikat.
Kebetulan tRPC sedang dibangunkan dalam syarikat itu, kami mendapati ia pada asasnya memenuhi keperluan, jadi kami cuba menyesuaikan versi C++ tRPC kepada sistem kami pada peringkat awal pembangunan. rangka kerja RPC berprestasi tinggi telah dipindahkan dan digunakan dalam sistem perniagaan Kini, seni bina tRPC:
Berdasarkan pertimbangan dan pembangunan perniagaan di atas, kami mula cuba menyatukan rangka kerja Pelayan RPC berdasarkan prestasi tinggi untuk menyesuaikan diri dengan senario kepelbagaian RPC seterusnya, jadi kami melaksanakan set asas RPC
Pelayan yang menyesuaikan diri dengan Bingkai sistem perniagaan kami:
Seni bina baharu
Selepas melalui pemilihan dan transformasi di atas, perkhidmatan kami boleh disambungkan langkah demi langkah semasa migrasi ke k8s Perkhidmatan ini tidak perlu menjalani terlalu banyak transformasi untuk dijalankan pada platformnya, dan setiap platform yang disambungkan juga boleh. disokong sepenuhnya.
Nampaknya anda hanya boleh mengejar teknologi yang lebih baharu dan menunggu arah aliran seterusnya. Malah, terdapat lebih banyak cabaran pada masa ini disebabkan kemudahan awan dan pengembangan seni bina perkhidmatan migrasi, perkhidmatan perniagaan dan tahap logik yang tidak teratur menjadi semakin kompleks Pada masa yang sama, pautan hiliran yang bergantung pada perkhidmatan semakin lama dan lebih panjang Walaupun rangka kerja kami menyokong penjejakan pautan, semakin lama pautan, kebolehkawalan dan kestabilan perkhidmatan akan menjadi lebih teruk dan lebih teruk. lebih banyak akan dibazirkan sokongan manusia untuk ops harian.
Apa yang perlu dilakukan?…
Perlukah kita menggabungkan logik perniagaan dan memudahkan seni bina Masalahnya di sini ialah apabila logik perniagaan adalah kompleks, kitaran sering mengambil masa yang lama, dan dari perspektif kos, ia agak tinggi, dan faedahnya tidak terlalu besar
Sekiranya kita membangunkan semula seni bina baharu, mengekalkan seni bina yang reput seperti sedia ada atau meninggalkannya, dan menggunakan seni bina baharu untuk menyesuaikan diri dengan pembangunan seterusnya.
Atas ialah kandungan terperinci Sepuluh Perbincangan tentang Pengaturcaraan Rangkaian Berprestasi Tinggi Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

Ia tidak mudah untuk menukar XML ke PDF secara langsung pada telefon anda, tetapi ia boleh dicapai dengan bantuan perkhidmatan awan. Adalah disyorkan untuk menggunakan aplikasi mudah alih ringan untuk memuat naik fail XML dan menerima PDF yang dihasilkan, dan menukarnya dengan API awan. API awan menggunakan perkhidmatan pengkomputeran tanpa pelayan, dan memilih platform yang betul adalah penting. Kerumitan, pengendalian kesilapan, keselamatan, dan strategi pengoptimuman perlu dipertimbangkan ketika mengendalikan penjanaan XML dan penjanaan PDF. Seluruh proses memerlukan aplikasi front-end dan API back-end untuk bekerjasama, dan ia memerlukan pemahaman tentang pelbagai teknologi.
