Nếu bạn là một sinh viên ngành IT chưa có nhiều kinh nghiệm, hay là một lập trình viên mới bước chân vào ngành, bạn “xỉu ngang” khi nghe các anh trong ngành trao đổi, khi đọc tài liệu kỹ thuật? Hoặc đơn giản bạn muốn hiểu hơn về các khái niệm trong IT?… Seri này dành cho bạn! Đây là loạt bài viết ngắn mình sẽ giải thích các thuật ngữ một cách gần gũi, dễ hiểu, thông qua các ví dụ thực tiễn và trường hợp sử dụng cụ thể.
Welcome back! Trong phần trước chúng ta đã làm rõ về UI, GUI, CLI và API, chắc các bạn đã phân biệt được các keywords đó và nắm được các lỗi hiểu nhầm phổ biển giữa chúng rồi đúng không? Tiếp tục seri Từ điển IT, bài hôm nay mình sẽ cùng làm rõ các từ cũng rất phổ biến trong ngành IT, đó là Client-Server. Như thường lệ, chưa chắc bạn đã hiểu đúng đâu nha :D. Nếu bạn cũng chưa nắm được các khái niệm trên hoặc đang nghi ngờ bản thân thì cũng theo dõi bài viết này nhé!
Thông thường rất nhiều bạn hay hiểu đơn giản client là website chạy trên laptop, điện thoại, còn cái máy chủ xử lý dữ liệu cho website đó là Server. Nói như vậy cũng không sai, nhưng chưa đủ trong mô hình Client-Server.
Dịch qua một chút thì chúng ta có Client là "khách hàng", serve là "phục vụ", server là "người phục vụ". Client-Server trong công nghệ thông tin cũng mang nghĩa biểu tượng như vậy, nó là một loại kiến trúc, chia các máy tính thành 2 vai trò là máy khách và máy chủ như sau:
Client là máy sẽ gửi yêu cầu (request), còn Server sẽ có nhiệm vụ lắng nghe liên tục, xử lý request đó và trả lại một phản hồi (response) tương ứng, một client có thể gửi request cho vô số server, và mỗi server cũng có thể nhận và xử lý request cho nhiều client, phụ thuộc vào kiến trúc hệ thống và mục đích của sản phẩm.
Khái niệm ngắn gọn là thế nhưng chúng ta cần lưu ý rằng, 2 từ Client và Server chỉ là một định nghĩa tương đối, không dùng để nói đến cụ thể một “cái máy” nào, mà chúng sẽ được xác định dựa trên vai trò hiện tại của nó. Rất nhiều bạn hiểu nhầm Client mặc định là trình duyệt chạy website hoặc ứng dụng mobile, nhưng thực tế chúng chỉ là một trong nhiều loại Client. Như mình nói bên trên, Client hay Server được xác định dựa trên vai trò, nên một máy có thể nằm trên nhiều hệ quy chiếu với vai trò khác nhau, cùng đi đến ví dụ để hiểu hơn nhé.
Ví dụ: Chúng ta sử dụng một ứng dụng quản lý sinh viên trên điện thoại viết bằng Flutter, mỗi khi bạn thực hiện một hành động nào đó, có thể là xem thời khóa biểu, ứng dụng sẽ gửi yêu cầu lấy dữ liệu thời khóa biểu theo mã sinh viên của bạn tới một máy chủ chạy chương trình C# để xử lý logic + lấy dữ liệu. Chương trình này được hosted ở một cái máy tính to đùng, cấu hình khủng, đặt trong một cái phòng kín ở trường, cửa khóa ba lớp, máy lạnh 24/24, chỉ có người có thẩm quyền mới được vào . Khi đó, điện thoại chúng ta chính là máy khách, còn cái máy tính chạy chương trình C# nằm trong phòng kia xử lý dữ liệu trả cho bạn chính là máy chủ.
Đến đây thì hẳn các bạn đã hiểu được khái niệm, vai trò của Client-Server rồi đúng không? Cơ mà nếu chỉ đơn giản như thế thì ông Assmin lại làm content nhảm câu fame rồi Cùng theo dõi tiếp nhé!
Từ ví dụ bên trên, giờ chúng ta thử thêm một thành phần vào hệ thống, đó là một cơ sở dữ liệu MySQL để lưu trữ thời khóa biểu của các sinh viên. Có thể bạn chưa biết, nhưng cơ sở dữ liệu cũng là một loại máy chủ, chúng được gọi với cái tên Database server và tuân thủ vai trò của mình là nhận yêu cầu (ở đây sẽ là các câu lệnh SQL) và trả về dữ liệu, chính là các records. Database hoạt động như một server độc lập với Server chính, nó có thể được host ngay bên trong máy tính cùng với Server chính hoặc cũng có thể được đặt trong một máy tính khác. Như vậy, chúng ta biết rằng để lấy được dữ liệu trả cho người dùng, Server chính của chúng ta còn phải gửi yêu cầu tới một MySQL Database Server thì mới lấy được dữ liệu cần thiết. Khi đó, nếu xét trong hệ quy chiếu giữa Server chính và MySQL Server thì chương trình C# đang chạy kia là đóng vai trò là một máy khách, trong khi MySQL bây giờ đảm nhiệm công việc Máy chủ.
Trong thực tế, một phần mềm có thể có kiến trúc rất phức tạp, chứa nhiều thành phần giao tiếp với nhau mà không đơn giản chỉ là một web/app chạy trên máy khách và một Server xử lý yêu cầu. Những hệ thống có kiến trúc phân tán hay micro-service sẽ có rất nhiều thành phần bên trong để xử lý một request từ người dùng trước khi đến Server xử lý dữ liệu chính, có thể kể đến như các dạng proxy, load-balancer, gateway,… chúng còn được nhiều người gọi với cái tên frontend server. Lý do chúng có tên như vậy bởi vì các chương trình này tuy được chạy trên máy chủ, nhưng nhiệm vụ của chúng không phải là xử lý dữ liệu mà chỉ thực hiện các tác vụ liên quan đến cân bằng tải, xác thực, phân phối các request hay điều hướng request tới các Server khác nhau. Trong trường hợp này, các frontend server này cũng có thể coi là một dạng client của Server chính. Ngoài ra, hệ thống cũng có thể có nhiều “server chính” làm nhiệm vụ xử lý dữ liệu nhằm giảm tải, tăng hiệu năng và triển khai độc lập, mỗi server mang một nhiệm vụ riêng. Một số hệ thống có thể để cho chính các server này có thể kết nối trực tiếp với nhau hoặc qua qua các gateway, proxy nói bên trên. Các client và server có thể thực hiện giao tiếp với nhau dưới nhiều loại giao thức, phổ biến nhất chúng ta thường thấy là HTTP/s, WebSocket, gRPC… tuy nhiên các hệ thống có lượng request lớn có thể dùng một số cách thức giao tiếp khác như message streaming, message queue,… (Nếu các bạn muốn mình sẽ viết một bài về các giao thức và cách truyền tải dữ liệu trong hệ thống :D)
Ngoài ra mình có chia sẻ chi tiết hơn về cách hoạt động của Website, là một ví dụ điển hình cho mô hình Client-Server ở bài viết Cuối cùng thì Website hoạt động như thế nào...? các bạn có thể đọc qua nhé!
Qua phần mở rộng bên trên liệu các bạn đã hiểu rõ hơn về client server rồi chứ? Mình sẽ tóm gọn lại vài ý cho phần này như sau:
- Client là máy thực hiện request
- Server là máy lắng nghe các request và xử lý trả về kết quả cho client
- Trong một hệ thống có nhiều loại server với vai trò khác nhau bên cạnh Server chính
- Khái niệm Client-Server mang tính tương đối tùy thuộc vào bối cảnh
- Một máy có thể là client hoặc server, dựa vào vai trò nó thực hiện
Chúc các bạn học thêm được nhiều khái niệm thú vị với seri Từ điển IT! Hẹn gặp lại ở các bài tiếp theo <3.