2012-11-07 15 views
9

Gần đây tôi đã phát hiện ra các sự kiện Server-Sent như là một sự thay thế đơn giản hơn nhiều cho WebSockets để đẩy từ máy chủ. Hầu hết các địa điểm so sánh chúng (như here, herehere) nói rằng nếu bạn không cần giao tiếp song công đầy đủ giữa máy khách và máy chủ thì WebSockets quá mức cần thiết và SSE đủ tốt.Nhược điểm của việc sử dụng các sự kiện Server-Sent cho giao tiếp client-server hai chiều (thay vì WebSockets)

Câu hỏi của tôi là nhược điểm của việc sử dụng SSE khi bạn cần truyền thông hai chiều (ví dụ như trò chuyện), sử dụng các yêu cầu ajax thường xuyên để gửi tin nhắn từ máy khách và luồng máy chủ để nhận chúng? Xem xét rằng tôi phải làm ít hoặc không có cấu hình ở phía máy chủ để sử dụng SSE, nó có vẻ là một lựa chọn hấp dẫn hơn nhiều.

Trả lời

14

SSE Ưu qua WebSockets:

  • Không có máy chủ web hoặc web proxy thay đổi đặc biệt cần thiết.
  • Xác định sự kiện tùy chỉnh (nếu không, khách hàng API về cơ bản là giống nhau) tích hợp
  • dễ dàng hơn các cơ chế xác thực hiện có (OAuth, OpenID, vv)

SSE Nhược so với WebSockets:

  • Kênh liên lạc một chiều (máy chủ đến máy khách). Máy khách đến máy chủ yêu cầu một kênh riêng biệt.
  • Hỗ trợ trình duyệt bị hạn chế hơn (không hỗ trợ trình duyệt IE có nguồn gốc trong khi WebSockets được hỗ trợ trong IE 10): WebSockets, SSE
  • Dựa vào khách hàng để xác minh nguồn gốc (có thể dễ bị tấn công XSS hơn WebSockets)
  • Không hỗ trợ bản địa cho các kiểu nhị phân (WebSockets hỗ trợ khung nguyên bản bằng cách sử dụng ArrayBuffers và Blobs).
  • Yêu cầu máy chủ web chính thức ngay cả khi điểm cuối SSE không phục vụ nội dung web tĩnh (máy chủ WebSocket độc lập có thể khá đơn giản)
  • SSE với AJAX cho liên lạc hai chiều sẽ có độ trễ chuyến đi cao hơn MUCH băng thông máy chủ -> cao hơn so với sử dụng kết nối WebSocket. Điều này là do chi phí thiết lập kết nối cho mỗi yêu cầu AJAX của máy khách -> máy chủ. Ngoài ra, độ trễ máy chủ-> khách hàng có thể có đột biến với SSE vì trong nhiều cấu hình, kết nối được giữ lâu sẽ cuối cùng được đóng (thường sau mỗi 30 giây) và cần được mở lại gây ra tạm thời tăng đột biến thời gian chờ của máy chủ .

Tài liệu tham khảo:

+2

Điểm tốt, nhưng tôi không hoàn toàn đồng ý về độ phức tạp của một máy chủ độc lập. Giao thức SSE chết đơn giản - đơn giản hơn nhiều so với WebSockets (không bắt tay, rập khuôn, che mặt, nhị phân). Trong cả hai trường hợp, bạn cần phải phân tích cú pháp tiêu đề HTTP (giống như). Bạn có thể thực hiện máy chủ SSE trong một bash script :) – Kornel

+0

@porneL, bạn nói đúng, một máy chủ SSE cơ bản có thể khá đơn giản để thực hiện (mặc dù tôi muốn xem phiên bản bash của bạn), nhưng máy chủ WebSocket cơ bản. Nhưng không quan tâm, quan điểm của tôi không phải là máy chủ WebSocket đơn giản hơn, mà SSE thường giả định máy chủ web trong khi WebSockets thì không (mặc dù nó được thiết kế để tích hợp dễ dàng với cơ sở hạ tầng web hiện có). – kanaka

2

Yêu cầu Ajax rất lớn so với các thông báo WebSocket nhỏ. Các yêu cầu HTTP tiêu chuẩn (Ajax) bao gồm rất nhiều tiêu đề bao gồm các cookie với mọi yêu cầu trong khi các thông điệp WebSocket chỉ là một vài byte.

Điều tốt với yêu cầu HTTP (Ajax) là chúng dễ dàng lưu vào bộ nhớ cache hơn nếu đó là lợi ích cho vấn đề của bạn.

+0

Đối với thông tin liên lạc hai chiều, có thể lưu các yêu cầu AJAX sẽ không thể hữu ích . Nếu bạn đang sử dụng AJAX để tải không đồng bộ hình ảnh hoặc dữ liệu tĩnh khác thì bộ nhớ đệm sẽ mang lại lợi ích nhưng đó là giao tiếp giữa máy chủ và máy khách và không hỗ trợ máy khách -> máy chủ mà AJAX đang được sử dụng trong trường hợp này. – kanaka

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