Websockets và SSE (Sự kiện gửi máy chủ) đều có khả năng đẩy dữ liệu lên trình duyệt, tuy nhiên chúng không phải là công nghệ cạnh tranh.
Kết nối websockets có thể vừa gửi dữ liệu tới trình duyệt vừa nhận dữ liệu từ trình duyệt. Một ví dụ điển hình của một ứng dụng có thể sử dụng websockets là một ứng dụng trò chuyện.
Kết nối SSE chỉ có thể đẩy dữ liệu lên trình duyệt. Báo giá chứng khoán trực tuyến hoặc twitters cập nhật dòng thời gian hoặc nguồn cấp dữ liệu là những ví dụ điển hình của ứng dụng có thể hưởng lợi từ SSE.
Trong thực tế vì mọi thứ có thể được thực hiện với SSE cũng có thể được thực hiện với Websockets, Websockets đang được chú ý và yêu thích hơn rất nhiều, và nhiều trình duyệt hỗ trợ Websockets hơn SSE.
Tuy nhiên, nó có thể là quá mức cần thiết cho một số loại ứng dụng và phụ trợ có thể dễ thực hiện hơn với một giao thức như SSE.
Hơn nữa, SSE có thể được điền vào các trình duyệt cũ không hỗ trợ nó bằng cách sử dụng JavaScript. Một số triển khai của polyfill SSE có thể được tìm thấy trên trang Modernithr github .
Gotchas:
- SSE bị giới hạn số lượng kết nối mở tối đa, điều này có thể gây đau đớn đặc biệt khi mở các tab khác nhau vì giới hạn trên mỗi trình duyệt và được đặt ở một số rất thấp (6). Vấn đề đã được đánh dấu là "Không sửa" trong Chrome và Firefox . Giới hạn này là cho mỗi trình duyệt + miền, do đó, điều đó có nghĩa là bạn có thể mở 6 kết nối SSE trên tất cả các tab
www.example1.com
và 6 kết nối SSE khác tới www.example2.com
(cảm ơn Phate).
- Chỉ WS có thể truyền cả dữ liệu nhị phân và UTF-8, SSE bị giới hạn ở UTF-8. (Cảm ơn Chado Nihi).
- Một số tường lửa doanh nghiệp với kiểm tra gói gặp sự cố khi xử lý WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks có một số thông tin tốt về SSE. Từ trang đó:
Sự kiện gửi máy chủ so với WebSockets
Tại sao bạn chọn Sự kiện gửi máy chủ qua WebSockets? Câu hỏi hay.
Một lý do SSE đã được giữ trong bóng tối là vì các API sau này như WebSockets cung cấp giao thức phong phú hơn để thực hiện giao tiếp song công hai chiều, hai chiều. Có một kênh hai chiều hấp dẫn hơn cho những thứ như trò chơi, ứng dụng nhắn tin và cho các trường hợp bạn cần cập nhật gần thời gian thực theo cả hai hướng. Tuy nhiên, trong một số trường hợp, dữ liệu không cần phải được gửi từ máy khách. Bạn chỉ cần cập nhật từ một số hành động máy chủ. Một vài ví dụ sẽ là cập nhật trạng thái của bạn bè, đánh dấu chứng khoán, nguồn cấp tin tức hoặc các cơ chế đẩy dữ liệu tự động khác (ví dụ: cập nhật Cơ sở dữ liệu Web SQL phía máy khách hoặc kho đối tượng IndexedDB). Nếu bạn cần gửi dữ liệu đến máy chủ, XMLHttpRequest luôn là một người bạn.
SSE được gửi qua HTTP truyền thống. Điều đó có nghĩa là họ không yêu cầu một giao thức hoặc máy chủ thực hiện đặc biệt để làm việc. Mặt khác, WebSockets yêu cầu các kết nối song công hoàn toàn và các máy chủ Web Socket mới để xử lý giao thức. Ngoài ra, Sự kiện gửi máy chủ có nhiều tính năng mà WebSockets thiếu theo thiết kế như tự động kết nối lại, ID sự kiện và khả năng gửi các sự kiện tùy ý.
Tóm tắt TLDR:
Ưu điểm của SSE so với Websockets:
- Được truyền qua HTTP đơn giản thay vì giao thức tùy chỉnh
- Có thể chứa đầy đủ javascript để "backport" SSE cho các trình duyệt chưa hỗ trợ.
- Được xây dựng để hỗ trợ kết nối lại và id sự kiện
- Giao thức đơn giản
- Không có rắc rối với tường lửa công ty kiểm tra gói
Ưu điểm của Websockets so với SSE:
- Thời gian thực, hai hướng giao tiếp.
- Hỗ trợ riêng trong nhiều trình duyệt hơn
Các trường hợp sử dụng lý tưởng của SSE:
- Phát trực tuyến chứng khoán
- cập nhật nguồn cấp dữ liệu twitter
- Thông báo cho trình duyệt
SSE gotchas:
- Không hỗ trợ nhị phân
- Giới hạn kết nối mở tối đa