2014-04-26 17 views
9

Tôi đã di chuyển ra khỏi vùng thoải mái của tôi trong PHP/MySQL vì cú pháp/đóng gói/thủ tục công cụ có thể nhận được bực bội.Có chi phí máy chủ để sử dụng WebSockets không?

Tuần trước, tôi bắt đầu chơi xung quanh và làm theo một số hướng dẫn để sử dụng Node.js/Socket.IO để tạo ứng dụng trò chuyện trực tiếp. Cho đến thời điểm này, tôi chưa bao giờ làm bất cứ điều gì với WebSockets, và họ có vẻ thực sự mát mẻ - giao tiếp tức thời giữa máy chủ và máy khách là tuyệt vời.

Bây giờ, hãy tha thứ cho sự thiếu hiểu biết của tôi ở đây, nhưng HTTP được thiết lập để bạn không thể giữ kết nối mở giữa máy khách và máy chủ - và sự hiểu biết thô sơ của tôi về Comet là nó buộc kết nối vẫn mở bằng cách không bao giờ chấm dứt luồng ghi và chỉ gửi các byte NUL. Điều này nghe có vẻ ... máy chủ chuyên sâu.

Làm cách nào để WebSockets hoạt động? Nếu tôi có một vài trăm người trên ứng dụng trò chuyện của tôi cùng một lúc, liệu máy chủ có bị quá tải không? Khi tôi sử dụng PHP/MySQL trên máy chủ, máy chủ chỉ xử lý một yêu cầu cùng một lúc - và nếu tôi sử dụng AJAX và cuộc thăm dò, cứ mỗi giây, tôi tưởng tượng rằng nó sẽ leo thang nhanh chóng khi bạn có hàng nghìn yêu cầu một phút.

Câu hỏi của tôi là, thực hiện quy mô WebSockets cho các ứng dụng lớn? Có thực tế mà không có máy chủ băng thông thực sự cao không?

Tôi đoán nó đến: có sự khác biệt đáng kể về trải nghiệm người dùng/tải máy chủ giữa cuộc thăm dò AJAX tại một khoảng thời gian thường xuyên, Comet và WebSockets không?

Cảm ơn!

Trả lời

15

Có rất nhiều trang web tổng quan tốt để đọc về cách websockets thường hoạt động như herehere.

Tóm lại, chúng khởi tạo kết nối với một loại yêu cầu HTTP nhất định và sau đó, chúng là kết nối trực tiếp hai chiều TCP giữa máy khách và máy chủ.

Có một số chi phí máy chủ để duy trì một ổ cắm mở cho khách hàng vì vậy nếu bạn dự đoán hàng chục nghìn trong số này cùng một lúc, bạn sẽ phải đảm bảo cơ sở hạ tầng máy chủ của bạn có khả năng quy mô đó. Tải CPU sẽ chỉ tỷ lệ thuận với số lượng socket đang bận tại bất kỳ thời điểm nào vì ổ cắm nhàn rỗi không lấy bất kỳ CPU nào.

Thư viện Comet cố gắng hỗ trợ giao diện giống như WebSocket, ngay cả khi không có hỗ trợ WebSocket trực tiếp. Đây là nơi hacks hơi thiếu bắt đầu xuất hiện khi nó cố gắng mô phỏng một socket TCP hai hướng bằng cách giữ một kết nối HTTP mở. Nếu bạn đang sử dụng WebSockets thực, đây không phải là vấn đề.

+1

Mọi người đều có câu trả lời hay, nhưng tôi cũng phải đưa ra câu trả lời yêu thích của bạn để giải quyết Comet và liên kết Treehouse, đây là một tổng quan tốt. Tôi đã thử Googling cho công cụ này, nhưng tôi không nghĩ rằng tôi thậm chí biết các từ khóa được nêu ra. Cảm ơn! –

5

Xem xét băng thông, ổ cắm web phải tốt hơn hoặc ít nhất là không tồi tệ hơn đáng kể so với tất cả các giải pháp khác với Comet hoặc AJAX polling dài. Giao thức websocket cho phép bạn chỉ gửi dữ liệu khi bạn cần và chỉ áp dụng padding tối thiểu (8 - 14 byte, cộng với khung bắt buộc TCP và IP) cho mỗi thư bạn gửi.

Đúng là mọi khách hàng đang hoạt động sẽ có một kết nối riêng lẻ mở. Vì vậy, khi bạn có rất nhiều (nhiều nghìn) khách hàng đồng thời, bạn có thể đạt đến giới hạn kết nối của máy chủ web, khung hoặc hệ điều hành của bạn, nhưng các giới hạn này thường có thể định cấu hình được.

3

Một nơi tốt để bắt đầu tìm hiểu về WebSockets và cách hoạt động của nó là here. Các kết nối WebSocket "không bao giờ" chấm dứt ngoại trừ trong trường hợp các sự cố mạng không mong muốn hoặc máy khách hoặc máy chủ dứt khoát quyết định kết thúc kết nối.

Node.js có thể xử lý nhiều kết nối mở (miễn là cài đặt bộ mô tả tệp mở OS của bạn đủ cao), do đó, thường một hệ thống/luồng đơn lẻ có thể khiến bạn khá xa. Tuy nhiên, nếu bạn cần mở rộng vượt quá một luồng, bạn luôn có thể sử dụng mô đun 'cụm' và/hoặc cân bằng tải giữa nhiều hệ thống nếu một hệ thống không đủ.

Nếu có điều gì, phí trên có thể ít hơn với WebSockets vì bạn không tạo và ngắt kết nối như trường hợp có phép thăm dò dài hoặc các giải pháp tương tự.

Các vấn đề liên quan