Nội dung chính
- Backend là gì? Backend Developer làm gì?
- Câu hỏi phỏng vấn Backend về kiến thức cơ bản
- Câu hỏi phỏng vấn Backend về cơ sở dữ liệu
- Câu hỏi phỏng vấn Backend về Performance và Scalability
- Câu hỏi phỏng vấn Backend về bảo mật
- Câu hỏi phỏng vấn Backend về các kỹ thuật lập trình và công cụ
- Câu hỏi phỏng vấn Backend về ngôn ngữ lập trình
- Câu hỏi phỏng vấn Backend về hệ thống phân tán
- Tổng kết câu hỏi phỏng vấn Backend
Bạn đã sẵn sàng cho buổi phỏng vấn vị trí lập trình viên Backend (Backend Developer) sắp tới? Tưởng tượng ngồi trước mặt bạn hiện tại là Ban tuyển dụng. Hãy trả lời các câu hỏi phỏng vấn Backend có trong bài viết này trước khi nhìn đáp án, để kiểm tra kiến thức của bạn nhé.
Đọc bài viết để hiểu rõ hơn về:
- Backend là gì? Vai trò công việc của Backend Developer
- Câu hỏi phỏng vấn Backend về kiến thức cơ bản
- Câu hỏi phỏng vấn backend về cơ sở dữ liệu
- Câu hỏi phỏng vấn Backend về Performance và Scalability
- Câu hỏi phỏng vấn backend về bảo mật
- Câu hỏi phỏng vấn backend về các kỹ thuật lập trình và công cụ
- Câu hỏi phỏng vấn backend về ngôn ngữ lập trình
- Câu hỏi phỏng vấn backend về hệ thống phân tán
Backend là gì? Backend Developer làm gì?
Lập trình backend là công việc tập trung vào phần mềm phía máy chủ, chịu trách nhiệm cho những phần “ẩn” – những gì mà người dùng không thể nhìn thấy, của một trang web hoặc ứng dụng web.
Công việc chính của Backend Developer là xây dựng và duy trì trang web bằng cách sử dụng các ngôn ngữ lập trình, framework, công cụ khác nhau để viết code chất lượng cao (sạch, dễ bảo trì), quản lý cơ sở dữ liệu, logic phía máy chủ, API,…
Ngoài ra, để đảm bảo trang web được vận hành trơn tru, các Backend Developer còn thực hiện các công việc khác như:
- Thực hiện kiểm tra chất lượng (QA): Lập kế hoạch và giám sát các lịch trình kiểm thử nhằm tối ưu hóa giao diện và trải nghiệm người dùng, đảm bảo hiển thị tốt trên nhiều trình duyệt và thiết bị khác nhau.
- Đánh giá hiệu quả và tốc độ: Sau khi trang web hoạt động, cũng như trong quá trình cập nhật và chỉnh sửa, nhà phát triển cần đánh giá hiệu suất và khả năng mở rộng, đồng thời điều chỉnh mã khi cần thiết.
- Khắc phục sự cố và gỡ lỗi: Có khả năng xử lý các vấn đề, khắc phục lỗi và thông báo chúng cho quản lý dự án, các bên liên quan và đội QA.
- Đào tạo và hỗ trợ: Duy trì quy trình làm việc với các nhóm khách hàng để đảm bảo hỗ trợ liên tục, đồng thời hướng dẫn và đào tạo các Backend Developer cấp dưới.
Đọc thêm: Lộ trình học Backend toàn diện A-Z cho người mới bắt đầu
Sau đây là chi tiết 30+ câu hỏi phỏng vấn Backend cơ bản cần biết!
Câu hỏi phỏng vấn Backend về kiến thức cơ bản
API là gì?
API (Application Programming Interface – Giao diện lập trình ứng dụng) là một tập hợp các quy tắc hoặc giao thức cho phép các ứng dụng phần mềm khác nhau giao tiếp và tương tác với nhau.
Hiểu đơn giản hơn, API giống như một “thực đơn” trong nhà hàng, nơi bạn có thể yêu cầu các món ăn (dữ liệu hoặc chức năng) mà bạn cần và bếp (hệ thống backend) sẽ chuẩn bị và gửi chúng đến bạn. Bạn không cần biết cách món ăn được nấu như thế nào (chi tiết kỹ thuật phía sau), chỉ cần yêu cầu đúng món dựa trên thực đơn (API).
Các vai trò chính của API bao gồm:
- Tương tác: Kết nối và trao đổi dữ liệu giữa các hệ thống khác nhau.
- Tự động hóa: Giúp các ứng dụng tự động thực hiện các tác vụ mà không cần sự can thiệp của con người.
- Tích hợp: Cho phép tích hợp giữa các ứng dụng, ví dụ: tích hợp Google Maps vào ứng dụng đặt xe.
- Tăng hiệu quả: Các lập trình viên có thể sử dụng API có sẵn để tiết kiệm thời gian và công sức.
Đọc thêm: API là gì? 4 đặc điểm nổi bật của API
API endpoint là gì?
API endpoint là một URL cụ thể trên một máy chủ. Thông qua API endpoint, các ứng dụng khách có thể tương tác với máy chủ bằng cách gửi yêu cầu (đôi khi kèm theo dữ liệu dưới dạng payload) và nhận phản hồi từ máy chủ. Thông thường, mỗi endpoint được ánh xạ tới một chức năng duy nhất trong máy chủ.
Bạn có thể hình dung endpoint giống như địa chỉ nhà của bạn. Khi bạn muốn đến nhà ai đó, bạn cần có địa chỉ chính xác. Tương tự, khi một ứng dụng muốn truy xuất dữ liệu hoặc thực hiện một hành động nào đó thông qua một API, nó cần biết chính xác địa chỉ endpoint của API đó.
Ví dụ: Bạn muốn lấy thông tin về sản phẩm magic keyboard từ một cửa hàng trực tuyến. Cửa hàng này sẽ cung cấp một API để các ứng dụng khác có thể truy cập dữ liệu của họ.
Endpoint có thể là: https://api.cuahangtructuyen.com/products/123.
Trong đó:
- https://api.cuahangtructuyen.com: Là địa chỉ của máy chủ cung cấp API.
- /products/123: Là phần đường dẫn chỉ ra rằng bạn muốn truy xuất thông tin về sản phẩm có ID là 123.
Khi bạn gửi một yêu cầu đến endpoint này, máy chủ sẽ xử lý yêu cầu và trả về thông tin về sản phẩm đó.
Giải thích cách thiết kế một RESTful API chuẩn
Để một API được xem là RESTful (tuân thủ các nguyên tắc REST), nó cần đáp ứng các tiêu chí sau:
- Kiến trúc client-server (máy khách – máy chủ): API phải tuân theo mô hình kiến trúc client-server, nơi máy khách và máy chủ được tách biệt rõ ràng (điều này áp dụng cho tất cả các dịch vụ dựa trên HTTP).
- Giao diện thống nhất: Có cách xác định từng tài nguyên một cách duy nhất thông qua URI (Unique Resource Identification). Bao gồm các phương thức HTTP (GET, POST, PUT, DELETE) để tương tác với tài nguyên theo các cách khác nhau (lấy thông tin, tạo mới, cập nhật, xóa).
- Có cách để chỉnh sửa tài nguyên thông qua biểu diễn (representation) của nó.
- Các thông điệp phải tự mô tả, nghĩa là mỗi thông điệp cần chứa đủ thông tin để hiểu cách xử lý chúng.
- Máy khách sử dụng API cần có khả năng khám phá các hành động có thể thực hiện trên tài nguyên hiện tại dựa trên phản hồi từ máy chủ (nguyên tắc này được gọi là HATEOAS – Hypermedia as the Engine of Application State).
- Tính chất stateless (không trạng thái): Mỗi yêu cầu gửi tới máy chủ phải chứa toàn bộ thông tin cần thiết để xử lý yêu cầu, không phụ thuộc vào trạng thái trước đó.
- Hệ thống phân lớp (layered system): Máy khách và máy chủ không cần kết nối trực tiếp với nhau. Có thể có các trung gian (như bộ nhớ đệm, proxy), nhưng điều này không ảnh hưởng đến giao tiếp giữa máy khách và máy chủ.
- Có khả năng cache: Các tài nguyên nên có khả năng được lưu trữ tạm thời (caching) bởi máy khách hoặc máy chủ để tối ưu hóa hiệu suất.
- Code on Demand (tùy chọn): Máy chủ có thể gửi mã để máy khách thực thi (chẳng hạn như mã JavaScript), mặc dù điều này không bắt buộc.
Những nguyên tắc này giúp API RESTful linh hoạt, dễ sử dụng và hiệu quả hơn trong việc xây dựng và vận hành các hệ thống phần mềm.
OOP là gì? OOP có ưu điểm gì so với PP?
OOP là viết tắt của Object-Oriented Programming – Lập trình hướng đối tượng. Đây là một phương pháp lập trình dựa trên khái niệm đối tượng. Thay vì tập trung vào các logic và thuật toán, OOP tập trung vào việc mô hình hóa thế giới thực thành các đối tượng, mỗi đối tượng có các thuộc tính (tính chất) và các phương thức (hành động).
PP là viết tắt của Procedural Programming – Lập trình hướng thủ tục. Phương pháp này tập trung vào việc viết các thủ tục hoặc phương thức để thực hiện các thao tác trên dữ liệu.
So với PP, OOP mang lại nhiều ưu điểm vượt trội hơn hẳn trong lập trình Backend:
- Nhanh hơn và dễ thực thi hơn: OOP giúp tăng tốc độ và đơn giản hóa quá trình thực thi chương trình.
- Cung cấp cấu trúc rõ ràng cho chương trình: Các chương trình viết bằng OOP dễ tổ chức và hiểu hơn nhờ vào cách phân chia logic theo đối tượng.
- Giữ mã nguồn DRY (“Don’t Repeat Yourself”): OOP giúp tránh việc lặp lại mã, làm cho mã nguồn dễ bảo trì, sửa đổi và gỡ lỗi hơn.
- Tái sử dụng mã hiệu quả: Với OOP, có thể tạo ra các ứng dụng tái sử dụng toàn diện với ít mã hơn và rút ngắn thời gian phát triển.
Đọc thêm: Top 50+ câu hỏi phỏng vấn OOP và trả lời mới nhất (Phần 1)
HTTP status codes là gì? Kể tên và mô tả các mã trạng thái phổ biến như 400, 404, 500
HTTP status codes (Mã trạng thái HTTP) là một thông báo mà máy chủ web gửi về cho client (thường là trình duyệt) để thông báo về kết quả của một yêu cầu HTTP. Mỗi mã trạng thái sẽ tương ứng với một tình trạng cụ thể của yêu cầu đó, cho biết yêu cầu đã được xử lý thành công, gặp lỗi hay cần thực hiện hành động bổ sung.
400, 404, 500 là những HTTP status codes điển hình, thể hiện các ý nghĩa sau:
- 400 – Bad request: Máy chủ không thể hiểu yêu cầu của trình duyệt do sai cú pháp. Đây là lỗi phía người dùng, thường xảy ra khi URL bị sai hoặc dữ liệu gửi lên không hợp lệ.
- 404 – Not found: Trang web hoặc tài nguyên yêu cầu không tìm thấy trên máy chủ. Đây là mã trạng thái khi người dùng truy cập vào một trang không tồn tại.
- 500 – Internal Server Error: Lỗi xảy ra trên máy chủ khi xử lý yêu cầu. Đây là lỗi phía máy chủ, có thể do sự cố hệ thống hoặc các lỗi không xác định.
Ngoài ra còn rất nhiều mã lỗi mà bạn còn thể tự tìm hiểu thêm ví dụ: 401, 502, 200,…
Hãy mô tả một yêu cầu HTTP điển hình
Giao thức HTTP có cấu trúc rất chặt chẽ, bao gồm một tập hợp các bước được xác định rất rõ ràng:
- Mở kết nối: Máy khách mở kết nối TCP tới máy chủ. Cổng sẽ là cổng 80 cho kết nối HTTP và cổng 443 cho kết nối HTTPS (bảo mật).
- Gửi yêu cầu: Máy khách sẽ gửi yêu cầu HTTP tới máy chủ. Yêu cầu các thông tin gồm phương thức HTTP, URI, phiên bản HTTP, một tập hợp các tiêu đề, phần thân (body) tuỳ chọn.
- Yêu cầu được xử lý bởi máy chủ: Ở giai đoạn này, máy chủ sẽ xử lý yêu cầu và chuẩn bị phản hồi.
- Gửi phản hồi HTTP trở lại máy khách: Thông qua kênh mở, máy chủ gửi lại phản hồi HTTP. Phản hồi sẽ chứa các thành phần: Phiên bản HTTP; Mã trạng thái; Một tập hợp các tiêu đề có dữ liệu bổ sung; Nội dung tùy chọn.
- Kết nối đã đóng: Đây thường là bước cuối cùng, mặc dù với các phiên bản giao thức mới hơn, có các tùy chọn để giữ kênh mở và tiếp tục gửi yêu cầu và phản hồi qua lại.
Các phương thức HTTP (GET, POST, PUT, DELETE) là gì?
Các phương thức HTTP (HTTP Methods) định nghĩa các hành động mà người dùng hoặc client yêu cầu thực hiện trên tài nguyên của máy chủ.
Phương thức GET
Dùng để yêu cầu một tài nguyên từ máy chủ. Đây là phương thức phổ biến nhất và thường được sử dụng khi người dùng truy cập các trang web.
Ví dụ: GET https://api.example.com/users?page=1 → Yêu cầu này sẽ lấy danh sách người dùng từ trang thứ nhất.
Phương thức POST
Được sử dụng để gửi dữ liệu đến máy chủ, chẳng hạn như khi người dùng điền vào biểu mẫu hoặc tải lên một tệp.
Ví dụ: Khi bạn điền thông tin vào một form đăng ký và nhấn nút “Đăng ký”, trình duyệt sẽ gửi một yêu cầu POST đến máy chủ với dữ liệu của form.
Phương thức PUT
Được sử dụng để cập nhật tài nguyên đã có trên máy chủ hoặc tạo mới một tài nguyên nếu tài nguyên đó chưa tồn tại. PUT thay thế toàn bộ tài nguyên tại địa chỉ URL đã chỉ định.
Ví dụ: PUT https://api.example.com/users/123 → Yêu cầu này sẽ cập nhật toàn bộ thông tin của người dùng có ID là 123.
Phương thức DELETE
Được sử dụng để yêu cầu máy chủ xóa tài nguyên tại một URL cụ thể.
DELETE https://api.example.com/users/456 → Yêu cầu này sẽ xóa toàn bộ người dùng có ID là 456.
CORS (Cross-Origin Resource Sharing) là gì?
CORS là từ viết tắt của Cross-Origin Resource Sharing – Chia sẻ tài nguyên giữa các nguồn khác nhau. Đây là một cơ chế dựa trên tiêu đề HTTP, cho phép máy chủ chỉ định các nguồn gốc (tên miền, giao thức, hoặc cổng) khác ngoài chính nó mà trình duyệt có thể tải tài nguyên từ đó.
CORS cũng yêu cầu trình duyệt thực hiện một yêu cầu “kiểm tra trước” (preflight) đến máy chủ lưu trữ tài nguyên từ nguồn gốc khác, để xác nhận xem máy chủ có cho phép yêu cầu thực sự hay không. Trong yêu cầu kiểm tra này, trình duyệt gửi các tiêu đề thông báo về phương thức HTTP và các tiêu đề sẽ sử dụng trong yêu cầu thực tế.
Câu hỏi phỏng vấn Backend về cơ sở dữ liệu
Cơ sở dữ liệu (database) là gì?
Cơ sở dữ liệu (database) là nơi lưu trữ thông tin. Các ứng dụng backend sử dụng cơ sở dữ liệu để lưu trữ và truy xuất dữ liệu, chẳng hạn thông tin người dùng hoặc dữ liệu ứng dụng. Cơ sở dữ liệu thường được quản lý bởi hệ thống quản lý cơ sở dữ liệu (DBMS), cung cấp giao diện cho các quản trị viên để quản lý dữ liệu.
Có nhiều loại cơ sở dữ liệu khác nhau, nhưng các cơ sở dữ liệu phổ biến nhất mà ứng dụng backend sử dụng là cơ sở dữ liệu quan hệ như MySQL, PostgreSQL và Oracle. Một số ứng dụng backend cũng sử dụng cơ sở dữ liệu NoSQL, là loại cơ sở dữ liệu phi quan hệ và thường có khả năng mở rộng tốt hơn so với cơ sở dữ liệu quan hệ.
Đọc thêm: Cơ sở dữ liệu là gì: Thành phần, ứng dụng, phân loại
Sự khác biệt giữa SQL và NoSQL là gì? Trường hợp sử dụng từng loại như thế nào?
SQL là viết tắt của Structured Query Language – Ngôn ngữ truy vấn có cấu trúc. Đây là một ngôn ngữ tiêu chuẩn được sử dụng để tương tác với các hệ quản trị cơ sở dữ liệu quan hệ (Relational Database Management System – RDBMS). SQL cung cấp một cách thức thống nhất để truy vấn, thao tác và quản lý dữ liệu được lưu trữ trong các bảng.
NoSQL là viết tắt của Not Only SQL – Không chỉ có SQL. Đây là một loại cơ sở dữ liệu không quan hệ, được thiết kế để xử lý lượng lớn dữ liệu có cấu trúc, bán cấu trúc hoặc không cấu trúc mà các cơ sở dữ liệu quan hệ truyền thống (SQL) gặp khó khăn trong việc quản lý.
Sự khác biệt giữa SQL và NoSQL được thể hiện qua các tiêu chí như:
Tiêu chí | SQL | NoSQL |
Cấu trúc dữ liệu | Dữ liệu được tổ chức theo bảng với các hàng và cột. Các bảng này có mối quan hệ rõ ràng với nhau thông qua các khóa ngoại.
SQL sử dụng ngôn ngữ truy vấn chuẩn để thực hiện các thao tác. |
Có thể lưu trữ dữ liệu dưới nhiều dạng như tài liệu (document), cặp khóa-giá trị (key-value), đồ thị (graph), hoặc cột (columnar).
NoSQL linh hoạt hơn và không yêu cầu cấu trúc cố định như SQL. |
Tính linh hoạt trong mở rộng | Mở rộng theo chiều dọc (vertical scaling), tức là cải thiện hiệu suất bằng cách nâng cấp phần cứng của máy chủ (thêm bộ nhớ, CPU,…).
→ Có thể gặp khó khăn và tốn kém khi cần mở rộng quy mô lớn. |
Mở rộng theo chiều ngang (horizontal scaling), tức là tăng khả năng xử lý bằng cách thêm các máy chủ mới vào hệ thống.
→ Dễ dàng mở rộng với các yêu cầu lớn và dữ liệu phân tán. |
Tính toàn vẹn dữ liệu | Đảm bảo tính toàn vẹn dữ liệu thông qua các đặc tính ACID (Atomicity, Consistency, Isolation, Durability), giúp đảm bảo dữ liệu luôn chính xác và nhất quán ngay cả trong trường hợp có lỗi hệ thống. | Dùng mô hình BASE (Basically Available, Soft state, Eventual consistency), không đảm bảo tính nhất quán dữ liệu tuyệt đối như ACID, nhưng cho phép hiệu suất cao và dễ dàng mở rộng. |
Quản lý và truy vấn dữ liệu | Có ngôn ngữ truy vấn mạnh mẽ với cú pháp rõ ràng và các phép toán phức tạp có thể được thực hiện dễ dàng. Tuy nhiên, việc thay đổi cấu trúc dữ liệu có thể gặp khó khăn khi dữ liệu lớn và có sự thay đổi thường xuyên. | Không sử dụng ngôn ngữ truy vấn chuẩn như SQL, thay vào đó sử dụng các API hoặc truy vấn tùy chỉnh. Mặc dù linh hoạt và dễ thay đổi, nhưng việc thực hiện các phép toán phức tạp có thể khó khăn hơn. |
Trường hợp sử dụng | Phù hợp với các ứng dụng yêu cầu tính nhất quán dữ liệu cao, ví dụ như hệ thống ngân hàng, hệ thống quản lý khách hàng (CRM), các ứng dụng tài chính hoặc các ứng dụng có cơ sở dữ liệu quan hệ phức tạp.
Các ứng dụng có dữ liệu có cấu trúc rõ ràng và không thay đổi thường xuyên. |
Phù hợp với các ứng dụng cần khả năng mở rộng nhanh, chẳng hạn như các ứng dụng web, ứng dụng mạng xã hội, hệ thống xử lý dữ liệu lớn (Big Data), hay các dịch vụ đám mây.
Các ứng dụng có dữ liệu phi cấu trúc, dữ liệu thay đổi nhanh chóng, hoặc yêu cầu lưu trữ và xử lý dữ liệu khối lượng lớn và phân tán. |
Đọc thêm: SQL vs NoSQL: Cách chọn hệ quản trị cơ sở dữ liệu phù hợp
ACID là gì? Tại sao nó quan trọng với cơ sở dữ liệu?
ACID là viết tắt của Atomicity (Tính nguyên tử), Consistency (Tính nhất quán), Isolation (Tính cách ly) và Durability (Tính bền vững). Đây là một tập hợp các tính chất đảm bảo việc xử lý giao dịch trong cơ sở dữ liệu được thực hiện một cách chặt chẽ, hiệu quả.
Atomicity (Tính nguyên tử)
Một giao dịch trong cơ sở dữ liệu là nguyên tử, nghĩa là nó được coi là một đơn vị công việc không thể chia nhỏ. Đây là một quy tắc “tất cả hoặc không có gì”. Nếu bất kỳ phần nào của giao dịch thất bại, toàn bộ giao dịch sẽ thất bại và mọi thay đổi sẽ bị hoàn lại.
Consistency (Tính nhất quán)
Đảm bảo sự toàn vẹn của cơ sở dữ liệu bằng cách đảm bảo bất kỳ giao dịch nào cũng sẽ đưa cơ sở dữ liệu từ một trạng thái nhất quán này sang một trạng thái nhất quán khác. Các kiểm tra xác thực, như khóa duy nhất hoặc kiểm tra giá trị null, được sử dụng để duy trì tính nhất quán.
Isolation (Tính cách ly)
Tính chất này đảm bảo rằng việc thực thi đồng thời các giao dịch sẽ không ảnh hưởng đến sự nhất quán của cơ sở dữ liệu, giống như các giao dịch đó được thực thi theo thứ tự tuần tự. Nói cách khác, kết quả một phần của một giao dịch chưa hoàn thành sẽ không bị tác động bởi các giao dịch khác, đảm bảo rằng các thao tác được thực hiện an toàn và theo thứ tự.
Durability (Tính bền vững)
Đảm bảo các giao dịch đã được cam kết sẽ tồn tại vĩnh viễn. Một khi một giao dịch đã được cam kết, nó sẽ không thay đổi, bất kể có sự cố hệ thống xảy ra như mất điện hay sự cố máy tính.
Các tính chất ACID rất quan trọng đối với bất kỳ hệ thống nào yêu cầu độ tin cậy cao trong giao dịch cơ sở dữ liệu, chẳng hạn hệ thống ngân hàng hay hệ thống đặt vé máy bay. Chúng cung cấp một cách thức để loại bỏ các vấn đề tiềm ẩn và đảm bảo tính toàn vẹn của dữ liệu.
Thế nào là một chỉ mục (index)? Khi nào nên sử dụng chỉ mục?
Chỉ mục (Index) trong cơ sở dữ liệu là một cấu trúc dữ liệu giúp tăng tốc quá trình tìm kiếm và truy xuất dữ liệu trong các bảng cơ sở dữ liệu được tạo trên một hoặc nhiều cột của một bảng trong cơ sở dữ liệu. Chỉ mục hoạt động giống như mục lục trong sách, giúp tìm thông tin một cách nhanh chóng mà không cần phải quét toàn bộ bảng dữ liệu.
Có thể sử dụng chỉ mục trong những trường hợp sau:
- Khi có truy vấn tìm kiếm thường xuyên
- Khi cần duy trì tính duy nhất
- Khi có truy vấn với phép kết nối (JOIN) hoặc sắp xếp (ORDER BY)
- Khi có các bảng dữ liệu lớn
- Các cột thường xuyên được sử dụng trong điều kiện WHERE
- Các cột được sử dụng trong mệnh đề GROUP BY
Đọc thêm: Index trong database: Hướng dẫn cách sử dụng chi tiết
JOIN trong SQL là gì?
Mệnh đề SQL JOIN được sử dụng để truy vấn và truy cập dữ liệu từ nhiều bảng bằng cách thiết lập mối quan hệ logic giữa chúng. Backend Developer có thể sử dụng SQL JOIN với nhiều bảng. Nó cũng có thể được ghép nối với các mệnh đề khác để lọc dữ liệu truy xuất, phổ biến nhất là sử dụng JOIN với mệnh đề WHERE.
Có nhiều loại JOIN khác nhau trong SQL dưới dây là một vài ví dụ:
- INNER JOIN: Trả về các bản ghi có giá trị khớp trong cả hai bảng.
- LEFT OUTER JOIN: Trả về tất cả các bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phải.
- RIGHT OUTER JOIN: Trả về tất cả các bản ghi từ bảng bên phải và các bản ghi khớp từ bảng bên trái.
- FULL OUTER JOIN: Trả về tất cả các bản ghi khi có sự khớp trong bảng bên trái hoặc bảng bên phải.
Đọc thêm: JOIN trong SQL: Cú pháp và cách sử dụng các phép JOIN
Làm thế nào để truy vấn dữ liệu từ MongoDB?
MongoDB sử dụng ngôn ngữ truy vấn được gọi là MongoDB Query Language (MQL). Để truy vấn dữ liệu trong MongoDB, bạn sử dụng phương thức find() trên một collection (tương đương với một bảng trong SQL). Cú pháp cơ bản như sau:
db.collection_name.find(query)
Trong đó:
- db: Đối tượng đại diện cho database đang được kết nối.
- collection_name: Tên của collection mà bạn muốn truy vấn.
- query: Đối tượng chứa các điều kiện lọc.
Ví dụ: Tìm tất cả các tài liệu trong bộ sưu tập “users” có “firstName” là “John” → Cú pháp truy vấn sẽ viết như sau: db.users.find({“firstName”: “John”}).
Câu hỏi phỏng vấn Backend về Performance và Scalability
Bạn hiểu như thế nào về Performance và Scalability?
Performance – Hiệu suất đề cập đến mức độ hệ thống thực hiện các tác vụ hoặc quy trình tốt như thế nào trong một khung thời gian nhất định. Nó bao gồm các yếu tố như tốc độ, khả năng phản hồi, thông lượng và sử dụng tài nguyên.
Scalability – Khả năng mở rộng đề cập đến khả năng của một hệ thống khi duy trì hoặc cải thiện hiệu suất khi khối lượng công việc hoặc số lượng người dùng tăng lên. Hệ thống có khả năng mở rộng tốt sẽ xử lý được số lượng lớn yêu cầu mà không bị sụt giảm hiệu suất đáng kể.
Performance và Scalability là 2 yếu tố khác nhau nhưng bổ trợ cho nhau trong việc xây dựng và phát triển trang web hiệu quả.
Tính chất | Hiệu suất | Khả năng mở rộng |
Định nghĩa | Tập trung vào việc tối ưu hóa tốc độ và khả năng phản hồi | Tập trung vào việc xử lý khối lượng công việc hoặc người dùng ngày càng tăng |
Mục tiêu | Đạt được hiệu quả tối đa cho các nhiệm vụ hiện tại | Đáp ứng nhu cầu ngày càng tăng mà không bị chậm lại |
Mối quan tâm | Tốc độ, độ trễ, thông lượng, sử dụng tài nguyên | Năng lực, tính khả dụng, phân bổ khối lượng công việc |
Kỹ thuật chính | Tối ưu hóa mã, lưu trữ đệm, cân bằng tải | Mở rộng theo chiều ngang, kiến trúc không trạng thái, dịch vụ vi mô |
Phương pháp tiếp cận mở rộng | Mở rộng theo chiều dọc (mở rộng quy mô) | Tỷ lệ theo chiều ngang (thu nhỏ) |
Hiệu suất | Suy giảm khi khối lượng công việc tăng lên | Duy trì hiệu suất với khối lượng công việc tăng lên |
Phân bổ nguồn lực | Cần nâng cấp phần cứng để cải thiện | Thêm nhiều trường hợp hoặc nút hơn để cải thiện |
Độ phức tạp của bảo trì | Độ phức tạp thấp hơn | Độ phức tạp cao hơn do bản chất phân tán |
Load Balancer là gì? Khi nào nên sử dụng load balancer?
Load Balancer (bộ cân bằng tải) là một thiết bị mạng hoặc phần mềm dùng để phân phối lưu lượng truy cập từ client đến các máy chủ trong hệ thống, giúp giảm tải trên các máy chủ, tránh tình trạng quá tải hoặc sập hệ thống khi lưu lượng truy cập tăng cao.
Nó hoạt động như một “cảnh sát giao thông,” định tuyến các yêu cầu từ người dùng đến các máy chủ khác nhau, đảm bảo các máy chủ được sử dụng hiệu quả, hệ thống có hiệu suất cao và dịch vụ luôn sẵn sàng và ổn định.
Các trường hợp cụ thể nên sử dụng load balancer như ứng dụng web (ứng dụng thương mại điện tử, game online, mạng xã hội), các dịch vụ đám mây, các ứng dụng di động, các hệ thống cơ sở dữ liệu.
Caching là gì? Tầm quan trọng của caching trong lập trình backend?
Caching (bộ nhớ đệm) là một kỹ thuật lưu trữ tạm thời các bản sao dữ liệu hoặc tài nguyên thường xuyên được truy cập để tăng tốc độ truy xuất và giảm tải cho hệ thống. Thay vì truy xuất dữ liệu từ nguồn gốc (như cơ sở dữ liệu hoặc máy chủ từ xa), hệ thống sẽ lấy dữ liệu từ bộ nhớ đệm gần hơn và nhanh hơn.
Trong lập trình backend, việc sử dụng caching mang lại lợi ích đáng để về tốc độ, thời gian, hiệu suất và cả chi phí để phát triển và duy trì trang web.
- Hệ thống có thể lấy dữ liệu từ cache, vốn có tốc độ truy xuất nhanh hơn rất nhiều giúp cải thiện đáng kể thời gian đáp ứng của ứng dụng.
- Tăng tuổi thọ của cơ sở dữ liệu, giảm thiểu nguy cơ quá tải và tăng khả năng mở rộng
- Giảm thiểu thời gian xử lý các yêu cầu, từ đó tăng khả năng xử lý đồng thời của hệ thống và nâng cao trải nghiệm người dùng.
- Cache phiên bản duy nhất có thể phục vụ hàng trăm nghìn yêu cầu mỗi giây giúp cải thiện đáng kể hiệu suất hệ thống và khả năng mở rộng trong các đợt user tăng đột biến.
- Có khả năng thay thế nhu cầu về nhiều phiên bản cơ sở dữ liệu, do đó giảm chi phí cơ sở dữ liệu.
Câu hỏi phỏng vấn Backend về bảo mật
Authentication và Authorization khác nhau như thế nào?
Authentication và Authorization là hai khái niệm thường được sử dụng trong bảo mật hệ thống, đặc biệt là trong các ứng dụng web và cơ sở dữ liệu. Mặc dù chúng có liên quan chặt chẽ với nhau nhưng chúng thực hiện các chức năng khác nhau.
- Authentication (xác thực) là quá trình xác minh danh tính của người dùng hoặc hệ thống thông qua thông tin đăng nhập như tên người dùng, mật khẩu, hoặc sinh trắc học (vân tay, nhận diện khuôn mặt). Quá trình này đảm bảo quyền truy cập an toàn, ngăn chặn xâm nhập trái phép và bảo vệ thông tin nhạy cảm.
- Authorization (ủy quyền) là quá trình cấp quyền cho người dùng hoặc hệ thống đã xác thực, xác định họ có thể truy cập và thực hiện những hành động nào. Diễn ra sau xác thực, ủy quyền đảm bảo quyền truy cập phù hợp, ngăn chặn hoạt động trái phép và hỗ trợ kiểm soát bảo mật hệ thống.
Sự khác biệt giữa Authentication và Authorization:
Tiêu chí | Authentication | Authorization |
Mục tiêu | Danh tính của người dùng sẽ được kiểm tra để cung cấp quyền truy cập vào hệ thống. | Quyền hạn của cá nhân hoặc người dùng sẽ được kiểm tra để truy cập vào tài nguyên. |
Thứ tự | Được thực hiện trước quá trình cấp phép. | Được thực hiện sau quá trình xác thực. |
Yêu cầu thông tin | Cần thông tin đăng nhập của người dùng. | Cần có đặc quyền hoặc mức độ bảo mật của người dùng. |
Mục đích | Xác định xem người đó có phải là người dùng hay không. | Xác định Người dùng có quyền gì? |
Kênh truyền | Truyền thông tin thông qua ID Token. | Truyền thông tin thông qua Mã thông báo truy cập. |
Giao thức | Giao thức OpenID Connect (OIDC) là giao thức xác thực thường chịu trách nhiệm về quy trình xác thực người dùng. | Giao thức OAuth 2.0 quản lý toàn bộ hệ thống quy trình cấp phép người dùng. |
Kỹ thuật phổ biến | – Xác thực dựa trên mật khẩu
– Xác thực không cần mật khẩu – 2FA/MFA (Xác thực hai yếu tố / Xác thực đa yếu tố) – Đăng nhập một lần (SSO) – Xác thực xã hội |
– Kiểm soát truy cập dựa trên vai trò (RBAC)
– Xác thực mã thông báo web JSON (JWT) – Ủy quyền SAML – Ủy quyền OpenID – Ủy quyền OAuth 2.0 |
Khả năng thay đổi thông tin | Thông tin xác thực có thể được thay đổi một phần khi người dùng cần. | Người dùng không thể thay đổi quyền ủy quyền vì chúng được cấp bởi chủ sở hữu hệ thống và chỉ có người đó mới có quyền thay đổi. |
Khả năng nhìn thấy | Có thể được nhìn thấy ở phía người dùng. | Quyền của người dùng không hiển thị ở phía người dùng. |
Cách xác thực | Xác thực người dùng được xác định bằng tên người dùng, mật khẩu, nhận dạng khuôn mặt, quét võng mạc, dấu vân tay,… | Được thực hiện thông qua quyền truy cập vào tài nguyên bằng cách sử dụng các vai trò đã được xác định trước. |
Sự khác nhau giữa cookie và session là gì?
Cookies là tệp văn bản nhỏ (thường tối đa 4KB tuỳ thuộc vào trình duyệt và máy chủ) được lưu trên máy tính người dùng khi họ truy cập trang web. Nó chứa dữ liệu do trang web gửi để hỗ trợ nhận diện và lưu trữ thông tin.
Session là khoảng thời gian lưu trữ tạm thời thông tin trên máy chủ, hỗ trợ người dùng duy trì trạng thái giữa các trang web. Phiên bắt đầu khi người dùng đăng nhập và kết thúc khi họ đăng xuất hoặc tắt máy.
Sự khác nhau giữa cookie và session:
Tiêu chí | Cookie | Session |
Thời điểm kết thúc | Kết thúc theo thời hạn tồn tại do người dùng thiết lập. | Khi người dùng thoát khỏi trình duyệt hoặc đăng xuất khỏi chương trình, phiên làm việc sẽ kết thúc. |
Khả năng lưu trữ | Chỉ có thể lưu trữ một lượng thông tin nhất định. | Có thể lưu trữ một lượng dữ liệu không xác định. |
Dung lượng | Cookie của trình duyệt có dung lượng tối đa là 4 KB. Tuỳ theo trình duyệt hoặc máy chủ. | Có thể lưu trữ bao nhiêu dữ liệu tùy thích trong một phiên. Tuy nhiên giới hạn bộ nhớ tối đa một tập lệnh có thể sử dụng cùng một lúc là 128MB |
Cách khởi động | Vì cookie được lưu trên máy tính cục bộ nên không cần chạy hàm để khởi động chúng. | Để bắt đầu phiên, phải sử dụng phương thức session start(). |
Bảo mật | Không được bảo mật. | Làm việc an toàn hơn nhiều so với cookie. |
Cách lưu trữ dữ liệu | Lưu trữ dữ liệu trong tệp văn bản. | Dữ liệu lưu dưới máy chủ. |
Lấy dữ liệu trong PHP | $_COOKIES biến toàn cục được sử dụng | Biến toàn cục $_SESSION được sử dụng |
Xóa / Hủy dữ liệu | Có thể thiết lập ngày hết hạn để xóa dữ liệu cookie. Cookie sẽ tự động xóa dữ liệu vào thời điểm cụ thể đó. | Để hủy hoặc xóa dữ liệu, có thể dùng hàm session_destroy().
Để hủy cài đặt một biến cụ thể, có thể dùng hàm unset(). |
HTTP và HTTPS có gì khác nhau?
HTTP (Hypertext Transfer Protocol) là giao thức truyền dữ liệu trên web, được Tim Berners-Lee phát minh. Nó thiết lập chuẩn giao tiếp giữa trình duyệt và máy chủ web, cho phép truyền dữ liệu như văn bản, hình ảnh và đa phương tiện qua World Wide Web. HTTP được sử dụng mỗi khi người dùng truy cập trình duyệt, hỗ trợ hệ thống thông tin siêu phương tiện phân tán.
HTTPS (Hypertext Transfer Protocol Secure) là phiên bản bảo mật của HTTP, sử dụng SSL/TLS để mã hóa và bảo vệ thông tin liên lạc trên web. Các trang web sử dụng HTTPS an toàn hơn vì được chứng nhận bởi SSL. Ngược lại, các trang web chỉ dùng HTTP không đảm bảo tính an toàn.
So sánh điểm khác nhau giữa HTTP và HTTPS:
Tiêu chí | HTTP | HTTPS |
URL | URL bắt đầu bằng “http://”. | URL bắt đầu bằng “https://”. |
Cổng giao tiếp | Cổng số 80 | Cổng số 443 |
Độ an toàn | Không an toàn. Vì siêu văn bản được trao đổi dưới dạng văn bản thuần túy, nghĩa là nếu ai đó chặn được dữ liệu này trong quá trình trao đổi giữa trình duyệt và máy chủ, họ có thể dễ dàng đọc được thông tin. | An toàn hơn vì sử dụng mã hóa. |
Lớp hoạt động | Lớp ứng dụng | Lớp truyền tải |
Tốc độ | Nhanh hơn HTTPS | Chậm hơn HTTP |
Bảo mật dữ liệu | Dữ liệu truyền đi giữa máy chủ và trình duyệt không được mã hóa. | Sử dụng giao thức SSL/TLS để mã hóa dữ liệu truyền đi. Điều này đảm bảo rằng chỉ máy chủ và trình duyệt mới có thể đọc được dữ liệu, ngăn chặn việc đánh cắp thông tin bởi các bên thứ ba. |
Kênh truyền | Được sử dụng để truyền tải văn bản, video và hình ảnh qua các trang web. | Được sử dụng để truyền dữ liệu an toàn qua mạng. |
JWT (JSON Web Token) là gì? Những trường hợp nào nên sử dụng JWT?
JSON Web Token (JWT) là một tiêu chuẩn mã nguồn mở được sử dụng để truyền thông tin một cách an toàn và gọn nhẹ giữa các hệ thống. Nó thường được sử dụng trong các hệ thống phân tán để xác thực người dùng, trao đổi dữ liệu và các quyền truy cập.
JWT thường được sử dụng trong những trường hợp như:
- Xác thực và ủy quyền trong các ứng dụng web và API
- Hệ thống phân tán hoặc microservices
- Ứng dụng di động (Mobile App)
- Single Sign-On (SSO)
- API có khả năng mở rộng cao
- Ứng dụng cần tính năng bảo mật cao
- Ứng dụng yêu cầu tính bảo mật và không phụ thuộc vào session
- Ứng dụng với nhiều nền tảng hoặc thiết bị
- Ứng dụng có nhu cầu truy cập nhanh và hiệu quả
- Khi cần giảm thiểu sự phụ thuộc vào cơ sở dữ liệu
Đọc thêm: JSON Web Token là gì: Định nghĩa và cách hoạt động
Làm sao để mã hóa mật khẩu người dùng an toàn trong cơ sở dữ liệu?
Mã hóa mật khẩu người dùng một cách an toàn trong cơ sở dữ liệu là một bước quan trọng để bảo vệ dữ liệu người dùng và đảm bảo an toàn trong các hệ thống. Để mã hóa mật khẩu người dùng an toàn trong cơ sở dữ liệu, bạn có thể thực hiện theo 2 cách gồm:
- Sử dụng Hashing (Băm) thay vì mã hóa
- Sử dụng Salt (Muối) khi băm mật khẩu
Bạn lưu ý sử dụng các thuật toán băm được thiết kế để bảo vệ mật khẩu, chẳng hạn bcrypt, Argon2, PBKDF2 hoặc scrypt.
Câu hỏi phỏng vấn Backend về các kỹ thuật lập trình và công cụ
ORM (Object-Relational Mapping) là gì?
ORM là viết tắt của Object-Relational Mapping, dịch sang tiếng Việt là Ánh xạ đối tượng-quan hệ.
Đây là một kỹ thuật lập trình được sử dụng để ánh xạ (mapping) các đối tượng trong lập trình hướng đối tượng (OOP) với các bảng trong cơ sở dữ liệu quan hệ.
Dependency Injection là gì?
Dependency Injection (DI) là một mẫu thiết kế phần mềm giúp giảm sự kết nối chặt chẽ giữa các thành phần phần mềm.
Nó liên quan đến việc cung cấp các phụ thuộc (đối tượng hoặc dịch vụ) cho một lớp hoặc hàm thay vì để lớp hoặc hàm tự tạo ra chúng.
Unit test và Integration test khác nhau như thế nào?
Unit test – Kiểm thử đơn vị là phương pháp kiểm thử phần mềm trong đó các thành phần phần mềm riêng lẻ (chức năng hoặc quy trình) được kiểm tra độc lập để phát hiện lỗi.
Trong khi đó, Integration test – Kiểm thử tích hợp là quá trình kiểm tra giao diện giữa các mô-đun phần mềm để đảm bảo tính chính xác của các tương tác giữa chúng.
Các điểm khác nhau của Unit test và Integration test gồm:
Tiêu chí | Unit test | Integration test |
Cách thử nghiệm | Mỗi mô-đun của phần mềm được thử nghiệm riêng biệt. | Tất cả mô-đun của phần mềm được thử nghiệm kết hợp. |
Trình tự | Thực hiện trước tiên trong tất cả các quy trình kiểm thử. | Thực hiện sau kiểm thử đơn vị và trước kiểm thử hệ thống. |
Vị trí kiểm thử | Kiểm thử hộp trắng. | Kiểm thử hộp đen. |
Chủ thể thực hiện | Thực hiện bởi nhà phát triển.
Người kiểm thử biết được thiết kế bên trong của phần mềm. |
Thực hiện bởi người kiểm thử.
Không biết được thiết kế bên trong của phần mềm. |
Điều kiện thực hiện | Kiểm tra các phần của dự án mà không cần chờ các phần khác hoàn thành. | Chỉ kiểm tra sau khi hoàn thành tất cả phần. |
Chi phí | Ít tốn kém hơn. | Tốn kém hơn. |
Khả năng bao quát | Chỉ có nhiệm vụ quan sát chức năng của từng đơn vị riêng lẻ. | Phát hiện lỗi diễn ra khi các mô-đun được tích hợp để tạo thành một hệ thống tổng thể. |
Tính độc lập | Không đảm bảo mã của bạn hoạt động bình thường với các phụ thuộc bên ngoài. | Đảm bảo mã của bạn hoạt động bình thường với các phụ thuộc bên ngoài. |
Tốc độ | Thực hiện nhanh hơn so với thử nghiệm tích hợp. | Tốc độ chậm vì tích hợp nhiều mô-đun. |
Cho biết các tính năng chính của Docker
Docker là một nền tảng mã nguồn mở cung cấp cho người dùng những công cụ để có thể đóng gói, vận chuyển và chạy các ứng dụng trên các nền tảng khác nhau. Các tính năng chính của Docker gồm:
- “Container hóa ứng dụng”: Docker cho phép đóng gói một ứng dụng cùng với tất cả phụ thuộc của nó vào một container, giúp ứng dụng có thể chạy nhất quán trên bất kỳ môi trường nào (local, máy chủ hay cloud).
- Tính di động cao: Các container của Docker có thể chạy trên bất kỳ hệ điều hành hoặc máy chủ nào mà hỗ trợ Docker, giúp giảm thiểu sự khác biệt giữa các môi trường phát triển, kiểm thử và sản xuất.
- Khả năng mở rộng và quản lý: Docker hỗ trợ việc mở rộng ứng dụng bằng cách chạy nhiều container đồng thời. Docker Compose và Docker Swarm giúp dễ dàng quản lý các container trong một môi trường phân tán.
- Hiệu suất cao và nhẹ: Vì các container chia sẻ nhân hệ điều hành (OS) thay vì tạo một máy ảo đầy đủ, Docker tiêu tốn ít tài nguyên hơn và nhanh hơn so với các giải pháp máy ảo truyền thống.
- Tính nhất quán: Docker đảm bảo rằng ứng dụng sẽ chạy giống nhau từ môi trường này sang môi trường khác, giảm thiểu vấn đề “works on my machine”.
Đọc thêm: Docker là gì? Hãy để Senior DevOps Engineer trả lời cho bạn!
Câu hỏi phỏng vấn Backend về ngôn ngữ lập trình
Giải thích callback, promise và async/await trong JavaScript
Callback là một hàm được truyền vào một hàm khác như một đối số và được thực thi sau khi một thao tác nào đó hoàn thành. Đây là một trong những cách đơn giản nhất để xử lý các thao tác bất đồng bộ trong JavaScript.
Promises cung cấp cách xử lý các thao tác bất đồng bộ. Một promise đại diện cho một giá trị có thể có ngay bây giờ, trong tương lai hoặc có thể không bao giờ có. Nó có thể ở một trong ba trạng thái: đang chờ (pending), đã hoàn thành (fulfilled) hoặc bị từ chối (rejected).
Async/await là cú pháp mới được giới thiệu trong ES2017 (ES8), cho phép viết code bất đồng bộ mà trông giống như code đồng bộ. Nó được xây dựng trên promises, giúp code dễ đọc và dễ viết hơn.
Giải thích sự khác biệt giữa == và is trong Python
is được gọi là toán tử danh tính. Khi các biến ở cả hai bên của toán tử trỏ đến cùng một đối tượng, thì toán tử is sẽ đánh giá là đúng. Nếu không, nó sẽ đánh giá là Sai.
Trong khi đó, == được gọi là toán tử bằng. Khi các biến ở cả hai bên có cùng giá trị chính xác, toán tử == sẽ đánh giá là đúng. Nếu không, nó sẽ đánh giá là Sai.
Đọc thêm: Tổng hợp 25+ câu hỏi phỏng vấn Python về thuật toán phổ biến
Generics là gì? Vai trò của generics trong Java hoặc C#?
Generics là một tính năng trong các ngôn ngữ lập trình như Java và C#, cho phép định nghĩa các lớp, phương thức và giao diện mà không cần xác định rõ kiểu dữ liệu ngay từ đầu. Thay vào đó, bạn có thể sử dụng các tham số kiểu (type parameters) để làm đại diện, và chỉ định kiểu cụ thể khi sử dụng.
Trong lập trình backend, generics giúp:
- An toàn kiểu dữ liệu (Type Safety): Đảm bảo chỉ sử dụng kiểu dữ liệu đúng như mong muốn.
- Tăng tính linh hoạt và tái sử dụng: Cùng một đoạn code có thể dùng cho nhiều kiểu dữ liệu khác nhau.
- Giảm nhu cầu ép kiểu (Casting): Hạn chế lỗi khi chuyển đổi kiểu dữ liệu.
Đọc thêm: Top 40+ câu hỏi phỏng vấn Java nhất định có trong buổi phỏng vấn
Bạn hiểu gì về Garbage Collection trong C/C++?
Trong C/C++, lập trình viên phải tự quản lý việc tạo và hủy các đối tượng. Tuy nhiên, nhiều khi lập trình viên quên hoặc bỏ qua việc hủy những đối tượng không còn cần thiết. Điều này dẫn đến việc bộ nhớ bị đầy sau một thời gian, khiến chương trình không thể tạo thêm đối tượng mới và có thể kết thúc bất thường với lỗi OutOfMemoryError.
Ngược lại, trong Java, lập trình viên không cần lo lắng về việc giải phóng các đối tượng không sử dụng nữa. Công việc này được thực hiện bởi Trình thu gom rác (Garbage Collector). Nhiệm vụ chính của Garbage Collector là giải phóng bộ nhớ heap bằng cách loại bỏ các đối tượng không còn được tham chiếu. Đây là một ví dụ điển hình về luồng Daemon, vì nó luôn hoạt động ngầm trong nền, đảm bảo chương trình vận hành mượt mà và hiệu quả.
Đọc thêm: Ngôn ngữ backend nên học: Ngôn ngữ nào phổ biến nhất?
Câu hỏi phỏng vấn Backend về hệ thống phân tán
Giải thích về CAP Theorem và ý nghĩa của nó trong hệ thống phân tán
Định lý CAP (CAP theorem) nói rằng cơ sở dữ liệu phân tán không thể đồng thời đảm bảo cả ba yếu tố: Nhất quán, khả dụng và phân vùng. Cụ thể:
- Tính nhất quán dữ liệu (Data Consistency): Nghĩa là tất cả các nút trong hệ thống sẽ nhìn thấy cùng một giá trị dữ liệu tại một thời điểm nhất định. Điều này rất quan trọng trong mô hình phân tán, vì dữ liệu cần được sao chép gần như ngay lập tức giữa các máy chủ để đảm bảo tính nhất quán.
- Khả dụng (Availability): Nghĩa là mỗi yêu cầu gửi đến hệ thống luôn nhận được phản hồi hợp lệ, dù là thành công hay lỗi.
- Chịu lỗi phân vùng (Partition Tolerance): Hệ thống phân tán vẫn hoạt động và duy trì dữ liệu mà không bị mất mát, ngay cả khi có sự cố mạng cục bộ làm gián đoạn kết nối giữa các máy chủ.
Ví dụ:
- Nếu hệ thống đảm bảo tính nhất quán và khả dụng cao, nó sẽ không thể chịu được các sự cố phân vùng mạng.
- Ngược lại, nếu hệ thống đảm bảo khả dụng cao và chịu lỗi phân vùng, nó sẽ không thể đảm bảo tính nhất quán dữ liệu ngay lập tức.
Sự khác biệt giữa RPC API và REST API trong các hệ thống phân tán là gì?
Remote Procedure Call (RPC) là một phương pháp xây dựng ứng dụng phân tán theo mô hình client-server, cho phép gọi hàm từ xa tương tự như gọi hàm cục bộ. RPC không yêu cầu thủ tục được gọi nằm trong cùng không gian địa chỉ với thủ tục thực thi và luồng điều khiển luân phiên giữa client và server thay vì thực thi đồng thời.
REST API (Representational State Transfer Application Programming Interface) là một giao diện lập trình ứng dụng cho phép các hệ thống phần mềm khác nhau giao tiếp với nhau qua mạng, thường là Internet. Nó sử dụng các phương thức HTTP chuẩn (GET, POST, PUT, DELETE,…) để quản lý dữ liệu giữa máy khách và máy chủ.
Sự khác biệt giữa RPC API và REST API trong các hệ thống phân tán:
RPC API | REST API |
Gọi hàm từ xa | Tương tác với tài nguyên qua HTTP |
Chỉ hỗ trợ các yêu cầu GET và POST (điều này không cố định) | Hỗ trợ các phương thức HTTP GET, POST, PUT, PATCH và DELETE |
Không có tính linh hoạt đối với kiến trúc phần cứng | Cung cấp tính linh hoạt cho kiến trúc phần cứng |
Yêu cầu tải trọng của một vài kiểu dữ liệu như XML cho XML-RPC | Cho phép chỉ định các tiêu đề Content-type hoặc Accept |
Microservice là gì? Khi phân tách một khối đơn thành các microservice cần lưu ý gì không?
Microservices là một phong cách kiến trúc phần mềm cho phép bạn cấu trúc ứng dụng backend thành một tập hợp các dịch vụ độc lập, mỗi dịch vụ phục vụ một nhu cầu kinh doanh cụ thể.
Nếu muốn chuyển đổi từ một hệ thống nguyên khối (monolith) sang hệ thống microservices, cần lưu ý những điểm sau:
- Xác định ranh giới logic của hệ thống nguyên khối: Phân tích logic bên trong hệ thống để nhận diện các trách nhiệm và loại tài nguyên khác nhau. Tìm ranh giới giữa chúng để xác định nơi một dịch vụ kết thúc và dịch vụ khác bắt đầu.
- Định nghĩa các dịch vụ: Dựa trên ranh giới đã xác định, chia nhỏ nhu cầu dữ liệu của hệ thống. Có thể phân tách thành nhiều bảng dữ liệu hoặc thậm chí các cơ sở dữ liệu độc lập nếu phù hợp.
- Tiến hành tái cấu trúc từng bước: Dần dần tách logic của từng microservice khỏi hệ thống nguyên khối và chuyển thành các dự án riêng biệt.
- Kết quả cuối cùng: Khi hoàn tất, hệ thống nguyên khối ban đầu sẽ không còn cần thiết và các microservices sẽ có quy trình triển khai độc lập cùng kho code nguồn riêng biệt.
Hệ thống hàng đợi thông điệp (Message Queues) là gì?
Hệ thống hàng đợi thông điệp (Message Queues) là một công nghệ cho phép các ứng dụng hoặc dịch vụ giao tiếp với nhau thông qua việc gửi và nhận thông điệp (messages) thông qua các hàng đợi (queues).
Đây là một mô hình được sử dụng phổ biến trong các hệ thống phân tán để đảm bảo tính asynchronous (bất đồng bộ), giúp các ứng dụng có thể giao tiếp mà không cần phải đồng thời thực thi cùng lúc.
Tổng kết câu hỏi phỏng vấn Backend
Bạn trả lời được bao nhiêu câu hỏi phỏng vấn Backend trong số hơn 30 câu nêu trên? Đừng quên ngoài việc củng cố kiến thức, hãy chú ý trau dồi thêm khả năng thực hành lập trình nữa nhé. Chúc bạn vượt qua được bài phỏng vấn Backend Developer và sớm được làm việc trong môi trường mơ ước nhé.