Laravel

Kiến thức framework dùng chung, không gắn với project cụ thể nào.

Laravel

Tối ưu Laravel — tốc độ và memory

N+1, chunk/cursor/lazy, cache, queue, opcache, Octane, Livewire — được gì mất gì.

Laravel

Blade nhận gì — Model, array hay Collection?

Truyền model vào view có gì nguy hiểm, khi nào cần DTO, Collection vs array, và bẫy Livewire snapshot.

Kiến trúc

Scale Laravel với nginx + PHP-FPM

Chỗ nghẽn thật là pm.max_children. Cách tính worker, 502 vs 504, và 7 cái bẫy khi lên nhiều node.

Laravel

Chống double-click và duplicate request

4 tầng phòng thủ: khoá nút, idempotency key, lock, unique index. Chỗ Livewire tự lo và chỗ nó bỏ trống.

Laravel

Lưu idempotency key ở Redis

SET NX GET chạy thế nào, design tên key ra sao, và vì sao allkeys-lru âm thầm tạo đơn trùng.

Kiến trúc

Scale out queue worker (database driver)

SKIP LOCKED, retry_after làm job chạy 2 lần, bloat bảng jobs, và 10 cái bẫy khi thêm VM chạy worker.

Kiến trúc

Cache nâng cao — penetration, stampede, avalanche, hot key, lệch dữ liệu

Đo thật 50 process: remember gọi DB 50 lần, lock làm đuôi 2,7 s, flexible không chống cold start. Bloom filter, CAS chống cache cũ.

Kiến trúc

Xây codebase dùng chung cho team

Modular monolith bằng 15 dòng, ranh giới module do test 27 dòng canh, base class nào nên và nào đừng. Đo thật: 31 module không làm app chậm hơn.

Kiến trúc

Domain là gì và chia thế nào

Bộ 7 câu hỏi chấm điểm /10 để quyết một nghiệp vụ có thành domain riêng không. Chia đủ 6 domain cho LMS admin, 6 ca khó, ma trận ai gọi ai. Vì sao không có domain Student.

Design pattern

Gửi thông báo đa kênh — thêm SMS/Slack mà không sửa controller

Strategy + Adapter đã nằm sẵn trong Laravel Notification. 4 mức "ai quyết định kênh", và bẫy chết người: gửi đồng bộ, một kênh throw là các kênh sau không chạy.

Kiến trúc

Gửi mail at-least-once và exactly-once

Monolith chung DB vs mail service riêng qua queue. Outbox, dedupe key, fencing token. Đo thật: afterCommit vẫn mất mail, SMTP timeout gửi trùng.

Kiến trúc

Điểm chuyên cần, điểm tổng kết và đồng bộ với trường

Sổ cái + chặn hạn trong câu INSERT, assignment publish/phúc khảo, 1 video 1 lúc bằng Redis, điểm để trống không thành 0. Đồng bộ với trường bằng version tới khi kết thúc khoá.

Kiến trúc

Gửi mail marketing cho 1 triệu user trong 30 phút

Snapshot người nhận, chunk 500, claim bằng UPDATE, limiter chung, SES SendBulkEmail. Đo thật: queue chung Redis với cache mất sạch job, Redis::throttle cho lọt gấp đôi, index trên status làm ghi chậm gần 2 lần.

Kiến trúc

Xuất báo cáo nặng — không cạn RAM, không treo request

Đo thật 500k dòng: get() 734MB, lazyById 28MB, chunk OFFSET chậm 5 lần và mất dòng, Laravel Excel 100k dòng 610MB. Stream bị cắt ra file thiếu dòng mà vẫn 200. Queue + chống trùng bằng unique index + signed URL, worker OOM exit 137 trên PHP 8.4.27.