Khi lập trình viên backend báo cáo công việc trong cuộc họp hàng ngày, hầu hết lập trình viên front-end đều không hiểu họ đang làm gì. Họ sử dụng rất nhiều thuật ngữ nghe như tiếng nước ngoài đối với chúng ta. Nhưng đừng lo, bài viết này sẽ giúp bạn giải mã những thuật ngữ đó!
Hãy nhớ rằng, các lập trình viên backend không cố tình làm khó ai cả – họ chỉ đang sử dụng ngôn ngữ chuyên ngành của mình. Hãy cùng phân tích nó thành những thuật ngữ đơn giản hơn và giải mã các khái niệm như giới hạn tỷ lệ, cân bằng tải, proxy và nhiều hơn nữa. Sẵn sàng chưa? Cùng bắt đầu nào!
1. Giới hạn tỷ lệ (Rate Limiting)
Giới hạn tỷ lệ là một cách để kiểm soát số lượng yêu cầu mà một client (như người dùng, ứng dụng hoặc hệ thống) có thể gửi đến máy chủ trong một khoảng thời gian cụ thể. Hãy coi nó như một cảnh sát giao thông đảm bảo không ai sử dụng quá mức hoặc lạm dụng tài nguyên của máy chủ.
Ví dụ: một máy chủ có thể cho phép 100 yêu cầu mỗi phút từ một client. Nếu client vượt quá giới hạn này, máy chủ sẽ từ chối các yêu cầu bổ sung, thường là với phản hồi 429 (Quá Nhiều Yêu Cầu).
Sử dụng Giới hạn tỷ lệ trong các trường hợp:
- Ngăn chặn lạm dụng và quá tải: Giới hạn tỷ lệ đảm bảo không một người dùng hoặc hệ thống nào làm quá tải máy chủ bằng cách gửi quá nhiều yêu cầu, điều này có thể làm sập máy chủ.
- Kiểm soát chi phí: Giúp tránh việc sử dụng tài nguyên cao bất ngờ (như băng thông hoặc sức mạnh tính toán), điều này có thể tốn kém. Ví dụ, giới hạn các lệnh gọi API đến tài khoản của người dùng cấp miễn phí để tránh sử dụng quá mức mà không phải trả tiền.
- Tăng cường bảo mật: Giúp giảm thiểu các cuộc tấn công như DDoS (Từ chối Dịch vụ Phân tán) bằng cách chặn các yêu cầu quá mức từ kẻ tấn công.
2. Cân bằng tải (Load Balancing)
Cân bằng tải là một cách để phân phối các yêu cầu hoặc lưu lượng truy cập đến giữa nhiều máy chủ, nhằm đảm bảo không có máy chủ nào bị quá tải. Hãy coi nó như một cảnh sát giao thông điều hướng ô tô (yêu cầu) đến các làn đường khác nhau (máy chủ) để giữ cho mọi thứ hoạt động trơn tru.
Ví dụ, các nền tảng truyền thông xã hội như Instagram có hàng triệu người dùng truy cập máy chủ của họ đồng thời. Thay vì gửi tất cả những người dùng đó đến một máy chủ, bộ cân bằng tải đảm bảo các yêu cầu của họ được trải đều trên nhiều máy chủ.
Sử dụng Cân bằng tải trong trường hợp:
- Tránh quá tải máy chủ: Nếu tất cả lưu lượng truy cập đều đến một máy chủ, nó có thể bị sập do quá tải. Cân bằng tải ngăn chặn điều này bằng cách phân phối các yêu cầu đồng đều.
- Cải thiện hiệu suất và tốc độ: Bằng cách phân tán lưu lượng truy cập, mỗi máy chủ xử lý một số lượng yêu cầu có thể quản lý được, dẫn đến phản hồi nhanh hơn cho người dùng.
- Mở rộng ứng dụng: Khi lưu lượng truy cập tăng lên, bạn có thể thêm nhiều máy chủ vào nhóm và bộ cân bằng tải sẽ tự động bắt đầu phân phối lưu lượng truy cập đến các máy chủ mới.
- Đảm bảo tính khả dụng cao: Nếu một máy chủ bị lỗi, bộ cân bằng tải sẽ chuyển hướng lưu lượng truy cập đến các máy chủ đang hoạt động khác, đảm bảo trang web hoặc dịch vụ vẫn hoạt động trực tuyến.
3. Caching
Caching là một cách để lưu trữ tạm thời dữ liệu được truy cập thường xuyên, để có thể truy xuất nhanh chóng mà không cần phải lấy lại từ nguồn gốc ban đầu. Hãy coi nó như việc giữ một công thức nấu ăn thường dùng trên quầy bếp. Thay vì tìm kiếm nó trong sách nấu ăn mỗi khi cần, bạn lấy nó từ quầy, tiết kiệm thời gian và công sức.
Hầu hết các hệ thống backend đều sử dụng Caching để lưu trữ kết quả truy vấn cơ sở dữ liệu thường dùng, phản hồi API hoặc các trang web được hiển thị trước. Redis là lựa chọn phổ biến trong số các nhà phát triển backend để lưu trữ dữ liệu trong bộ nhớ đệm.
Sử dụng Caching trong các trường hợp:
- Tăng tốc hiệu suất: Việc lấy dữ liệu từ bộ nhớ đệm nhanh hơn nhiều so với việc lấy nó từ nguồn gốc ban đầu (ví dụ: cơ sở dữ liệu hoặc máy chủ).
- Giảm tải cho máy chủ: Bằng cách phục vụ dữ liệu từ bộ nhớ đệm, bạn giảm số lượng yêu cầu đến backend, ngăn chặn nó bị quá tải.
- Xử lý lưu lượng truy cập cao: Trong thời gian sử dụng cao điểm, bộ nhớ đệm giúp đảm bảo hệ thống có thể xử lý nhiều người dùng mà không bị chậm lại.
4. CDN
CDN (Mạng phân phối nội dung) là một mạng lưới các máy chủ được phân phối trên nhiều vị trí khác nhau, cùng hoạt động để phân phối nội dung đến người dùng nhanh hơn. Nó giúp tăng tốc quá trình tải trang web, hình ảnh, video và nội dung khác bằng cách phục vụ chúng từ máy chủ gần người dùng hơn về mặt địa lý.
Hãy tưởng tượng một thư viện với sách được lưu trữ tại các chi nhánh khác nhau. Thay vì luôn phải đến thư viện trung tâm để lấy sách, bạn có thể đến chi nhánh gần nhất và lấy sách nhanh hơn. CDN cũng hoạt động tương tự bằng cách lưu trữ các bản sao nội dung trang web ở nhiều vị trí.
Sử dụng CDN trong các trường hợp:
- Thời gian tải nhanh hơn: Bằng cách phục vụ nội dung từ máy chủ gần người dùng hơn, CDN làm giảm khoảng cách dữ liệu phải di chuyển, dẫn đến thời gian tải nhanh hơn.
- Khả năng mở rộng và độ tin cậy tốt hơn: CDN giúp trang web dễ dàng mở rộng hơn bằng cách tự động xử lý một lượng lớn người dùng. Nếu một máy chủ bị lỗi, CDN có thể định tuyến lưu lượng truy cập đến một máy chủ khác mà không ảnh hưởng đến trải nghiệm người dùng.
5. Microservices
Microservices là một kiểu kiến trúc, trong đó một ứng dụng được chia thành các dịch vụ nhỏ hơn, độc lập, mỗi dịch vụ chịu trách nhiệm cho một phần chức năng cụ thể. Mỗi microservice giống như một khối xây dựng nhỏ, tập trung vào một nhiệm vụ và giao tiếp với các dịch vụ khác để tạo ra ứng dụng hoàn chỉnh.
Hãy tưởng tượng một công ty, nơi mỗi bộ phận (bán hàng, tiếp thị, tài chính, v.v.) hoạt động độc lập nhưng cộng tác để điều hành doanh nghiệp. Tương tự, trong kiến trúc microservices, mỗi dịch vụ (như quản lý người dùng, xử lý thanh toán, v.v.) hoạt động riêng lẻ nhưng tương tác với những dịch vụ khác để làm cho toàn bộ hệ thống hoạt động.
Ngược lại với Microservices là kiến trúc Monolithic, trong đó tất cả các chức năng của một ứng dụng được kết hợp thành một dịch vụ hoặc cơ sở mã duy nhất.
Sử dụng Microservices trong các trường hợp:
- Khả năng mở rộng: Vì mỗi dịch vụ là độc lập, bạn có thể mở rộng chúng riêng lẻ. Ví dụ, nếu dịch vụ xử lý thanh toán nhận được nhiều lưu lượng truy cập hơn, bạn có thể mở rộng chỉ dịch vụ đó mà không ảnh hưởng đến các dịch vụ khác.
- Tính linh hoạt và lựa chọn công nghệ: Mỗi microservice có thể được xây dựng với một ngăn xếp công nghệ khác nhau, cho phép các nhóm chọn công cụ tốt nhất cho từng công việc. Ví dụ, bạn có thể sử dụng Python cho phân tích dữ liệu và Node.js cho trò chuyện thời gian thực mà không phải lo lắng về khả năng tương thích.
6. API Gateway
API Gateway là một máy chủ hoạt động như một điểm vào cho tất cả các yêu cầu của client đến hệ thống của bạn. Nó định tuyến các yêu cầu đó đến microservice thích hợp, xử lý cân bằng tải, xác thực, bộ nhớ đệm và các tác vụ khác.
Nói một cách đơn giản, nó giống như một người gác cổng, người hướng dẫn khách đến đúng bộ phận trong một tòa nhà lớn.
Hãy tưởng tượng một tổ chức lớn với nhiều bộ phận (microservices) và thay vì đến trực tiếp mỗi bộ phận, khách (người dùng) đi qua một quầy lễ tân trung tâm (API Gateway) để được gửi đến đúng nơi. Kong là một API gateway mã nguồn mở phổ biến được các nhà phát triển backend sử dụng.
Sử dụng API Gateway trong các trường hợp:
- Điểm vào duy nhất: Nó đơn giản hóa sự tương tác giữa client và các dịch vụ backend bằng cách cung cấp một điểm vào duy nhất cho tất cả các yêu cầu, thay vì để client nói chuyện trực tiếp với nhiều microservices. API Gateway định tuyến các yêu cầu đến microservice chính xác dựa trên URL, phương thức hoặc các yếu tố khác, hoạt động như một bộ điều khiển lưu lượng.
- Ghi nhật ký và giám sát: Nó thu thập nhật ký và số liệu cho tất cả các yêu cầu đi qua, giúp giám sát hệ thống và gỡ lỗi sự cố.
- Bảo mật: Nó giới hạn tỷ lệ, cân bằng tải và kiểm tra mã thông báo xác thực trong các yêu cầu đến.
7. Webhook
Webhook là cách để một ứng dụng gửi thông báo hoặc cập nhật theo thời gian thực đến ứng dụng khác khi một sự kiện cụ thể xảy ra. Thay vì ứng dụng nhận liên tục kiểm tra cập nhật (thăm dò), ứng dụng gửi sẽ tự động gửi thông tin khi cần.
Ví dụ, khi có sự kiện quan trọng xảy ra (như giao hàng), người gửi (dịch vụ giao hàng) sẽ nhắn tin cho bạn (người nhận) ngay lập tức, thay vì bạn phải liên tục kiểm tra trang web để cập nhật thông tin.
Sử dụng Webhooks trong trường hợp:
- Thông báo thời gian thực: Webhooks cung cấp các bản cập nhật tức thời, loại bỏ sự chậm trễ do việc thăm dò định kỳ gây ra.
- Tự động hóa: Webhooks cho phép luồng công việc tự động giữa các ứng dụng hoặc hệ thống khác nhau.
8. Phân mảnh (Sharding)
Phân mảnh là phương pháp chia một cơ sở dữ liệu lớn thành các phần nhỏ hơn, dễ quản lý hơn, được gọi là phân mảnh. Mỗi phân mảnh giữ một phần dữ liệu và hoạt động như một cơ sở dữ liệu độc lập.
Hãy nghĩ về phân mảnh như việc chia sách của thư viện thành nhiều phần dựa trên thể loại. Thay vì tìm kiếm toàn bộ thư viện để tìm một cuốn sách, bạn chỉ tìm trong phần có liên quan, giúp quá trình nhanh hơn và hiệu quả hơn.
Sử dụng Sharding trong các trường hợp:
- Hiệu suất được cải thiện: Bằng cách chia dữ liệu thành nhiều phân đoạn, khối lượng công việc được phân bổ. Điều này làm giảm tải cho bất kỳ cơ sở dữ liệu nào và cho phép xử lý truy vấn nhanh hơn.
- Tính khả dụng cao: Nếu một phân đoạn bị hỏng, chỉ một phần dữ liệu bị ảnh hưởng. Phần còn lại của hệ thống vẫn tiếp tục hoạt động, giúp hệ thống có khả năng phục hồi tốt hơn.
9. Proxy
Proxy là máy chủ đóng vai trò trung gian giữa máy khách (như trình duyệt của bạn) và máy chủ khác (như trang web). Thay vì kết nối trực tiếp đến máy chủ, yêu cầu của bạn sẽ đi qua proxy, proxy sẽ chuyển tiếp yêu cầu đến đích và sau đó gửi phản hồi trở lại cho bạn.
Hãy nghĩ về nó như một người trung gian: nếu bạn muốn gửi tin nhắn cho ai đó, bạn sẽ đưa tin nhắn cho người trung gian, người này sẽ chuyển tin nhắn đó cho bạn và mang lại phản hồi.
Sử dụng máy chủ Proxy trong trường hợp:
- Quyền riêng tư và ẩn danh: Proxy ẩn danh tính của bạn bằng cách che giấu địa chỉ IP của bạn. Máy chủ đích chỉ nhìn thấy IP của proxy, không phải của bạn.
- Bỏ qua các hạn chế: Proxy cho phép người dùng truy cập nội dung có thể bị chặn trong khu vực của họ bằng cách định tuyến các yêu cầu qua máy chủ ở một vị trí khác.
10. Hàng đợi tin nhắn (Message Queues)
Hàng đợi tin nhắn là một hệ thống được sử dụng để gửi, lưu trữ và truy xuất tin nhắn giữa các phần khác nhau của ứng dụng (hoặc giữa các ứng dụng) theo cách đáng tin cậy và có tổ chức. Thay vì gửi tin nhắn trực tiếp, hàng đợi hoạt động giống như một bưu điện:
- Một phần của hệ thống (người gửi) sẽ đặt tin nhắn vào hàng đợi.
- Một bộ phận khác (bộ thu) sẽ tiếp nhận thông tin khi nó sẵn sàng xử lý.
RabbitMQ và Apache Kafka là hai hệ thống Message Queues phổ biến,
Sử dụng hàng đợi tin nhắn trong trường hợp:
- Hệ thống tách rời: Hàng đợi tin nhắn cho phép các phần khác nhau của hệ thống hoạt động độc lập. Người gửi và người nhận không cần biết về nhau hoặc làm việc cùng lúc.
- Xử lý không đồng bộ: Hàng đợi tin nhắn cho phép xử lý các tác vụ nền mà không khiến người dùng phải chờ. Ví dụ: Khi bạn tải ảnh lên, ứng dụng sẽ ngay lập tức xác nhận việc tải lên trong khi xử lý các tác vụ thay đổi kích thước và tối ưu hóa ở chế độ nền.
Cảm ơn các bạn đã theo dõi!