[Phỏng vấn BE] Giải quyết "bottleneck" ở trong microservice
I. Một số service hay bị bottleneck
Một số service bị bottleneck thường thấy như:
- API gateway
- Authentication
- Database
- File upload | download
- Search engine
- Service chat, stream
II. Xử lý bottleneck tại database
- Sử dụng database phù hợp: Xem xét việc sử dụng các loại database chuyên biệt ngay từ đầu cho các use case cụ thể. Ví dụ, sử dụng Elasticsearch cho tìm kiếm, NoSQL cho dữ liệu phi cấu trúc.
- Vertical scaling: Trong một số trường hợp, nâng cấp phần cứng của database server cũng có thể là một giải pháp tạm thời.
- Read replica: Với nhận xét rằng operations đọc thường gấp 9 lần operations ghi, việc áp dụng CQRS (Command Query Responsibility Segregation) có thể giúp tách biệt và tối ưu hóa riêng cho read và write.
- Data archiving: Đề cập đến việc lưu trữ dữ liệu cũ để giảm kích thước của active database.
- Tối ưu hóa các database queries, đảm bảo rằng chúng được thực thi hiệu quả. Việc thêm các index phù hợp có thể giúp giảm đáng kể thời gian truy vấn và tải CPU.
- Caching: Triển khai một hệ thống caching hiệu quả, như Redis, để giảm số lượng truy vấn trực tiếp đến database. Điều này đặc biệt hữu ích cho các dữ liệu đọc thường xuyên.
- Sharding: Triển khai database sharding để phân tán tải trên nhiều máy chủ, giúp cải thiện hiệu suất và khả năng mở rộng.
- Locks và transactions: Tối ưu hóa việc sử dụng locks và giảm thiểu thời gian của các transactions để giảm lock contention.
- Connection management: Sử dụng connection pooling để quản lý hiệu quả số lượng kết nối đến database, giúp giảm overhead của việc tạo và đóng connections.
- Stored procedures và triggers: Hạn chế sử dụng
stored procedures
vàtriggers
quá nhiều, thay vào đó chuyển logic xử lý sang backend khi có thể. - Xử lý asynchrous và batch processing: Chuyển các tác vụ không cần đồng bộ cao sang xử lý bất đồng bộ, cronjob, hoặc batch processing, có thể thực hiện trong thời gian thấp điểm của hệ thống.
III. Xử lý bottleneck tại các service khác
- Áp dụng
Event-driven architect
để giảm sự phụ thuộc lẫn nhau giữa các service. các tác vụ năng nên được xử lý bất đồng bộ thông qua MQ. - Tách nhỏ trách nhiệm của các service chịu tải cao thành service chuyên biệt hơn. Áp dụng DDD để phân tách service một cách hợp lý.
- Refactor code để cải thiện hiệu suất:
- Giảm bớt n+1 query trong backend
- Kiểm tra xem có memory leak không
- Kiểm tra các vòng lặp
- Áp dụng CDN cho nội dung tĩnh để giảm tải cho servers.
- Implement background jobs cho các tác vụ không cần phản hồi ngay lập tức. (import, export, gửi mail…)
- Thread deadlocks hoặc race conditions.
- Quản lý connection pool kém.
IV. Infrastructure
- Nâng cấp phần cứng nếu cần thiết.
- Xem xét việc sử dụng serverless computing cho một số tác vụ.
- Sử dụng các thuật toán load balancing phức tạp hơn để phân phối tải hiệu quả.
- Xem xét việc sử dụng service mesh để quản lý traffic giữa các services.
Tham khảo
Group discord 2k+ mems: chém gió về lập trình và làm pet project cùng nhau
All rights reserved