Mục tiêu bài học: - Hiểu rõ bài toán Race Condition khi scale ứng dụng lên nhiều server (Microservices). - Nắm vững 3 nguyên tắc sống còn của một Distributed Lock an toàn. - Tự build cơ chế Distributed Lock bằng go-redis và kịch bản Lua (Lua Script). 1. Nỗi đau mang tên Race Condition trong Microservices Giả sử bạn có một trang TMĐT. Sản phẩm "iPhone 16" chỉ còn đúng 1 chiếc trong kh... Chi tiết
Thỉnh thoảng mình lại gặp một yêu cầu nghe rất đơn giản: lấy một đoạn HTML và trả về chữ thuần. Ví dụ trang danh sách bài viết cần hiển thị đoạn trích ngắn của từng bài, nhưng nội dung gốc lưu trong database lại là HTML từ trình soạn thảo. Mình chỉ cần phần chữ, không cần , hay .
Bài này ghi lại vài điều nên làm và không nên làm khi viết hàm stripHtml(), dựa trên một bài viết của...
Chi tiết
⬅️ Bài trước | Mục lục | Bài tiếp theo ➡️ 🎯 Mục tiêu - Dựng bảng giỏ hàng: sửa số lượng, xóa sản phẩm, tính tổng tiền - Dùng Modal của Bootstrap để nhập thông tin giao hàng - Gửi đơn hàng lên API và xử lý kết quả - Sửa lỗi công thức tính tiền theo size — không nhất quán trong source gốc ⚠️ 1. Vấn đề công thức tính tiền theo size Đây là đoạn trong source gốc, trong cột "Đơn Giá": Viết lại c... Chi tiết
⬅️ Bài trước | Mục lục | Bài tiếp theo ➡️ 🎯 Mục tiêu - Hoàn thiện sidebar: nút sắp xếp và ô lọc khoảng giá - Mổ xẻ 3 bug thật trong Productlist của source gốc - Viết lại Productlist đúng chuẩn với useMemo - Hiểu vì sao useRef là lựa chọn sai ở đây Đây là bài quan trọng nhất về mặt tư duy trong toàn bộ tài liệu. Bạn sẽ học cách nhìn ra bug mà mắt thường không thấy. 💻 1. Hoàn thiện sidebar C... Chi tiết
⬅️ Bài trước | Mục lục | Bài tiếp theo ➡️ 🎯 Mục tiêu - Hiểu vấn đề: state Redux mất khi tải lại trang - Cấu hình redux-persist để lưu vào localStorage - Dùng PersistGate để chờ dữ liệu được khôi phục - Xử lý cảnh báo serializable và lỗi hydration 📚 1. Vấn đề Thử ngay: thêm vài sản phẩm vào giỏ, rồi bấm F5. → Giỏ hàng về 0. Vì Redux store nằm trong bộ nhớ RAM của trang web. Tải lại trang =... Chi tiết
⬅️ Bài trước | Mục lục | Bài tiếp theo ➡️ 🎯 Mục tiêu - Hiểu vì sao cần Redux khi đã có useState - Nắm 4 khái niệm: store, slice, action, reducer - Viết cartSlicer với các thao tác thêm/xóa/sửa/xóa hết - Nối Redux vào ứng dụng bằng Provider - Navbar hiện số lượng giỏ hàng, nút "Thêm vào giỏ" hoạt động 📚 1. Vì sao cần Redux? Vấn đề: state cần chia sẻ giữa các component xa nhau AddCardbutton ... Chi tiết
Ở các bài học trước, chúng ta đã biết dữ liệu của một bảng lớn được băm nhỏ và rải đều ra hàng chục đến hàng trăm Segments độc lập (Shared-Nothing). Mỗi Segment chỉ nhìn thấy phần dữ liệu nằm trên ổ cứng của riêng mình. Vậy điều gì sẽ xảy ra khi bạn chạy một câu lệnh JOIN hai bảng với nhau (ví dụ: SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id), trong khi dòng đơn hàng của kh... Chi tiết
Ở Bài học 3, chúng ta đã khám phá "bộ não" Master Node (Coordinator) — nơi nắm giữ bản đồ toàn cục nhưng không lưu trữ bất kỳ một dòng dữ liệu người dùng nào. Vậy hàng chục Terabyte hay hàng tỷ bản ghi thực sự nằm ở đâu? Câu trả lời chính là ở tầng Segment Instances. Nếu Master là vị tướng chỉ huy, thì các Segments chính là đội quân công nhân tinh nhuệ trực tiếp giữ kho lương thực (dữ liệu) và... Chi tiết
Ở Bài học 2, chúng ta đã biết một cụm Greenplum hoạt động theo mô hình "Chỉ huy và Quân đoàn". Trong đó, hàng chục đến hàng trăm Segment phía dưới gánh vác phần nặng nhất là lưu trữ dữ liệu và tính toán cơ bắp. Tuy nhiên, một đội quân hùng hậu sẽ trở nên hỗn loạn nếu thiếu đi người chỉ huy. Đó chính là vai trò của Master Node (từ phiên bản Greenplum 7 trở đi được đổi tên chính thức thành Coordi... Chi tiết
Ở Bài học 1, chúng ta đã biết một máy chủ PostgreSQL đơn lẻ dù mạnh đến đâu cũng sẽ gục ngã trước bức tường băng thông ổ cứng (Disk I/O) khi phải quét hàng chục Terabyte dữ liệu. Để vượt qua giới hạn vật lý đó, Greenplum sử dụng kiến trúc MPP (Massively Parallel Processing — Xử lý song song quy mô lớn). Vậy bên dưới nắp capo, kiến trúc MPP thực sự hoạt động như thế nào? Nó khác gì so với các k... Chi tiết
Khi xây dựng các hệ thống phần mềm, hầu hết chúng ta đều bắt đầu với một cơ sở dữ liệu quan hệ (RDBMS) quen thuộc như PostgreSQL hoặc MySQL. Ở giai đoạn đầu, khi dữ liệu chỉ vài chục Gigabyte hoặc vài triệu bản ghi, mọi thứ chạy cực kỳ mượt mà chỉ với vài chỉ mục (Index) được tối ưu tốt. Nhưng khi hệ thống phát triển lên quy mô hàng tỷ bản ghi (tương đương hàng chục đến hàng trăm Terabyte dữ l... Chi tiết
Ở Bài 32, chúng ta đã tìm hiểu cách di chuyển dữ liệu từ một hệ thống MySQL truyền thống sang Aurora MySQL thông qua DMS. Tuy nhiên, trong thực tế vận hành tại các doanh nghiệp lớn, bài toán migration không chỉ dừng lại ở việc chuyển dữ liệu (Data Migration), mà còn phức tạp hơn rất nhiều khi bạn phải chuyển đổi cấu trúc cơ sở dữ liệu và mã nguồn lập trình bên trong (Schema & Code Conversion) –... Chi tiết
Khi công ty quyết định nâng cấp hệ thống từ cơ sở dữ liệu MySQL truyền thống (chạy trên EC2, RDS MySQL tiêu chuẩn, hoặc On-Premise) lên Amazon Aurora MySQL để tận dụng hiệu năng vượt trội và kiến trúc phân tán, bài toán lớn nhất đặt ra cho đội ngũ kỹ thuật là: Làm sao để di chuyển hàng trăm GB dữ liệu mà hệ thống backend KHÔNG PHẢI DOWNTIME (hoặc downtime dưới vài giây)? Bài viết này sẽ mổ xẻ ... Chi tiết
Trong vận hành hệ thống production, việc thực hiện sao lưu dữ liệu (Backup) và khả năng khôi phục hệ thống về một thời điểm trong quá khứ (Point-in-Time Recovery) là chiếc phao cứu sinh cuối cùng khi xảy ra các sự cố thảm họa như lệnh DELETE nhầm không có WHERE, lỗi code deploy làm hỏng dữ liệu, hoặc tấn công mã hóa tống tiền. Bài viết này sẽ mổ xẻ cơ chế chụp ảnh tự động và phục hồi siêu tốc ... Chi tiết
Sau 10 bài học liên tục mổ xẻ từ tầng phần cứng (Buffer Pool, Cơ chế Storage Quorum) đến tầng phần mềm và ứng dụng (Advanced Query Optimization, Performance Insights, CloudWatch Monitoring, RDS Proxy, Indexing Strategies, và Bulk Write Optimization), chúng ta đã có một bức tranh toàn diện về cách vận hành, tinh chỉnh và khai thác tối đa sức mạnh của Aurora MySQL ở cấp độ Senior/Backend Engineer... Chi tiết
Trong khi các bài trước tập trung chủ yếu vào việc tối ưu hóa tốc độ đọc (SELECT), thực tế vận hành tại các hệ thống thương mại điện tử lớn (như quản lý hàng tồn kho, ghi nhận log sự kiện, hoặc lưu lịch sử giao dịch) thường xuyên phải đối mặt với các đợt ghi dữ liệu cường độ cao (Write-heavy workloads). Nếu viết code xử lý ghi không khéo, bạn sẽ nhanh chóng làm nghẽn băng thông mạng, tràn hàng ... Chi tiết
Bước sang Chương 12 với các cấu trúc dữ liệu nâng cao, chúng ta đối mặt với một bài toán kinh điển trong các hệ thống phân tích dữ liệu thời gian thực (Real-time Analytics) và giám sát hạ tầng: Range Query (Truy vấn khoảng dữ liệu). Giả sử bạn đang quản lý hàng triệu bản ghi doanh số theo thời gian thực tại Hasaki. Hệ thống cần liên tục thực hiện 2 thao tác với tần suất cực cao: 1. Update (C... Chi tiết
Trong các bài học trước, Bảng băm (Hash Table) và hàm băm truyền thống đóng vai trò định vị dữ liệu dựa trên công thức: Index = Hash(Key) % N (với là số lượng server hoặc số bucket). Công thức này hoạt động hoàn hảo trong môi trường đơn máy (Single-node). Tuy nhiên, khi hệ thống backend phát triển thành một cụm Hệ thống phân tán (Distributed System) gồm nhiều cụm Redis, nhiều Shard Database,... Chi tiết
Trong suốt Chương 8, chúng ta đã xem Bảng băm (Hash Table) là tiêu chuẩn vàng để kiểm tra sự tồn tại của dữ liệu với tốc độ . Tuy nhiên, khi quy mô hệ thống chạm ngưỡng hàng chục hoặc hàng trăm triệu bản ghi (ví dụ: danh sách hàng trăm triệu tài khoản user đã đăng ký trên hệ thống của Hasaki, hay danh sách đen các URL độc hại trên Internet), việc lưu trữ toàn bộ chuỗi Key vào RAM để tra cứu bằn... Chi tiết
Ở Bài 54, chúng ta đã làm quen với Lập trình động theo trường phái Top-Down (Memoization): Bắt đầu từ bài toán lớn, dùng đệ quy bẻ nhỏ nó ra và lưu kết quả vào một bảng đệm (Map) để tránh tính toán trùng lặp. Tuy nhiên, Top-Down vẫn mang trong mình một điểm yếu mang tính cấu trúc: Nó phụ thuộc vào Call Stack của hệ điều hành. Nếu bài toán yêu cầu độ sâu đệ quy quá lớn (ví dụ ), hệ thống sẽ lập... Chi tiết
Nếu bạn muốn được huấn luyện/Mentor/Coaching hoặc hợp tác với chuyên gia hàng đầu về lập trình ==>Hãy đăng ký bên dưới nhé!