Tóm lại: Bạn sẽ có thể đạt được theo thứ tự hàng triệu kết nối TCP đang hoạt động đồng thời và bằng (các) yêu cầu HTTP mở rộng. Điều này cho bạn biết hiệu suất tối đa mà bạn có thể mong đợi với nền tảng phù hợp với cấu hình phù hợp.
Hôm nay, tôi đã lo lắng liệu IIS với ASP.NET có hỗ trợ theo thứ tự 100 kết nối đồng thời hay không (xem bản cập nhật của tôi, mong đợi ~ 10k phản hồi mỗi giây trên các phiên bản ASP.Net Mono cũ hơn). Khi tôi nhìn thấy câu hỏi / câu trả lời này, tôi không thể cưỡng lại việc trả lời chính mình, nhiều câu trả lời cho câu hỏi ở đây là hoàn toàn không chính xác.
Trường hợp tốt nhất
Câu trả lời cho câu hỏi này chỉ liên quan đến cấu hình máy chủ đơn giản nhất để tách khỏi vô số biến và cấu hình có thể có ở hạ lưu.
Vì vậy, hãy xem xét kịch bản sau cho câu trả lời của tôi:
- Không có lưu lượng truy cập trên các phiên TCP, ngoại trừ các gói còn tồn tại (nếu không, bạn rõ ràng sẽ cần một lượng băng thông mạng tương ứng và các tài nguyên máy tính khác)
- Phần mềm được thiết kế để sử dụng lập trình và ổ cắm không đồng bộ, thay vì luồng phần cứng cho mỗi yêu cầu từ nhóm. (tức là máy chủ web IIS, Node.js, Nginx ... [nhưng không phải Apache] với phần mềm ứng dụng được thiết kế không đồng bộ)
- Hiệu suất tốt / CPU / Ram đô la. Ngày nay, tùy ý, giả sử i7 (4 lõi) với 8GB RAM.
- Tường lửa / bộ định tuyến tốt để phù hợp.
- Không có giới hạn ảo / thống đốc - tức là. Linux somaxconn, IIS web.config ...
- Không phụ thuộc vào phần cứng khác chậm hơn - không đọc từ đĩa cứng, bởi vì nó sẽ là mẫu số chung thấp nhất và tắc nghẽn cổ chai, không phải IO mạng.
Câu trả lời chi tiết
Thiết kế ràng buộc luồng đồng bộ có xu hướng hoạt động kém nhất so với triển khai IO không đồng bộ.
WhatsApp nhận được một triệu với lưu lượng truy cập trên một máy hệ điều hành có hương vị Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
Và cuối cùng, trang này, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , đi sâu vào rất nhiều chi tiết , khám phá cách có thể đạt được thậm chí 10 triệu. Máy chủ thường có động cơ giảm tải TCP phần cứng, ASIC được thiết kế cho vai trò cụ thể này hiệu quả hơn so với CPU cho mục đích chung.
Lựa chọn thiết kế phần mềm tốt
Thiết kế IO không đồng bộ sẽ khác nhau giữa các nền tảng Hệ điều hành và Lập trình. Node.js được thiết kế với tâm trí không đồng bộ . Bạn nên sử dụng Promises ít nhất và khi ECMAScript 7 xuất hiện, async
/ await
. C # /. Net đã có đầy đủ hỗ trợ không đồng bộ như node.js. Bất kể hệ điều hành và nền tảng nào, tính năng không đồng bộ sẽ hoạt động rất tốt. Và bất kể ngôn ngữ nào bạn chọn, hãy tìm từ khóa "không đồng bộ", hầu hết các ngôn ngữ hiện đại sẽ có một số hỗ trợ, ngay cả khi đó là một tiện ích bổ sung của một số loại.
Tới WebFarm?
Dù giới hạn đối với tình huống cụ thể của bạn là gì, thì trang trại web là một giải pháp tốt để mở rộng quy mô. Có rất nhiều kiến trúc để đạt được điều này. Một là sử dụng bộ cân bằng tải (các nhà cung cấp dịch vụ lưu trữ có thể cung cấp những thứ này, nhưng ngay cả những thứ này cũng có giới hạn, cùng với mức trần băng thông), nhưng tôi không thích tùy chọn này. Đối với Ứng dụng Trang đơn có kết nối lâu dài, thay vào đó, tôi muốn có một danh sách mở các máy chủ mà ứng dụng khách sẽ chọn ngẫu nhiên khi khởi động và sử dụng lại trong suốt thời gian tồn tại của ứng dụng. Điều này loại bỏ điểm lỗi duy nhất (bộ cân bằng tải) và cho phép mở rộng quy mô qua nhiều trung tâm dữ liệu và do đó băng thông rộng hơn nhiều.
Bạo hành một huyền thoại - 64K cổng
Để giải quyết thành phần câu hỏi liên quan đến "64.000", đây là một quan niệm sai lầm. Một máy chủ có thể kết nối với hơn 65535 máy khách. Xem /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
Nhân tiện, Http.sys trên Windows cho phép nhiều ứng dụng chia sẻ cùng một cổng máy chủ trong lược đồ URL HTTP. Mỗi chúng đăng ký một ràng buộc miền riêng biệt, nhưng cuối cùng vẫn có một ứng dụng máy chủ duy nhất ủy quyền các yêu cầu đến các ứng dụng chính xác.
Cập nhật 2019-05-30
Dưới đây là so sánh cập nhật các thư viện HTTP nhanh nhất - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Ngày kiểm tra: 2018-06-06
- Phần cứng được sử dụng: Dell R440 Xeon Gold + 10 GbE
- Người dẫn đầu có ~ 7 triệu phản hồi văn bản rõ ràng mỗi giây (phản hồi không phải kết nối)
- Fasthttp thứ hai dành cho golang quảng cáo 1,5 triệu kết nối đồng thời - xem https://github.com/valyala/fasthttp
- Các ngôn ngữ hàng đầu là Rust, Go, C ++, Java, C và thậm chí C # xếp hạng 11 (6,9 triệu mỗi giây). Scala và Clojure xếp hạng tiếp tục xuống. Python đứng ở vị trí thứ 29 với tốc độ 2,7M mỗi giây.
- Ở cuối danh sách, tôi lưu ý laravel và cakephp, rails, aspnet-mono-ngx, symfony, zend. Tất cả đều dưới 10k mỗi giây. Lưu ý, hầu hết các khuôn khổ này được xây dựng cho các trang động và khá cũ, có thể có các biến thể mới hơn có tính năng cao hơn trong danh sách.
- Hãy nhớ rằng đây là bản rõ HTTP, không phải dành cho chuyên ngành Websocket: nhiều người đến đây có thể sẽ quan tâm đến các kết nối đồng thời cho websocket.