Kısacası: Milyonlarca eşzamanlı etkin TCP bağlantısı ve uzantı HTTP isteklerini gerçekleştirebilmelisiniz. Bu size, doğru konfigürasyona sahip doğru platformdan bekleyebileceğiniz maksimum performansı söyler.
Bugün, ASP.NET ile IIS'nin 100 eşzamanlı bağlantı sırasını destekleyip desteklemeyeceğinden endişeleniyordum (güncellememe bakın, eski ASP.Net Mono sürümlerinde saniyede ~ 10.000 yanıt bekliyoruz). Bu soruyu / cevapları görünce kendime cevap vermekten kendimi alamadım, buradaki soruya verilen cevapların çoğu tamamen yanlış.
En iyi senaryo
Bu sorunun cevabı, olası aşağı akış olası sayısız değişken ve yapılandırmadan ayırmak için yalnızca en basit sunucu yapılandırmasıyla ilgilenmelidir.
Cevabım için şu senaryoyu düşünün:
- Canlı tutma paketleri haricinde, TCP oturumlarında trafik yok (aksi takdirde, açıkça karşılık gelen miktarda ağ bant genişliğine ve diğer bilgisayar kaynaklarına ihtiyacınız olacaktır)
- Bir havuzdan gelen istek başına bir donanım iş parçacığı yerine zaman uyumsuz soketler ve programlama kullanmak üzere tasarlanmış yazılım. (ör. IIS, Node.js, Nginx ... web sunucusu [ancak Apache değil], eşzamansız tasarlanmış uygulama yazılımıyla)
- İyi performans / dolar CPU / Ram. Bugün keyfi olarak 8GB RAM ile i7 (4 çekirdekli) diyelim.
- Eşleşecek iyi bir güvenlik duvarı / yönlendirici.
- Sanal sınır / vali yok - yani. Linux somaxconn, IIS web.config ...
- Diğer daha yavaş donanıma bağımlılık yok - sabit diskten okuma yok, çünkü ağ GÇ'si değil, en düşük ortak payda ve darboğaz olacaktır.
Ayrıntılı Cevap
Eşzamanlı iş parçacığına bağlı tasarımlar, Eşzamansız GÇ uygulamalarına göre en kötü performans gösterme eğilimindedir.
WhatsApp, tek bir Unix aromalı işletim sistemi makinesinde İLE bir milyon trafik kazanıyor - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
Ve son olarak bu, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , birçok ayrıntıya giriyor 10 milyona bile nasıl ulaşılabileceğini keşfediyor. Sunucularda genellikle donanımsal TCP yük aktarım motorları vardır, ASIC'ler bu özel rol için genel amaçlı bir CPU'dan daha verimli tasarlanmıştır.
İyi yazılım tasarımı seçenekleri
Eşzamansız GÇ tasarımı, İşletim Sistemleri ve Programlama platformları arasında farklılık gösterecektir. Node.js, eşzamansız olarak tasarlanmıştır . En azından Promises kullanmalısınız ve ECMAScript 7 ortaya çıktığında, async
/ await
. C # /. Net zaten node.js gibi tam eşzamansız desteğe sahiptir. İşletim sistemi ve platform ne olursa olsun, zaman uyumsuzluğun çok iyi performans göstermesi beklenmelidir. Ve hangi dili seçerseniz seçin, "eşzamansız" anahtar kelimesini arayın, çoğu modern dil, bir tür eklenti olsa bile bir miktar desteğe sahip olacaktır.
WebFarm'a mı?
Özel durumunuz için sınır ne olursa olsun, evet bir web çiftliği ölçeklendirmeye yönelik iyi bir çözümdür. Bunu başarmak için birçok mimari var. Biri bir yük dengeleyici kullanıyor (barındırma sağlayıcıları bunları sunabilir, ancak bunların bile bant genişliği tavanıyla birlikte bir sınırı vardır), ancak bu seçeneği tercih etmiyorum. Uzun süreli bağlantılara sahip Tek Sayfalı Uygulamalar için, bunun yerine istemci uygulamasının başlangıçta rastgele seçeceği ve uygulamanın ömrü boyunca yeniden kullanacağı açık bir sunucu listesine sahip olmayı tercih ediyorum. Bu, tek hata noktasını (yük dengeleyici) ortadan kaldırır ve birden çok veri merkezi aracılığıyla ölçeklendirmeye ve dolayısıyla çok daha fazla bant genişliğine olanak tanır.
Bir efsaneyi yıkmak - 64K bağlantı noktası
"64.000" ile ilgili soru bileşenini ele alacak olursak, bu bir yanılgıdır. Bir sunucu, 65535'den fazla istemciye bağlanabilir. Bkz. Https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284
Bu arada, Windows üzerindeki Http.sys, birden çok uygulamanın HTTP URL şeması altında aynı sunucu bağlantı noktasını paylaşmasına izin verir. Her biri ayrı bir etki alanı bağlaması kaydeder, ancak nihayetinde istekleri doğru uygulamalara proxy yapan tek bir sunucu uygulaması vardır.
Güncelleme 2019-05-30
İşte en hızlı HTTP kitaplıklarının güncel bir karşılaştırması - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Test tarihi: 2018-06-06
- Kullanılan donanım: Dell R440 Xeon Gold + 10 GbE
- Liderin saniyede ~ 7 milyon düz metin yanıtı var (yanıtlar bağlantı değil)
- Golang için ikinci bir Fasthttp, 1.5 milyon eşzamanlı bağlantının reklamını yapar - bkz. Https://github.com/valyala/fasthttp
- Önde gelen diller Rust, Go, C ++, Java, C ve hatta C # rütbesi 11'dir (saniyede 6,9 milyon). Scala ve Clojure daha aşağı sıralanır. Python saniyede 2,7 milyon ile 29. sırada yer alıyor.
- Listenin en altında laravel ve cakephp, raylar, aspnet-mono-ngx, symfony, zend var. Hepsi saniyede 10.000'in altında. Unutmayın, bu çerçevelerin çoğu dinamik sayfalar için oluşturulmuştur ve oldukça eskidir, listede daha üst sıralarda yer alan daha yeni varyantlar olabilir.
- Bunun Websocket uzmanlığı için değil, HTTP düz metin olduğunu unutmayın: Buraya gelen birçok kişi muhtemelen websocket için eşzamanlı bağlantılarla ilgilenecektir.