🚀 Ngày 8: Hành trình Thiết kế Hệ thống + DSA
Chào các bạn! Tôi tiếp tục hành trình học tập hàng ngày, tập trung vào các khái niệm Thiết kế Hệ thống (theo lộ trình từ roadmap.sh) và sau đó giải quyết các thử thách DSA trên LeetCode. Đây là NGÀY 8 — khởi động một tuần mới! 💡
🏗 Thiết kế Hệ thống: Nhân bản dữ liệu
Khái niệm hôm nay là Nhân bản dữ liệu — một mô hình khả dụng nơi nhiều bản sao của dữ liệu được lưu trữ tại nhiều vị trí để cải thiện khả năng phục hồi và khả năng mở rộng.
Có hai loại chính:
🧭 Nhân bản Master-Slave
- Master xử lý tất cả ghi (và đôi khi là đọc).
- Slaves chỉ xử lý đọc, giảm tải cho master.
- Nếu master gặp sự cố, một slave có thể được nâng cấp.
- Thường được sử dụng để mở rộng khối lượng đọc nặng.
⚠️ Nhược điểm:
- Việc nâng cấp slave làm tăng độ phức tạp.
- Độ trễ nhân bản có thể gây ra đọc lỗi thời.
- Khối lượng ghi nặng có thể làm quá tải các replica.
🔁 Nhân bản Master-Master
- Nhiều master xử lý cả đọc và ghi.
- Khả năng sẵn có cao hơn vì bất kỳ nút nào cũng có thể phục vụ như một bản sao dự phòng.
- Hữu ích khi cần ghi đa vùng.
⚠️ Nhược điểm:
- Cần giải quyết xung đột (ví dụ, hai ghi cùng lúc).
- Có thể ảnh hưởng đến hiệu suất do chi phí đồng bộ hóa.
- Thường đánh đổi tính nhất quán để lấy khả dụng.
💭 Suy nghĩ của tôi: Nhân bản là một trong những khái niệm có vẻ đơn giản (“chỉ cần sao chép dữ liệu”), nhưng những trường hợp biên và đánh đổi—độ trễ, xung đột và độ phức tạp—làm cho nó trở thành một thách thức thực sự trong kỹ thuật.
💻 Thử thách DSA: 3Sum
Thử thách LeetCode hôm nay là 15. 3Sum.
⏳ Thời gian tiêu tốn: ~1+ giờ (với sự trợ giúp của video hướng dẫn trên YouTube).
👨💻 Đoạn mã mẫu
python
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort()
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i-1]:
continue
j, k = i + 1, len(nums) - 1
while j < k:
total = nums[i] + nums[j] + nums[k]
if total > 0:
k -= 1
elif total < 0:
j += 1
else:
res.append([nums[i], nums[j], nums[k]])
j += 1
while j < k and nums[j] == nums[j-1]:
j += 1
return res
✨ Những điều rút ra chính
- Sử dụng kỹ thuật sắp xếp + hai con trỏ = rất hiệu quả trong trường hợp này.
- Tránh được độ phức tạp O(n³) bằng cách giảm xuống O(n²).
- Học cách bỏ qua các phần tử trùng lặp để giữ kết quả sạch sẽ.
🙌 Suy nghĩ cuối cùng
Ngày 8 đã cho tôi một bài học quý giá:
- Về mặt Thiết kế Hệ thống, nhân bản dữ liệu là về việc cân bằng giữa khả năng sẵn có và độ phức tạp.
- Về mặt DSA, các chiến lược thông minh như sắp xếp + hai con trỏ có thể hoàn toàn thay đổi hiệu suất.
Tôi rất hào hứng để tiếp tục duy trì động lực này vào tuần mới 🚀.
🤝 Kết nối nào!
💡 Đây là Ngày 8 — khởi đầu của Tuần thứ 2!
Tôi rất muốn nghe ý kiến từ bạn:
- Bạn đã làm việc với các cấu hình nhân bản (master-slave hoặc master-master) chưa? Những thách thức nào nổi bật?
- Có các phương pháp thay thế nào bạn đã sử dụng cho bài toán 3Sum không?
- Hoặc chỉ cần để lại một dấu 🔁 trong phần bình luận nếu bạn đã từng phải nhân bản hệ thống (hoặc giải quyết 3Sum 😉).
Phản hồi, kinh nghiệm và sự khích lệ của bạn sẽ thúc đẩy tôi tiếp tục xuất hiện hàng ngày — hãy cùng nhau làm cho hành trình này trở nên tương tác hơn 🙏.