Singkatnya: Anda harus dapat mencapai dalam urutan jutaan koneksi TCP aktif simultan dan dengan ekstensi permintaan HTTP. Ini memberi tahu Anda kinerja maksimum yang dapat Anda harapkan dengan platform yang tepat dengan konfigurasi yang tepat.
Hari ini, saya khawatir apakah IIS dengan ASP.NET akan mendukung dalam urutan 100 koneksi bersamaan (lihat pembaruan saya, harapkan ~ 10k tanggapan per detik pada versi ASP.Net Mono yang lebih lama). Ketika saya melihat pertanyaan / jawaban ini, saya tidak bisa menahan diri untuk menjawab sendiri, banyak jawaban atas pertanyaan di sini yang sepenuhnya salah.
Kasus terbaik
Jawaban atas pertanyaan ini harus hanya memusatkan perhatian pada konfigurasi server paling sederhana untuk memisahkan dari variabel yang tak terhitung jumlahnya dan kemungkinan konfigurasi di hilir.
Jadi pertimbangkan skenario berikut untuk jawaban saya:
- Tidak ada lalu lintas pada sesi TCP, kecuali untuk paket yang tetap hidup (jika tidak, Anda jelas membutuhkan jumlah yang sesuai dari bandwidth jaringan dan sumber daya komputer lainnya)
- Perangkat lunak yang dirancang untuk menggunakan soket dan pemrograman asinkron, bukan utas perangkat keras per permintaan dari kumpulan. (mis. IIS, Node.js, Nginx ... webserver [tetapi bukan Apache] dengan perangkat lunak aplikasi yang dirancang asinkron)
- Performa bagus / CPU dolar / Ram. Hari ini, sewenang-wenang, katakanlah i7 (4 core) dengan 8GB RAM.
- Firewall / router yang bagus untuk dicocokkan.
- Tidak ada batas virtual / gubernur - mis. Linux somaxconn, IIS web.config ...
- Tidak ada ketergantungan pada perangkat keras lain yang lebih lambat - tidak ada pembacaan dari harddisk, karena ini akan menjadi penyebut dan penghambat umum terendah, bukan IO jaringan.
Jawaban Terperinci
Desain thread-terikat sinkron cenderung memiliki performa paling buruk dibandingkan dengan implementasi IO Asinkron.
WhatsApp mendapatkan satu juta DENGAN lalu lintas pada satu mesin OS rasa Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
Dan terakhir, yang ini, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , membahas banyak detail , mengeksplorasi bagaimana bahkan 10 juta dapat dicapai. Server sering kali memiliki mesin pembongkar TCP perangkat keras, ASIC dirancang untuk peran khusus ini secara lebih efisien daripada CPU tujuan umum.
Pilihan desain perangkat lunak yang bagus
Desain Asynchronous IO akan berbeda di seluruh Sistem Operasi dan platform Pemrograman. Node.js dirancang dengan asynchronous dalam pikiran. Anda harus menggunakan Promises setidaknya, dan ketika ECMAScript 7 hadir, async
/await
. C # /. Net sudah memiliki dukungan asinkron penuh seperti node.js. Apapun OS dan platformnya, asynchronous diharapkan dapat bekerja dengan sangat baik. Dan bahasa apa pun yang Anda pilih, cari kata kunci "asynchronous", sebagian besar bahasa modern akan memiliki beberapa dukungan, meskipun itu semacam add-on.
Ke WebFarm?
Apa pun batasannya untuk situasi khusus Anda, ya, web-farm adalah salah satu solusi yang baik untuk penskalaan. Ada banyak arsitektur untuk mencapai ini. Salah satunya adalah menggunakan penyeimbang beban (penyedia hosting dapat menawarkan ini, tetapi bahkan ini memiliki batas, bersama dengan plafon bandwidth), tetapi saya tidak menyukai opsi ini. Untuk Aplikasi Halaman Tunggal dengan koneksi yang berjalan lama, saya lebih memilih untuk memiliki daftar server terbuka yang akan dipilih aplikasi klien secara acak saat startup dan digunakan kembali selama masa pakai aplikasi. Ini menghilangkan satu titik kegagalan (load balancer) dan memungkinkan penskalaan melalui beberapa pusat data dan oleh karena itu lebih banyak bandwidth.
Menghancurkan mitos - 64K port
Untuk menjawab komponen pertanyaan tentang "64.000", ini adalah kesalahpahaman. Sebuah server dapat terhubung ke lebih dari 65535 klien. Lihat /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
Omong-omong, Http.sys di Windows mengizinkan beberapa aplikasi untuk berbagi port server yang sama di bawah skema HTTP URL. Mereka masing-masing mendaftarkan pengikatan domain terpisah, tetapi pada akhirnya ada satu aplikasi server yang mem-proxy permintaan ke aplikasi yang benar.
Perbarui 2019-05-30
Berikut adalah perbandingan terkini dari perpustakaan HTTP tercepat - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Tanggal tes: 2018-06-06
- Perangkat keras yang digunakan: Dell R440 Xeon Gold + 10 GbE
- Pemimpin memiliki ~ 7 juta tanggapan teks biasa per detik (tanggapan bukan koneksi)
- Fasthttp kedua untuk golang mengiklankan koneksi bersamaan 1,5 juta - lihat https://github.com/valyala/fasthttp
- Bahasa terkemuka adalah Rust, Go, C ++, Java, C, dan bahkan C # berada di peringkat 11 (6,9 juta per detik). Scala dan Clojure berada di bawah. Python menempati urutan ke-29 dengan 2,7 juta per detik.
- Di bagian bawah daftar, saya perhatikan laravel dan cakephp, rails, aspnet-mono-ngx, symfony, zend. Semua di bawah 10k per detik. Perhatikan, sebagian besar kerangka kerja ini dibuat untuk halaman dinamis dan cukup lama, mungkin ada varian lebih baru yang menampilkan lebih tinggi dalam daftar.
- Ingat ini adalah teks biasa HTTP, bukan untuk spesialisasi Websocket: banyak orang yang datang ke sini kemungkinan akan tertarik dengan koneksi serentak untuk websocket.