Tekrarlayan bir soru olduğunu biliyorum ve aşağıdaki gibi http://www.mailinator.com/tymaPaulMultithreaded.pdf gibi makaleleri okudum, nio'nun io'dan daha iyi olduğu doğru değildir.Bir web sunucusu için java.nio'nun faydaları nelerdir?
Ama bir web sunucusu geliştirirken java nio'nun geleneksel bir alıcı/işçi ipliği mimarisinden daha iyi nasıl ölçeklenebileceğini görmek için mücadele ediyorum? Anlatayım:
Genellikle Java web sunucuların bağlantıları işlemek için aşağıdaki modelini kullanın:
while (true) {
socket = serverSocket.accept();
// handleRequest submits the socket to a queue
handleRequest(socket);
socket.close();
}
: ServerSocket en accept() yöntemine bloke çekirdek sayısı ile sınırlı
Birkaç alıcı konuları
İstemci soketi alındığında engelleme olmayan bir sıraya gönderilir ve ardından bir çalışan iş parçacığı tarafından çalışan iş parçacığı havuzundan işlenir. Gerçekleştirilen iyo işlemlerinin süresine bağlı olarak çalışan iş parçacığı sayısı.
java.nio bu mimari nasıl daha ölçeklenebilir hale getirilir?
Engelleme işlemlerini gerçekleştiren isteği (erişim veritabanı veya dosya sistemi, dış hizmetleri çağırmak) işlemek için hala çalışan iş parçacığına ihtiyacım var. Arka uç işlemleri, node.js'de olduğu gibi eşzamansız olarak gerçekleştirilmezse, genel ölçeklenebilirlik ile 1 veya 2 olay dağıtıcı iş parçacığı arasındaki sınırı kaldıracak iş parçacıklarına ihtiyaç duyardım.
NIO, uzun süreli boşta bağlantılarınız olduğunda daha kullanışlıdır. Bu nedenle, örneğin, uzun-yoklamadan ağır bir şekilde yararlanan bir uygulama, her bir uzun-polling bağlantı bloğunun IO'daki gibi IO'dan daha fazla NIO ile daha fazla istekleri işleyebildi ve bir iş parçacığı bağladı. NIO ile durum böyle değil. –
İplik numaralarını azaltmak için - daha fazla iş parçacığı, daha fazla sistem çağrısı. – coolcfan