Bạn có mệt mỏi với việc các API chậm chạp khiến ứng dụng của bạn chậm chạp không?
Trong bài viết hôm nay, chúng ta sẽ khám phá 7 kỹ thuật tối ưu hóa có thể giúp API của bạn hoạt động tốt nhất.
Bạn đã xây dựng 1 API tuyệt vời nhưng nó không nhanh như bạn mong muốn. Nhưng đừng lo lắng...
Trước khi chúng ta bắt đầu, điều quan trọng cần lưu ý là tối ưu hóa không phải là bước đầu tiên trong quy trình của bạn. Tính năng tối ưu hóa có tác dụng mạnh mẽ nhưng có thể dẫn đến sự phức tạp không cần thiết nếu thực hiện sớm. Bước đầu tiên phải luôn là xác định các điểm nghẽn thực tế thông qua các yêu cầu kiểm tra tải và profiling. Chỉ bắt đầu tối ưu hóa sau khi bạn xác nhận rằng API endpoint có vấn đề về hiệu suất.
Như đã nói, hãy bắt đầu đi vào các tips.
1 - First up - caching
Kỹ thuật này là 1 trong những cách hiệu quả nhất để tăng tốc API của bạn. Bằng cách lưu vào cache, tôi lưu trữ kết quả của 1 phép tính tốn kém để có thể sử dụng lại sau này mà không cần thực hiện lại phép tính.
Nếu bạn có 1 endpoint thường xuyên được truy cập với cùng 1 request paramters, thì bạn có thể tránh các lần truy cập database lặp lại bằng cách lưu response vào cache trong Redis hoặc Memcached.
Hầu hết các caching libraries đều giúp việc thêm tính năng này trở nên dễ dàng chỉ bằng 1 vài dòng code. Ngay cả 1 khoảng thời gian ngắn được lưu vào cache cũng có thể tạo ra sự khác biệt đáng kể về tốc độ.
2 - Connection pooling
Kỹ thuật tối ưu hóa này liên quan đến việc duy trì 1 nhóm kết nối mở thay vì mở kết nối database mới cho mỗi lệnh gọi API.
Việc tạo kết nối mỗi lần liên quan đến rất nhiều protocols và quá trình thiết lập có thể làm chậm API của bạn. Việc sử dụng lại các kết nối này có thể cải thiện đáng kể thông lượng.
Nếu bạn đang sử dụng serverless architecture, việc quản lý kết nối có thể khó khăn hơn 1 chút.
Điều này là do mỗi serverless function instance thường mở kết nối database của riêng mình và vì không có server có thể mở rộng quy mô nhanh chóng, điều này có thể dẫn đến 1 số lượng lớn các open connections làm quá tải database.
Các giải pháp như AWS RDS Proxy và Azure SQL database được thiết kế để xử lý tính huống này và quản lý việc tổng hợp kết nối cho bạn.
3 - N + 1 query problem
Liên quan chặt chẽ đến hiệu suất database, tip thứ 3 là tránh các vấn đề về truy vấn N + 1. Sự cố N + 1 là sự kém hiệu quả phổ biến có thể xảy ra khi truy cập data của 1 entity và các entities liên quan của nó. Ví dụ : giả sử bạn đang build 1 API endpoint để tìm nạp các bài đăng trên blog và comments đi kèm của các bài đăng đó. Sự cố N + 1 sẽ xảy ra nếu trước tiên bạn thực hiện truy vấn để tìm nạp bài đăng, sau đó đối với mỗi bài đăng bạn thực hiện 1 truy vấn khác để tìm nạp commments của bài đăng đó. Nếu bạn có N bài đăng, điều này sẽ dẫn đến 1 query cho bài đăng cộng với N query cho comments, dó đó có thuật ngữ "N + 1 problem".
Để tránh điều này, sẽ hiệu quả hơn khi tìm nạp dữ liệu trong 1 query hoặc trong 1 số trường hợp, 2 truy vấn : 1 để tìm nạp bài đăng và 1 để tìm nạp tất cả comments cho những bài đăng đó. Điều này tránh tạo 1 truy vấn riêng cho từng comment của bài đăng và có thể giảm đáng kể số lần truy cập khứ hồi tớ database, cải thiện hiệu suất.
4- Pagination
Tip thứ 4, hãy cân nhắc sử dụng tính năng phân trang. Nếu API response của bạn trả về 1 lượng lớn dữ liệu thì điều đó có thể làm mọi thứ chậm lại. Thay vào đó, hãy chia response thành các trang nhỏ hơn, dễ quản lý hơn bằng cách sử dụng các parameters limit và offset. Điều này có thể tăng tốc độ data transfer và giảm tải cho client side.
5 - Lightweight JSON serializers
Khi trả về JSON response từ API của bạn, tốc độ của quá trình serialization có thể tạo ra sự khác biệt đáng chú ý về thời gian phản hồi. Hãy cân nhắc việc sử dụng serialization library nhanh để giảm thiểu thời gian chuyển đổi data của bạn sang JSON fomat.
6 - Compression
Kỹ thuật thứ 6, tính năng nén. Bằng cách bật tính năng nén trên các large API response payloads, bạn có thể giảm lượng dữ liệu được truyền qua mạng. Sau đó, client sẽ giải nén dữ liệu.
Ngày nay thậm chí còn có những thuật toán hiệu quả hơn như Brotli mang lại tỷ lệ nén tốt hơn. Ngoài ra, nhiều Content Delivery Networks (CDNs) như Cloudflare có thể xử lý việc nén cho bạn, giảm tải tác vụ này khỏi server của bạn.
7 - Asynchronous logging
Trong nhiều ứng dụng, thời gian để ghi log là không đáng kể. Tuy nhiên trong các hệ thống có thông lượng cao nơi mỗi mili giây đều có giá trị, thời gian ghi log có thể tăng lên.
Trong những trường hợp như vậy, tính năng ghi log bất đồng bộ có thể giúp ích. Điều này liên quan đến luồng ứng dụng chính nhanh chóng đặt mục nhập log vào vùng đệm trong bộ nhớ, trong khi 1 luồng ghi log riêng biệt ghi các mục log vào file hoặc gửi chúng đến service ghi log.
Chỉ cần lưu ý rằng với tính năng ghi log bất đồng bộ, có 1 khả năng nhỏ là bạn có thể mất 1 số log nếu ứng dụng của bạn gặp sự cố trước khi được ghi.
END
Trên đây là 7 tips giúp API của bạn nhanh hơn và hiệu quả hơn. Nếu bạn có bất kỳ kỹ thuật nào khác mà bạn thấy hữu ích, hãy cho tôi biết trong phần comments. Cảm ơn bạn đã xem và hẹn gặp lại bạn trong bài viết tiếp theo !