Không theo ý kiến của tôi. Nếu cả hai mô hình đều được triển khai tốt (đây là yêu cầu lớn), tôi nghĩ rằng khái niệm về NIO nên chiếm ưu thế.
Tại trung tâm của máy tính là lõi. Không có vấn đề gì bạn làm, bạn không thể song song ứng dụng của bạn nhiều hơn bạn có lõi. tức là nếu bạn có một máy tính 4 lõi, bạn chỉ có thể làm 4 việc cùng một lúc (tôi đang chú ý đến một số chi tiết ở đây, nhưng điều đó đủ cho đối số này).
Mở rộng suy nghĩ đó, nếu bạn có nhiều chủ đề hơn lõi, bạn sẽ lãng phí. Chất thải đó có hai dạng. Đầu tiên là chi phí của các chủ đề phụ. Thứ hai là thời gian chuyển đổi giữa các luồng. Cả hai đều có thể nhỏ, nhưng họ đang có.
Lý tưởng nhất là bạn có một chuỗi trên mỗi lõi và mỗi luồng trong số đó đang chạy ở tốc độ xử lý 100% trên lõi của chúng. Chuyển đổi tác vụ sẽ không xảy ra trong lý tưởng. Tất nhiên có hệ điều hành, nhưng nếu bạn lấy một máy tính cốt lõi 16 và để lại 2-3 chủ đề cho hệ điều hành, sau đó 13-14 còn lại đi về phía ứng dụng của bạn. Những chủ đề đó có thể chuyển đổi những gì họ đang thực hiện trong phạm vi ứng dụng của bạn, như khi chúng bị chặn bởi yêu cầu IO, nhưng không phải trả chi phí đó ở cấp hệ điều hành. Viết nó ngay vào ứng dụng của bạn.
Một ví dụ tuyệt vời về việc chia tỷ lệ này được hiển thị trong SEDA http://www.eecs.harvard.edu/~mdw/proj/seda/. Nó cho thấy khả năng mở rộng quy mô tốt hơn nhiều theo tải so với mô hình chuỗi yêu cầu theo yêu cầu.
Trải nghiệm cá nhân của tôi là với Netty. Tôi đã có một ứng dụng đơn giản. Tôi đã triển khai tốt trong cả Tomcat và Netty. Sau đó, tôi tải thử nghiệm nó với 100 yêu cầu đồng thời (lên tới 800 tôi tin). Cuối cùng Tomcat chậm lại để thu thập dữ liệu và thể hiện hành vi cực kỳ bùng nổ/chậm chạp. Trong khi thực hiện Netty chỉ đơn giản là tăng thời gian đáp ứng, nhưng tiếp tục với thông lượng tổng thể cực kỳ.
Xin lưu ý, bản lề này được thực hiện vững chắc. NIO vẫn còn tốt hơn với thời gian. Chúng tôi đang tìm hiểu cách điều chỉnh các hệ điều hành máy chủ để làm việc tốt hơn với nó cũng như cách triển khai các JVM để tận dụng tốt hơn chức năng của hệ điều hành. Tôi không nghĩ rằng một người chiến thắng có thể được tuyên bố, nhưng tôi tin rằng NIO sẽ là người chiến thắng cuối cùng, và nó đã làm khá tốt rồi.
Đây là một thử nghiệm thực tế rất thú vị. Đối với một số ứng dụng, 800 yêu cầu đồng thời thực sự không phải là nhiều. Tôi tự hỏi nếu sự chậm trễ trong Tomcat là do bối cảnh chuyển đổi (hoặc GC, như @irreputable gợi ý), có nghĩa là mô hình thread-per-yêu cầu chính nó là lỗi hơn là việc thực hiện Tomcat của nó. – Graham
Để công bằng, đây là một máy chủ duy nhất đang được thử nghiệm chứ không phải một cụm. Đối với 800 yêu cầu. Theo kinh nghiệm của tôi, 800 đồng thời là khá cao. Điều quan trọng là phải phân biệt các yêu cầu đồng thời từ các kết nối. Nếu bạn nhận được thời gian phản hồi trong phạm vi 100ms tại tải đó, bạn đang hỗ trợ 8k yêu cầu mỗi giây. Đó không phải là xấu cho một hộp duy nhất. Quy mô mà ra cho cả ngày và bạn xử lý 700 triệu yêu cầu với một máy chủ duy nhất. Không có nhiều ứng dụng cần nhiều. – rfeak