2012-05-29 27 views
5

Tôi đang phát triển một ứng dụng web được kết nối với máy chủ và tôi cần máy chủ đẩy một số thông tin cho khách hàng vào một thời điểm nhất định.Giao tiếp khách hàng của máy chủ: Cuộc thăm dò dài, Sao chổi và Sự kiện do máy chủ gửi (SSE)

Vì vậy, tôi bắt đầu đọc về Sự kiện do máy chủ gửi (SSE) vì trang web được phát triển trên HTML5 và SSE dường như phù hợp với những gì tôi đang tìm kiếm. Nhưng thật ngạc nhiên khi tôi đọc những gì SSE đang thực sự đang gửi yêu cầu từ máy khách đến máy chủ thay vì ngược lại (Hôm qua tôi nghĩ rằng tôi hiểu rằng việc bỏ phiếu dài là một kiểu giả lập). Vì vậy, tôi bắt đầu đọc về các ổ cắm web (nhưng nó cho rằng tiêu chuẩn vẫn là một bản nháp) và cũng có một cái nhìn về Comet. Nhưng tôi nghĩ rằng tôi không thể phù hợp với tất cả các phần trong tâm trí của tôi.

Ai đó có làm nổi bật các công nghệ này (và có thể một số công cụ đẩy khác.) Phù hợp với vấn đề của tôi và tình huống nào phù hợp hơn cho từng vấn đề?

Cảm ơn rất nhiều, tôi nghĩ rằng tôi hoàn toàn bị mất trên lĩnh vực này.

Trả lời

6

Điều này post là giải thích tốt hơn, thảo luận về sự khác biệt/lợi thế/v.v. về Giới thiệu dài, Sao chổi, SSE và WebSockets.

Đối với hầu hết các phần, khách hàng thường phải thực hiện yêu cầu đầu tiên đến máy chủ để thiết lập kết nối. Khi kết nối được thiết lập, máy chủ có thể đẩy dữ liệu đến máy khách. Vì vậy, ngay cả với WebSockets, khách hàng sẽ thực hiện yêu cầu ban đầu cho máy chủ để thiết lập kết nối đáng tin cậy giữa hai người.

Sự kiện được máy chủ gửi sử dụng yêu cầu HTTP GET bình thường để thiết lập kết nối với máy chủ. Nó cũng là một kết nối chỉ đọc cho khách hàng. Nó có lợi ích của việc thực hiện dễ dàng vì chúng ta không phải định nghĩa một giao thức mới. Vấn đề là các kết nối HTTP, ngay cả khi kết nối liên tục, được đóng lại sau khoảng 15 giây bởi hầu hết các máy chủ web. Ngay cả đối với các yêu cầu lâu dài, máy chủ web thường có thời gian chờ sau khi nó đóng kết nối. Đây là nơi mà ý tưởng của cuộc thăm dò ý kiến ​​dài đến. Đó là một ý tưởng đơn giản mà chúng tôi thực hiện một yêu cầu ajax bình thường cho máy chủ và máy chủ để nó mở càng lâu càng tốt. Nếu yêu cầu được đóng bởi máy chủ vì bất kỳ lý do gì, bạn ngay lập tức thực hiện lại yêu cầu đó. Bạn có thể thực hiện một cơ chế bỏ phiếu dài (ví dụ Comet) khá dễ dàng với một máy chủ như Node.js và một yêu cầu Ajax bình thường từ trình duyệt. Sự kiện được máy chủ gửi cố gắng trừu tượng hóa việc triển khai bên trình duyệt này với EventSource. Vì vậy, thay vì bạn phải triển khai mã phía trình duyệt/phía máy khách để bỏ phiếu/sao chổi dài, trình duyệt sẽ xử lý điều này cho bạn. Nó cung cấp một trừu tượng tốt đẹp của những gì có vẻ như một kết nối liên tục. Máy chủ web của bạn chỉ cần tìm kiếm các yêu cầu GET chỉ định Content-Type, trong tiêu đề, dưới dạng "văn bản/sự kiện-luồng" và để kết nối HTTP mở càng lâu càng tốt.

Tôi khuyên bạn không nên quá phức tạp sự kiện Máy chủ được gửi là gì. Nếu bạn hiểu một yêu cầu HTTP GET bình thường, thì có thể bạn đã có 90% hiểu ý tưởng đằng sau nó.

Có một sự khác biệt giữa SSE/Sao chổi và cuộc thăm dò dài truyền thống có thể đáng để làm nổi bật. Theo kinh nghiệm của tôi, ý tưởng đằng sau việc bỏ phiếu dài là yêu cầu của bạn không trở lại cho đến khi bạn có bản cập nhật. Tại thời điểm đó, kết nối HTTP bị đóng và một yêu cầu khác được thực hiện ngay sau đó. Với SSE, mặc dù bạn có thể đóng kết nối HTTP ngay sau khi bạn gửi thông báo được cập nhật, mục tiêu của bạn là xóa dữ liệu từ máy chủ đến máy khách mà không thực sự đóng/kết thúc yêu cầu HTTP. Điều này tránh được chi phí thực sự yêu cầu GET. Điều này có thể đạt được với một yêu cầu ajax thường xuyên, nhưng một lần nữa SSE cung cấp một triển khai tốt đẹp/hiệu quả với EventSource.

Chỉnh sửa: làm rõ sự khác biệt giữa SSE và bỏ phiếu dài.

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