Chuyển nhanh đến tháng 12 năm 2017, Websockets được hỗ trợ bởi (thực tế) mọi trình duyệt và việc sử dụng chúng là rất phổ biến.
Tuy nhiên, điều này không có nghĩa là Websockets được quản lý để thay thế AJAX, ít nhất là không hoàn toàn, đặc biệt là khi sự thích ứng HTTP / 2 đang gia tăng.
Câu trả lời ngắn gọn là AJAX vẫn tuyệt vời cho hầu hết các ứng dụng REST, ngay cả khi sử dụng Websockets. Nhưng thần có trong chi tiết, nên ...:
AJAX để bỏ phiếu?
Việc sử dụng AJAX để bỏ phiếu (hoặc bỏ phiếu dài) sắp hết (và nó nên như vậy), nhưng nó vẫn được sử dụng vì hai lý do chính đáng (chủ yếu cho các ứng dụng web nhỏ hơn):
Đối với nhiều nhà phát triển, AJAX dễ viết mã hơn, đặc biệt là khi nói về mã hóa và thiết kế phụ trợ.
Với HTTP / 2, chi phí cao nhất liên quan đến AJAX (thiết lập kết nối mới) đã được loại bỏ, cho phép các cuộc gọi AJAX khá hiệu quả, đặc biệt là để đăng và tải lên dữ liệu.
Tuy nhiên, tính năng đẩy Websocket vượt trội hơn nhiều so với AJAX (không cần xác thực lại hoặc gửi lại tiêu đề, không cần vòng tròn "không có dữ liệu", v.v.). Điều này đã được thảo luận một số lần.
AJAX cho REST?
Sử dụng tốt hơn cho AJAX là các lệnh gọi API REST. Việc sử dụng này giúp đơn giản hóa cơ sở mã và ngăn chặn kết nối Websocket (đặc biệt là khi tải lên dữ liệu cỡ trung bình).
Có một số lý do thuyết phục để thích AJAX cho các cuộc gọi API REST và tải lên dữ liệu:
API AJAX thực tế được thiết kế cho các lệnh gọi API REST và nó rất phù hợp.
Các cuộc gọi REST và tải lên bằng AJAX dễ dàng hơn để mã hóa, cả trên máy khách và phụ trợ.
Khi tải trọng dữ liệu tăng lên, các kết nối Websocket có thể bị chặn trừ khi logic phân mảnh / ghép kênh thông điệp được mã hóa.
Nếu quá trình tải lên được thực hiện trong một send
cuộc gọi Websocket duy nhất , nó có thể chặn luồng Websocket cho đến khi quá trình tải lên kết thúc. Điều này sẽ làm giảm hiệu suất, đặc biệt là trên các máy khách chậm hơn.
Một thiết kế phổ biến sử dụng các thông điệp giá thầu nhỏ được chuyển qua Websockets trong khi REST và tải lên dữ liệu (máy khách đến máy chủ) tận dụng tính dễ sử dụng của AJAX để ngăn chặn Websocket chặn.
Tuy nhiên, trên các dự án lớn hơn, tính linh hoạt được cung cấp bởi Websockets và sự cân bằng giữa độ phức tạp của mã và quản lý tài nguyên sẽ giúp cân bằng lợi ích của Websockets.
Ví dụ: tải lên dựa trên Websocket có thể cung cấp khả năng tiếp tục tải lên lớn sau khi kết nối bị hủy và thiết lập lại (hãy nhớ rằng phim 5GB bạn muốn tải lên?).
Bằng cách mã hóa logic phân mảnh tải lên, thật dễ dàng để tiếp tục tải lên bị gián đoạn (phần khó là mã hóa thứ đó).
Điều gì về HTTP / 2 đẩy?
Tôi có lẽ nên thêm rằng tính năng đẩy HTTP / 2 không (và có lẽ không thể) thay thế Websockets.
Điều này đã được thảo luận ở đây trước đây , nhưng đủ để đề cập rằng một kết nối HTTP / 2 duy nhất phục vụ toàn bộ trình duyệt (tất cả các tab / cửa sổ), do đó, dữ liệu được đẩy bởi HTTP / 2 không biết nó thuộc về tab / cửa sổ nào, loại bỏ khả năng thay thế khả năng của Websocket để đẩy dữ liệu trực tiếp đến một tab / cửa sổ trình duyệt cụ thể.
Mặc dù Websockets rất tốt cho giao tiếp dữ liệu hai chiều nhỏ, AJAX vẫn mang một số lợi thế - đặc biệt là khi xem xét tải trọng lớn hơn (tải lên, v.v.).
Và an ninh?
Chà, nói chung, sự tin tưởng và kiểm soát được cung cấp cho một lập trình viên càng nhiều, công cụ càng mạnh mẽ ... và càng có nhiều mối lo ngại về bảo mật.
Bản chất AJAX sẽ chiếm ưu thế, vì tính bảo mật của nó được tích hợp vào mã của trình duyệt (đôi khi có thể nghi ngờ, nhưng nó vẫn còn đó).
Mặt khác, các cuộc gọi AJAX dễ bị tấn công "man in the middle" hơn, trong khi các vấn đề bảo mật của Websockets thường là các lỗi trong mã ứng dụng đưa ra lỗ hổng bảo mật (thường là logic xác thực phụ trợ là nơi bạn sẽ tìm thấy chúng).
Cá nhân tôi không thấy điều này là một sự khác biệt lớn, nếu bất cứ điều gì tôi nghĩ Websockets tốt hơn một chút, đặc biệt là khi bạn biết bạn đang làm gì.
Ý kiến khiêm tốn của tôi
IMHO, tôi sẽ sử dụng Websockets cho mọi thứ trừ các lệnh gọi API REST. Tải lên dữ liệu lớn Tôi sẽ phân đoạn và gửi qua Websockets khi có thể.
Bỏ phiếu, IMHO, nên được đặt ngoài vòng pháp luật, chi phí trong lưu lượng truy cập mạng là khủng khiếp và Websocket đẩy đủ dễ dàng để quản lý ngay cả đối với các nhà phát triển mới.