Xây dựng 'seam' ngay từ ngày đầu tiên

Xây dựng một nền tảng cho dữ liệu khối lượng lớn buộc bạn phải đưa ra lựa chọn.

Bạn cần một cơ sở dữ liệu nhanh để lưu trữ dài hạn. Nhưng việc thiết lập một hệ thống phức tạp ngay từ ngày đầu tiên là rất khó. Thậm chí bạn có thể còn chưa biết các mô hình dữ liệu của mình. Lựa chọn an toàn là một cơ sở dữ liệu quan hệ tiêu chuẩn mà bạn đã quen dùng.

Sai lầm nằm ở việc gắn chặt mã nguồn của bạn trực tiếp với cơ sở dữ liệu đầu tiên đó. Nếu mọi phần của ứng dụng đều gọi trực tiếp đến cơ sở dữ liệu, bạn đang tự tạo ra một cái bẫy. Việc chuyển sang một cơ sở dữ liệu tốt hơn sau này sẽ đòi hỏi một đợt tái cấu trúc (refactor) khổng lồ.

Bước đi đúng đắn là xây dựng một 'seam'.

Một 'seam' chính là một bản hợp đồng. Nó định nghĩa hệ thống làm gì mà không nói rõ nó làm việc đó như thế nào.

  • Tạo một interface cho tác vụ đó.
  • Viết một driver cơ bản sử dụng cơ sở dữ liệu hiện tại của bạn.
  • Liên kết driver đó với interface.

Mọi phần khác của ứng dụng chỉ giao tiếp với interface. Không ai biết cơ sở dữ liệu nào đang chạy ngầm bên dưới.

Khi dữ liệu của bạn tăng lên và bạn cần một hệ thống nhanh hơn, công việc sẽ rất đơn giản. Bạn chỉ cần viết một driver mới, thay đổi một dòng mã và triển khai nó. Không có dashboard nào bị hỏng. Không có pipeline nào bị dừng lại.

Một số người gọi đây là sự trừu tượng hóa sớm (premature abstraction). Họ nói rằng bạn chưa cần đến nó.

Tôi không đồng ý. Một interface chỉ tốn thêm của bạn một file. Bỏ qua nó chỉ là đẩy chi phí sang một thời điểm muộn hơn. Khi bạn thực sự cần thay đổi, bạn sẽ phải sửa hàng trăm file dưới áp lực lớn. Một interface là một khoản bảo hiểm rẻ tiền.

Hãy sử dụng ba thói quen sau để làm cho các 'seam' của bạn vững chắc hơn:

  • Sử dụng định danh kép. Sử dụng số nguyên (integers) nhanh cho các phép join cơ sở dữ liệu nội bộ. Sử dụng UUID cho bất cứ thứ gì đi ra khỏi hệ thống của bạn. Điều này giúp dữ liệu của bạn an toàn và các phép join diễn ra nhanh chóng.

  • Sử dụng Enum cho từ vựng dùng chung. Đừng sử dụng các chuỗi (strings) ngẫu nhiên cho trạng thái (status) hoặc mức độ nghiêm trọng (severity). Hãy sử dụng một Enum duy nhất để mọi phần của ứng dụng đều nói cùng một ngôn ngữ.

  • Sử dụng các 'envelope' có phiên bản cho dữ liệu. Nếu hệ thống của bạn nhận dữ liệu từ nhiều nguồn, hãy sử dụng một schema nghiêm ngặt. Chỉ thêm các trường (fields) mới. Đừng bao giờ xóa hoặc đổi tên chúng mà không có phiên bản mới. Điều này giúp các client cũ vẫn hoạt động bình thường trong khi bạn cải tiến hệ thống.

Hãy tìm ra ranh giới. Đặt tên cho nó bằng một bản hợp đồng. Lấp đầy nó bằng một triển khai (implementation) đơn giản.

Bản hợp đồng là lời hứa của bạn. Driver chỉ là cách bạn thực hiện lời hứa đó vào ngày hôm nay.

Nguồn: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b