I. Một số service hay bị bottle neck
Một số service thường bị bottle neck mà mình thường thấy có thể kể đến như:
- Gateway service
- Authentication service
- Database service
- File upload | download
- Search service
- Service chat, stream
II. Database
- 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 operations.
- 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.
- Implement caching strategy: 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.
- Database 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.
- Sử dụng database phù hợp: Xem xét việc sử dụng các loại database chuyên biệt 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.
- Quản lý 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.
- Tối ưu hóa 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.
- Tối ưu hóa 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ộ hoặc batch processing, có thể thực hiện trong thời gian thấp điểm của hệ thống.
III. Service
- Á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.