Khám Phá Sự Khác Biệt Giữa HAProxy và Websocket Qua Kinh Nghiệm Phỏng Vấn DevOps
Giới thiệu
Trong thời đại công nghệ hiện nay, nhiều người thường có những hiểu lầm về việc cấu hình HAProxy và Websocket. Hôm nay, tôi sẽ chia sẻ một kinh nghiệm cá nhân từ những buổi phỏng vấn DevOps mà tôi đã tham gia, đồng thời giải thích rõ hơn về mối quan hệ giữa HAProxy, Websocket và các khái niệm liên quan.
Một Chút Về Tôi
Xin chào, tôi là Minh Monmen. Sau một thời gian dài dừng chân để theo đuổi những điều cá nhân, tôi quay trở lại với thế giới công nghệ và khám phá nhiều kiến thức mới qua những buổi phỏng vấn. Ngày hôm nay, tôi muốn chia sẻ một câu chuyện thú vị xảy ra trong một buổi phỏng vấn mà tôi tham gia gần đây.
Nội Dung Cuộc Phỏng Vấn
Trong buổi phỏng vấn, tôi đã hỏi một ứng viên về việc sử dụng HAProxy để load balance cho các server chạy Websocket, đặc biệt là việc có cần thiết sử dụng ip_hash
hay mỗi phiên sticky session
hay không. Câu hỏi này không chỉ đơn thuần là một câu hỏi kỹ thuật mà còn là cơ hội để khám phá sâu hơn về cách hoạt động của Websocket và HAProxy.
Câu Hỏi Của Tôi
Khi dùng HAProxy để load balance nhiều server chạy Websocket, có phải việc sử dụng
ip_hash
hoặcsticky session
là bắt buộc để Websocket hoạt động đúng không?
Ứng viên trả lời rằng:
Vì Websocket là một kết nối dạng stateful, cần phải cấu hình HAProxy với
ip_hash
hoặc sticky session để đảm bảo rằng tất cả các request từ một client đều được route tới cùng một backend server.
Tuy nhiên, tôi cảm thấy có điều gì đó không đúng với câu trả lời này và quyết định tìm hiểu sâu hơn.
Tìm Hiểu Về Websocket
Trước khi đi xa hơn, chúng ta cần hiểu rõ Websocket hoạt động như thế nào. Websocket là một giao thức cho phép thực hiện kết nối hai chiều giữa client và server mà không phải thực hiện lại quá trình thiết lập kết nối liên tục. Kể từ khi kết nối TCP được mở, dữ liệu có thể được truyền đi mà không cần tạo nhiều request HTTP riêng lẻ như trong mô hình truyền thống.
Ba Giai Đoạn Chính Của Kết Nối Websocket
- Kết Nối (Connecting): Client gửi yêu cầu HTTP để thiết lập kết nối.
- Mở Kết Nối (Open): Dữ liệu được truyền đi trên cùng một kết nối TCP.
- Đóng Kết Nối (Closing): Một trong hai bên gửi thông báo đóng kết nối.
Trong suốt vòng đời của một kết nối Websocket, sẽ chỉ có một kết nối TCP duy nhất tồn tại giữa client và server.
HAProxy và Cách Hoạt Động Với Websocket
Giờ đây, hãy xem xét vai trò của HAProxy trong việc load balance Websocket. Trong quá trình handshake (xác thực) của Websocket, HAProxy quyết định backend server nào sẽ được sử dụng dựa trên các thông tin trong yêu cầu HTTP.
Điều quan trọng là:
- Logic load balance chỉ diễn ra một lần trong giai đoạn handshake. Sau khi kết nối được mở, HAProxy sẽ chuyển sang chế độ tunnel và không can thiệp vào dữ liệu đang được truyền giữa client và server.
- Do đó, chính việc sử dụng
ip_hash
hay sticky session là không bắt buộc cho Websocket hoạt động đúng.
Tại Sao Có Quan Niệm Sai Lầm Về Sticky Session?
Trên thực tế, nhiều developer vẫn thường cấu hình HAProxy với sticky session
hoặc ip_hash
cho Websocket, điều này có thể do một số lý do sau:
- Sử Dụng Socket.IO: Socket.IO là một thư viện phổ biến sử dụng Websocket nhưng cũng có khả năng fallback về HTTP long-polling, yêu cầu sticky session để hoạt động hiệu quả.
- Stateful Khác Biệt: Tính chất stateful của Websocket có thể làm người ta nhầm lẫn về việc cần thiết phải sử dụng
sticky session
để duy trì các kết nối.
Kết Luận
Câu chuyện trải nghiệm của tôi trong buổi phỏng vấn về HAProxy và Websocket là một bài học quý giá. Hiểu rõ những khái niệm cơ bản và mối quan hệ giữa chúng sẽ giúp chúng ta có cách nhìn sâu sắc hơn về việc cấu hình và tối ưu hóa hệ thống. Hy vọng qua bài viết này, các bạn sẽ rút ra được nhiều kiến thức hữu ích cho công việc của mình trong lĩnh vực DevOps.
Hẹn gặp lại trong những chia sẻ tiếp theo!
source: viblo