46

Có sự khác biệt lớn (về mặt hiệu suất, tính khả dụng của trình duyệt, tải máy chủ, v.v.) giữa HTML5 SSEs và bỏ phiếu Ajax thẳng lên không? Từ phía máy chủ, có vẻ như EventSource chỉ cần nhấn trang được chỉ định sau mỗi 3 giây hoặc lâu hơn (mặc dù tôi hiểu thời gian linh hoạt).Sự kiện do máy chủ gửi và bỏ phiếu

Đã cấp, cài đặt đơn giản hơn ở phía khách hàng hơn là thiết lập bộ hẹn giờ và thường xuyên có $.get, nhưng có điều gì khác không? Nó có gửi ít tiêu đề hơn, hoặc làm một số phép thuật khác mà tôi đang thiếu?

Trả lời

67

Bỏ phiếu Ajax thêm rất nhiều chi phí HTTP vì nó liên tục thiết lập và xé các kết nối HTTP. Như HTML5 Rocks đặt nó "Sự kiện máy chủ gửi, mặt khác, đã được thiết kế từ đầu để có hiệu quả".

Sự kiện do máy chủ gửi mở một kết nối HTTP duy nhất tồn tại lâu dài. Sau đó, máy chủ gửi dữ liệu một cách một cách khi nó có, không cần máy khách yêu cầu hoặc làm bất cứ điều gì ngoài việc chờ tin nhắn.

Một nhược điểm đối với sự kiện do máy chủ gửi là vì chúng tạo kết nối liên tục với máy chủ, bạn có khả năng có nhiều kết nối mở với máy chủ của mình. Một số máy chủ handle massive numbers of concurrent connections better so với các máy chủ khác. Điều đó nói rằng, bạn sẽ có vấn đề tương tự với bỏ phiếu cộng với chi phí liên tục tái lập các kết nối đó.

Sự kiện do máy chủ gửi khá tốt supported in most browsers, ngoại lệ đáng chú ý là khóa học IE. Nhưng có một số couple của polyfills (và jQuery plugin) sẽ khắc phục điều đó.

Nếu bạn đang làm điều gì đó chỉ cần giao tiếp một chiều, tôi chắc chắn sẽ đi với các sự kiện do Máy chủ gửi. Như bạn đã đề cập, các sự kiện do máy chủ gửi có xu hướng đơn giản và rõ ràng hơn để triển khai ở phía máy khách. Bạn chỉ cần thiết lập người nghe cho các tin nhắn và sự kiện và trình duyệt sẽ xử lý các công cụ cấp thấp như kết nối lại nếu bị ngắt kết nối, vv Về phía máy chủ, nó cũng khá dễ thực hiện vì nó chỉ sử dụng văn bản đơn giản. Nếu bạn gửi các đối tượng được mã hóa JSON, bạn có thể dễ dàng biến chúng thành các đối tượng JavaScript trên máy khách qua JSON.parse().

Nếu bạn đang sử dụng PHP trên máy chủ, bạn có thể sử dụng json_encode() để chuyển các chuỗi, số, mảng và đối tượng thành JSON được mã hóa chính xác. Các ngôn ngữ back-end khác cũng có thể cung cấp các chức năng tương tự.

2

Tôi sẽ chỉ thêm phối cảnh cao hơn vào những gì được nói, và đó là SSE là mô hình đăng ký xuất bản trái ngược với bỏ phiếu liên tục trong trường hợp AJAX.

Nói chung, cả hai cách (bỏ phiếu và đăng ký xuất bản) đang cố gắng giải quyết vấn đề làm thế nào để duy trì trạng thái cập nhật trên máy khách.

1) Mô hình bỏ phiếu

Thật đơn giản. Trình duyệt (client) đầu tiên nhận trạng thái ban đầu (trang) và để cập nhật, nó cần định kỳ yêu cầu trạng thái (trang hoặc phần của nó) và xử lý kết quả vào trạng thái hiện tại (làm mới toàn bộ trang) một phần trong trường hợp AJAX).

Đương nhiên, một nhược điểm là nếu không có gì xảy ra với trạng thái máy chủ, tài nguyên (CPU, mạng, ...) được sử dụng không cần thiết. Một điều khác là ngay cả khi trạng thái thay đổi, khách hàng chỉ nhận được nó trong khoảng thời gian thăm dò tiếp theo, chứ không phải ASAP. Người ta thường cần phải đánh giá một thỏa hiệp thời gian tốt giữa hai điều.

Một ví dụ khác về bỏ phiếu là một spinwait trong luồng.

2) Publish-subscribe mô hình

Nó hoạt động như sau:

  • (khách hàng yêu cầu đầu tiên và cho thấy một số trạng thái ban đầu)
  • khách hàng đặt mua máy chủ (gửi một yêu cầu, có thể với một số ngữ cảnh như nguồn sự kiện)
  • máy chủ đánh dấu tham chiếu đến ứng dụng khách đến một số kho lưu trữ tham chiếu của khách hàng
  • trong trường hợp cập nhật trạng thái, hãy rver gửi một thông báo cho khách hàng dựa trên tham chiếu đến khách hàng mà nó nắm giữ; tức là nó không phải là một phản ứng với một yêu cầu nhưng một thông điệp khởi xướng bởi máy chủ
  • khách hàng tốt unsubscribe khi họ không quan tâm nhiều hơn trong các thông báo

Đây là SSE, hoặc trong luồng sự kiện waitable, như khác thí dụ. Một nhược điểm tự nhiên, như đã nêu, là máy chủ phải biết về tất cả các khách hàng đã đăng ký của nó, tùy thuộc vào việc triển khai, có thể là một vấn đề.

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