Chia sẻ kiến thức lập trình

Websocket

Vì yêu nên chẳng muốn dừng!

Một chủ đề có lẽ là rất rất nhiều anh em ở đây quan tâm và chờ đón nhỉ?. Đúng vậy (lương toàn nghìn đô mà, 😃) với sức mạnh máy tính không ngừng gia tăng, nhu cầu kết nối cao với nguồn thông tin đa dạng và sự cạnh tranh gay gắt. Chẳng ai lại muốn khách hàng của mình lại nhìn vào một trang web nhạt nhẽo với những hình ảnh không bao giờ thay đổi, và cũng chẳng khách hàng nào muốn mua một sản phẩm mà họ không hiểu gì về nó và càng ức chế hơn khi không thể nào nhận được sử trợ giúp kịp thời khi gặp lỗi, chung quy lại đó chính là nhu cầu tương tác.

Stateless

Một trang web tĩnh, hay các trang web động được viết bằng jsp, php dotnet trả về các trang HTML (chúng ta gọi đó là stateless - tạm hiểu là client kết nối đến server nhận được kết quả rồi thế là xong, 2 bên đường ai lấy đi). Câu hỏi đặt ra là bây giờ khách hàng muốn #chat với bạn hoặc bạn muốn thông báo một sản phẩm mới ra mắt cho khách hàng thì sao? Thật thú vị là đã có người thuê mình làm kiểu này bằng HTTP, cứ 1 giây hoặc 3 giây gọi 1 lần để gửi nhận message hoặc lấy sản phẩm 1 lần và điều này giống như kiểu DDoS server vậy, CPU lúc nào cũng 100% và mình không chắc là server có xử lý được hết request và có bao nhiêu request bị drop không nữa.

HTTP Long Polling

Để giải quyết vấn đề này ngày xưa mình có tìm được 1 giải pháp tên là HTTP Long Polling, nghĩa là lợi dụng giao thức HTTP, khi client gửi Request lên server, thì server không ngắt kết nối khi xử lý xong request của client, mà cứ hold cái kết nối đó đến bao giờ client ngắt kết nối hoặc server chủ động gọi ngắt kết nối thì thôi và từ đó thì #Client và Server có thể giao tiếp với nhau mà không cần khởi tạo kết nối mới.

WebSocket

Đây cũng chính là tư tưởng của WebSocket (Gọi là giao thức websocket). Về bản chất Websocket chính là HTTP Long Polling nhưng nó được tiêu chuẩn hóa thông qua rfc6455. Websocket quy định 2 thứ:

  1. Các bước để client và server kết nối với nhau: websocket sống nhờ vào HTTP nên nó cũng cần thực hiện đầy đủ các bước kết nối của HTTP và thêm một bước nữa gọi là nâng cấp (Upgrade) thông qua HTTP header để client và server hiểu và không ngắt kết nối.
  2. Định dạng của một message: Bao gồm tối thiểu 1 byte để lưu các cờ, tối thiểu 7 bit để lưu kích thước của message và cuối cùng là nội dung message

Ưu và nhược điểm

Websocket hay HTTP Long Polling cũng chính là một điển hình cho lập trình stateful nơi mà client và server luôn giữ kết nối và biết được trạng thái của nhau.

Vậy ưu điểm và nhược điểm của websocket là gì?

Ưu điểm

  • Tất nhiên rồi, giao tiếp bất đồng bộ giữa client và server, làm tăng khả năng tương tác và trải nghiệm của người dùng, tăng hiệu năng và khả năng phản hồi của server
  • Tận dụng lại được tất cả những gì mà HTTP có, từ luồng kết nối đến các giao thức mã hoá SSL
  • Có thể sử dụng được cho tất cả các môi trường mà HTTP đã từng sử dụng, từ Browser cho đến Mobile cho đến các thiết bị IoT

Nhược điểm

  • Thực tế websocket chỉ sử HTTP ở giai đoạn đầu, nó chỉ chiếm 1 phần bé xíu (kiểu 1 hạt cát trên biển) để khởi tạo kết nối, vậy mà chúng ta phải lôi cả một thư viện HTTP to đùng vào trong dự án của chúng ta, điều này khiến dung lượng của ứng dụng bị phình to, việc conflict thư viện cũng rất dễ xảy ra, nên nếu bạn đang cần làm một dự án nhỏ hoặc các dự án không liên quan đến web và bạn muốn tối ưu (ví dụ mình làm game) thì việc tự viết một socket server không phải là một ý tưởng tồi.
  • Nếu chúng ta muốn đảm bảo HA (High Availability) thông qua LB (load balancer) chúng ta sẽ cần sử dụng một số kỹ thuật hoặc phải mua giải pháp (ví dụ Elastic LB của amazone). Vì một server (LB) thông thường chỉ có thể mở tối đa 65,536 port để kết nối đến Websocket server mà thôi.
  • Lập trình với websocket không hề đơn giản, đòi hỏi chúng ta phải có hiểu biết nhiều hơn về lập trình mạng

Tổng kết

Websocket hiện tại không chỉ là một giao thức nữa, nó đã trở thành 1 lĩnh vực để mọi người cùng tham gia phát triển, mình tin rằng trong tương lai, các website hay các ứng dụng sẽ luôn có 1 cặp HTTP + Websocket (hoặc 1 giao thức socket nào khác) đi cùng nhau để tăng trải khả năng tương tác và nghiệm người dùng, từ đó tạo ra doanh thu và lợi nhuận lớn hơn. Vậy nên việc lập trình viên chúng ta biết đến websocket, có lẽ nên là điều bắt buộc.

Websocket là một chủ để rộng lớn, có lẽ cần đến hàng trăm bài viết mới có thể nói hết được, vậy cùng đón chờ nhé mọi người, 🙂

Tham khảo

  1. https://www.pubnub.com/blog/http-long-polling/
  2. https://tools.ietf.org/html/rfc6455
  3. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Upgrade
  4. https://dzone.com/articles/load-balancing-of-websocket-connections
Share: