Hari ini saya akan memberi tahu Anda tentang implementasi multithreading yang agak sederhana namun menarik di server HTTP tanpa membuat utas untuk setiap klien. Yang mengejutkan saya, saya hampir tidak menemukan informasi tentang penerapan semacam itu, jadi saya memutuskan untuk membagikannya dengan Anda. Mari kita mulai dengan deskripsi masalahnya.
Masalah solusi "satu utas = satu klien"
Masalah yang dijelaskan di bawah ini benar untuk utas dan proses, jadi "satu utas = satu klien" juga dapat dianggap sebagai "satu proses, satu klien" dalam konteks ini.
Masalah pertama adalah jumlah utas yang dapat dibuat dalam program terbatas. Akibatnya, jumlah pengguna yang terhubung ke server kami juga terbatas. Apache punya masalah seperti itu, misalnya.
Masalah kedua adalah bahwa satu utas hanya ditempati oleh satu klien. Dalam hal ini, kami mendapatkan penggunaan sumber daya yang tidak efisien. (utas bisa diam saat menunggu acara dari klien)
Selain semua ini, Anda perlu memahami bahwa membuat utas (atau proses) adalah operasi yang agak sulit, dan terkadang memerlukan lebih banyak biaya daripada layanan pelanggan itu sendiri.
Solusi yang saya berikan di bawah menutup masalah ini.
Ada solusinya
Masalah pertama diselesaikan dengan membuat jumlah utas tidak tergantung pada jumlah klien kami. Kami mengontrol jumlah utas sendiri (dapat diatur secara statistik, ketika server dimulai, atau secara dinamis, menyesuaikan dengan beban, misalnya).
Masalah kedua ditutup oleh fakta bahwa aliran tidak dilampirkan ke klien. Faktanya, layanan pelanggan dipecah menjadi tugas-tugas yang ditangani oleh utas. Jadi, kami menyingkirkan utas yang tidak aktif, jika ada pekerjaan untuk mereka.
Mesin negara hingga
, , . (, ) , . , . , , .
. . : readRequest, generateResponse, sendResponse closeConnection ( , , , ). . readRequest , (, , ), generateResponse, closeConnection. generateResponse sendResponse. sendResponse readRequest, closeConnection. closeConnection, , .
. ( : ) . , . readRequest - parsingRequest, .
. , , :)
ThreadPool ( )
. ( , ) .
: . , , . ( - ) , , ยซ , ยป, ( , ). , , , . . - .
, " = " . ( ) , ( ).
, , , , , .
Kali ini saya hanya menguraikan inti dari pendekatan tersebut. Jika Anda tertarik untuk melihat kelanjutan artikel dengan bagian praktis (pendekatan penerapan dan jebakannya) - beri tahu saya :)
Itu saja. Bagikan opsi, saran, tambahan, dan kritik Anda di komentar! Terima kasih sudah membaca :)
Beberapa tautan berguna:
https://habr.com/ru/post/260065/
https://habr.com/ru/company/latera/blog/273283/
http://www.aosabook.org/en/nginx.html