Backend
19 bài viết trong danh mục này
Gửi thông báo Telegram từ NestJS: alert lỗi, deploy và monitor
Tích hợp Telegram Bot API vào NestJS: TelegramModule, exception filter bắt 5xx, BullMQ job fail, app start và deploy xong — không cần thư viện ngoài.
Race condition trong MySQL: isolation level nào giải quyết được?
MySQL có 4 isolation level nhưng mặc định REPEATABLE READ không chặn được mọi race condition. Dirty read, lost update, phantom read — từng loại xảy ra khi nào, isolation level nào ngăn được, và khi nào cần SELECT FOR UPDATE.
Tại sao không nên dùng database để validate input trong backend
Nhiều backend dựa vào NOT NULL, VARCHAR(n), UNIQUE constraint của database để bắt lỗi input. Quan điểm này sai về kiến trúc — database không phải lớp validate. Validate đúng chỗ: DTO hoặc service layer, trước khi data chạm vào DB.
MySQL Deadlock: cách đọc log InnoDB và giảm xác suất xảy ra
Deadlock trong MySQL tự resolve nhưng rollback transaction ngẫu nhiên gây lỗi ở app layer. Cách đọc SHOW ENGINE INNODB STATUS để biết chính xác dòng nào bị lock, nguyên nhân phổ biến, và 5 cách giảm xác suất deadlock.
N+1 Query trong ORM: cách phát hiện bằng SQL log và fix bằng eager loading
N+1 query không gây lỗi nhưng làm API chậm dần khi data tăng — ORM gửi 1 query lấy danh sách rồi lặp N query con. Cách bật SQL log để bắt, đếm query per request, và fix bằng include, batch, hoặc DataLoader.
MySQL query chậm vì ORDER BY và LIMIT: nguyên nhân và cách tối ưu
ORDER BY kết hợp LIMIT có thể gây filesort trên triệu bản ghi dù bảng đã có index. Giải thích cách MySQL chọn execution plan, cách đọc EXPLAIN, và 4 pattern tối ưu thực tế.
Cách nâng NestJS 7 lên 11 bằng AI mà không đổi logic code
Cách nâng NestJS cũ lên mới bằng AI mà ít lỗi: nâng từng major version, khoanh breaking change, review git diff và giữ nguyên logic code.
Cách phân biệt DTO, Model và Entity trong backend
Cách phân biệt DTO, Model và Entity trong backend để tránh dùng lẫn giữa controller, service và database, đặc biệt khi dùng TypeORM và validate đầu vào.
Cách tách bạch Backend, Frontend và Tester để tránh đổ lỗi
Cách tách bạch Backend, Frontend và Tester để tránh đổ lỗi, lệch logic và tranh cãi khi thiết kế API, validate dữ liệu và test hệ thống.
Chiến lược caching giảm tải database và API
Các chiến lược caching thực tế để giảm tải database và API: cache-aside, write-through, write-behind, TTL và cache invalidation.
5 extension VSCode nên cài cho backend dev
Remote SSH, Docker, Prettier, ESLint và Code Spell Check: 5 extension VSCode giải quyết các việc dev thực tế hằng ngày.
Áp dụng SOLID để giảm coupling trong dự án lớn
Cách áp dụng SOLID vào code thực tế để giảm coupling, giảm code rối, dễ test, dễ mở rộng và đỡ đau đầu hơn khi dự án bắt đầu lớn lên.
Stateless và stateful khi scale nhiều instance
Giải thích stateless và stateful cho backend, kèm lỗi hay gặp khi scale như schedule chạy trùng, lưu file local và giữ state trong memory.
NestJS xử lý lỗi logic bằng error code nội bộ và LogicalException
Cách chuẩn hoá lỗi logic trong NestJS bằng message code, LogicalException, HttpException và error code để debug nhanh hơn.
Cách thiết kế database nhất quán, ít lệch dữ liệu
Nguyên tắc thiết kế database để giữ dữ liệu nhất quán: naming, primary key, foreign key, unique, not null và chuẩn hoá vừa đủ.
PM2 chạy NestJS production: restart, log và reboot
Cách dùng PM2 để chạy NestJS trên VPS hoặc server Linux, gồm build app, start bằng ecosystem file, xem log, restart khi crash và tự khởi động lại sau reboot.
BullMQ Job stalled với ElastiCache dù Redis vẫn chạy
Phân tích nguyên nhân và cách khắc phục lỗi BullMQ timeout, Job stalled khi dùng AWS ElastiCache (Redis).
Redis queue trong NestJS với BullMQ: cách triển khai
Cách dùng Redis làm queue trong NestJS với BullMQ, từ luồng producer-consumer, retry, delay job đến các lưu ý production khi xử lý email, webhook và tác vụ nền.
NestJS mất kết nối Redis: cấu hình ioredis reconnect
Cách cấu hình ioredis trong NestJS để reconnect an toàn khi Redis disconnect, gặp TCP idle timeout hoặc ElastiCache failover trả về READONLY.