| Chợ Tốt | Facebook Marketplace | Nhóm Facebook | Chợ 2Hand | |
|---|---|---|---|---|
| Không cần đăng ký | ||||
| Dễ tiếp cận | ||||
| Đăng tin với video | ||||
| Miễn phí | ||||
| An toàn |



| iPhone | Android | |
|---|---|---|
| Zalo yêu cầu tối thiểu | iOS 15.1 | Android 7.0 |
| Thiết bị | iPhone 6s, iPhone SE (thế hệ 1) trở lên | Mọi máy Android 7.0 trở lên |
| Mini App chạy trong | WKWebView, nhân WebKit của iOS | Android WebView, nhân Chromium |





Cuộn Feed liên tục 60 s, đo bằng Chrome DevTools Performance (CPU throttling 4×).

| Autoplay policy | Chrome | Safari |
|---|---|---|
| Muted | Mặc định cho phép | Mặc định cho phép |
| Unmuted | Sau khi user đã click vào trang | play() phải gọi ngay trong user click action |
Tạo 1 video element ngay khi mở app.
Tải trước 10 reels.
Gọi play() ngay trong hàm chuyển tab Reels.
Chỉ đổi src khi lướt sang video khác.
10 ảnh × vài MB = vài chục MB phải upload.

| Hiển thị | CSS px | × DPR | = Pixel cần | Chọn |
|---|---|---|---|---|
| Ảnh chi tiết | 390 | × 3 | 1.170 | 1600 px |
| Thumbnail feed | 172 | × 3 | 516 | 600 px |
| Định dạng | Dùng ở đâu | Dung lượng / ảnh | Thời gian nén / ảnh | Ưu điểm | Hạn chế |
|---|---|---|---|---|---|
| JPEGlibjpeg-turbo | Client | 180 KiB | 10 ms | Tương thích rộng Nén nhanh nhất | Nặng nhất Không có nền trong suốt |
| JPEGmozjpeg | Server · ảnh chi tiết | 152 KiB | 98 ms | Tương thích rộng Nhẹ hơn libjpeg-turbo Ảnh lớn nhẹ ngang WebP | Nén chậm hơn libjpeg-turbo Không có nền trong suốt |
| WebP | Server · thumbnail feed | 149 KiB | 126 ms | Ảnh nhỏ nhẹ hơn JPEG Có nền trong suốt | iPhone không nén được |
| AVIF | Không dùng | 88 KiB | 2.340 ms | Nhẹ nhất ở cùng chất lượng | iOS 15 không xem được Nén chậm nhất |
| JPEG XL | Không dùng | 113 KiB | 865 ms | Hiện dần khi đang tải Đổi từ JPEG không mất gì | iOS 15–16 chưa xem được Điện thoại không nén được |
Ảnh upload nhẹ hơn ảnh gốc, chất lượng gần như ảnh gốc.

Upload, xử lý và tải về đều lâu.

| Codec | Trình duyệt hỗ trợ | Nhẹ hơn H.264 | Điểm mạnh | Hạn chế |
|---|---|---|---|---|
| H.264 | 97,5% | Mốc so sánh | Hỗ trợ trên tất cả máy Nén nhanh trên cả app và server | File nặng nhất trong 4 codec |
| H.265HEVC | 95%75% có điều kiện | ~50% | File nhẹ bằng khoảng một nửa iPhone quay mặc định bằng H.265 | Android: máy phải có chip giải mã H.265 và Chrome 107 (2022) trở lên |
| VP9 | 97,3% | ~25% | Phát được trên Chrome và Android | iPhone từ iOS 17.4 mới phát được |
| AV1 | 96%17% có điều kiện | ~50% | File nhẹ nhất Phát được trên Chrome và Android | iPhone chỉ phát được từ 15 Pro trở lên |
Video người bán trên production nhẹ hơn video gốc.

| Tầng cache | Dữ liệu | TTL | Invalidate |
|---|---|---|---|
| App cacheIn memory | Feed, Detail, Reels | 60 giây | Update tin; kéo để làm mới |
| Quản lý tin | 60 giây | Update tin | |
| Category, Location | Infinity | Mở lại app | |
| PersistentDisk | Category, Location | 1 ngày | - |
| Phiên đăng nhập | Theo token | Lỗi 401 | |
| HTTP + CDNWebView, CloudFront | Ảnh, video | 1 năm, immutable | - |
| API khác | ETag / 304 | - |
| Authentication | 401 → Refresh Zalo token một lần → Retry requestSingle-flight refresh cho các request đồng thời. |
|---|---|
| Network / API | Retry một lần → Error UICó nút Thử lại; tự refetch khi kết nối phục hồi. |
| Duplicate Submit | Chống tạo tin trùng khi retryGiữ nguyên Idempotency-Key khi gửi lại; server trả về kết quả đã tạo. |
| Rendering | Error Boundary cô lập lỗi theo trangGiữ navigation hoạt động; ghi nhận lỗi bằng Sentry. |


| Image Processing | Lỗi xử lý → Fallback ảnh gốcWorker crash/timeout → khởi tạo lại, retry 1 lần; không hỗ trợ → bỏ qua tối ưu. |
|---|---|
| Image Upload | Tối đa 3 lần thử với exponential backoff + jitterHết lượt → người dùng chủ động Thử lại. |
| Video Upload | Multipart upload → chỉ gửi lại các part chưa hoàn thànhGiữ các part đã hoàn thành, tránh upload lại toàn bộ video. |





Kèm manual testing trên máy Android và iPhone thật.
Cần xác định ưu tiên sớm hơn, cân bằng thời gian giữa UX và technical challenges.
Nên ghi lại quyết định kỹ thuật và xây dựng slide theo từng milestone, thay vì dồn vào cuối dự án.

| Worker × ảnh | Tối ưu xong | Upload xong |
|---|---|---|
| 1 × 1 (hiện tại) | 1,4 s | 5,6 s |
| 1 × 2 | 1,4 s | 4,4 s |
| 2 × 1 | 1,1 s | 6,2 s |
| 2 × 2 | 1,4 s | 7,2 s |