Khi hệ thống phát triển theo kiến trúc microservices, việc lựa chọn cơ sở dữ liệu không còn là câu chuyện của một sản phẩm duy nhất. Dữ liệu cần được chia nhỏ theo từng miền nghiệp vụ, mỗi dịch vụ được quyền sử dụng công nghệ lưu trữ phù hợp nhất và toàn bộ hạ tầng quản trị cần được tự động hóa.
Bài viết này sẽ giới thiệu ba khái niệm quan trọng giúp hiện thực hóa mục tiêu đó: Data Module, Polyglot Persistence và Database-as-a-Service (DBaaS). Đây là những nền tảng giúp các hệ thống cloud-native vừa linh hoạt, vừa dễ mở rộng và vận hành hiệu quả.4. Data Module (Mô-đun dữ liệu)
Data Module
được ví như là "phiên bản dữ liệu" của các kiến trúc phần mềm hiện đại
như Modular Monolith hay Distributed Architecture. Để ứng dụng có thể tiến
hóa nhanh, dữ liệu của nó cũng phải được chia nhỏ và tổ chức một cách độc lập.
Trong các doanh nghiệp
truyền thống, mọi ứng dụng thường đổ chung dữ liệu vào một Cơ sở dữ liệu khổng
lồ (Database of Record - DoR).
- Hệ quả:
Khi mọi thứ dính chặt vào nhau, việc thay đổi cấu trúc dữ liệu cho một
tính năng nhỏ cũng có thể làm hỏng hàng chục ứng dụng khác đang dùng chung
bảng đó.
- Sự đình trệ:
Những tập dữ liệu lớn và kết nối chằng chịt khiến hệ thống trở nên cực kỳ
khó bảo trì và chậm chạp trong việc cải tiến.
Giải pháp: Data Module
Thay vì một khối duy nhất,
chúng ta chia toàn bộ dữ liệu của ứng dụng thành các Data Module — tức
là các tập hợp dữ liệu nhỏ hơn, có tính đóng gói và rất ít phụ thuộc vào nhau.
- Quy tắc vàng:
Dữ liệu bên trong một mô-đun thì liên kết chặt chẽ, nhưng dữ liệu giữa các
mô-đun khác nhau thì liên kết lỏng lẻo.
- Cách lưu trữ:
Mỗi Data Module nên được lưu trong một cơ sở dữ liệu (database) hoặc
lược đồ (schema) riêng biệt.
Căn chỉnh giữa mã nguồn và dữ liệu
Hình trên minh họa cách tổ
chức dữ liệu thực tế cho kiến trúc vi dịch vụ (microservices). Đây là hình ảnh
cụ thể hóa triết lý: "Để ứng dụng linh hoạt, dữ liệu cũng phải được chia để
trị.
Nếu bạn chia ứng dụng
thành các vi dịch vụ độc lập (Microservice A, B, C), thì dữ liệu của chúng cũng
phải được chia thành các ngăn riêng (Schema A, B, C)
Trong sơ đồ, các đường đứt
đoạn thẳng đứng bao quanh từng cặp Microservice và Schema tạo thành một "Ranh
giới khái niệm" (Conceptual boundary). Điều này có nghĩa là:
- Microservice A
là thực thể duy nhất có quyền đọc/ghi vào Schema A.
- Các dịch vụ khác không được phép "truy cập trộm" vào dữ liệu của nhau. Nếu B muốn dữ liệu của A, nó phải hỏi qua API của A chứ không được kết nối trực tiếp vào Schema A.
"Hạ tầng cơ sở dữ liệu
dùng chung" (Shared infrastructure)
Bạn sẽ thấy một hình chữ
nhật nằm ngang lớn bao lấy cả ba hình trụ Schema A, B, và C. Đây chính là điểm
"thực dụng":
- Về mặt logic:
Mỗi dịch vụ có một cơ sở dữ liệu riêng biệt để đảm bảo tính độc lập, giúp
các nhóm có thể thay đổi cấu trúc dữ liệu của mình mà không làm hỏng dịch
vụ của nhóm khác.
- Về mặt vật lý:
Chúng ta không nhất thiết phải mua 3 máy chủ khác nhau. Cả ba "ngăn dữ
liệu" này có thể chạy chung trên một máy chủ vật lý hoặc một cụm hạ
tầng duy nhất.
Lợi ích của việc này là:
Giúp tổ chức tiết kiệm chi phí phần cứng, phí bản quyền phần mềm và giảm bớt
công sức quản trị vận hành (như sao lưu, bảo trì).
Tóm lại: Đây
là một mô hình "Độc lập về logic nhưng tập trung về hạ tầng".
Nó cho phép các vi dịch vụ có toàn quyền kiểm soát "linh hồn" (dữ liệu)
của mình trong khi vẫn tận dụng được hiệu quả kinh tế của việc dùng chung máy
chủ.
Lợi ích của việc chia nhỏ
- Dễ thay đổi:
Bạn có thể cập nhật cấu trúc dữ liệu của mô-đun "Khách hàng" mà
không cần lo lắng về mô-đun "Sản phẩm".
- Ngăn chặn sự ràng buộc (Decoupling):
Nó ép buộc các lập trình viên không được tạo ra những kết nối dữ liệu chằng
chịt, từ đó giữ cho hệ thống luôn sạch sẽ và dễ bảo trì.
- Polyglot Persistence (Lưu trữ đa ngôn
ngữ): Vì các mô-đun là tách biệt, bạn có quyền chọn loại
cơ sở dữ liệu tốt nhất cho từng loại dữ liệu (ví dụ: dùng SQL cho đơn hàng
nhưng dùng NoSQL cho danh mục sản phẩm).
- Tối ưu hạ tầng:
Nhiều Data Module vẫn có thể chạy chung trên một máy chủ cơ sở dữ liệu để
tiết kiệm chi phí, nhưng về mặt logic, chúng vẫn là các thực thể độc lập.
Mỗi loại cơ sở dữ liệu gọi "Data Module" bằng một cái tên khác nhau
Khi bạn bắt tay vào sử dụng
các phần mềm cụ thể, bạn sẽ thấy chúng có những tên gọi riêng cho khái niệm
"ngăn chứa dữ liệu độc lập" này:
- PostgreSQL:
Gọi là Schema. Đây là một tập hợp các bảng đại diện cho một cơ sở dữ
liệu logic.
- MongoDB:
Gọi là Collection. Dù MongoDB cho phép dữ liệu bên trong linh hoạt,
nhưng mỗi mô-đun dữ liệu nên được đặt trong một collection riêng để dễ quản
lý và tìm kiếm.
- Apache Cassandra:
Gọi là Keyspace. Đây là nơi chứa các bảng và kiểu dữ liệu đi kèm với
một chiến lược sao lưu cụ thể.
- Neo4j (Đồ thị):
Gọi trực tiếp là Database. Mỗi đồ thị kết nối các nút và quan hệ sẽ
là một mô-đun.
Ví dụ về Ứng dụng Thương mại điện tử (Ecommerce)
Lấy một ví dụ về việc
chia nhỏ dữ liệu của một trang web bán hàng dựa trên cách dữ liệu vận hành và
thay đổi:
- Mô-đun Khách hàng (Customer Data):
Không chỉ có thông tin tên tuổi mà còn gồm cả địa chỉ và sở thích. Chúng
đi cùng nhau vì có cùng vòng đời.
- Mô-đun Sản phẩm (Product Data):
Gồm mô tả sản phẩm, giá cả (thay đổi độc lập) và các đánh giá từ khách
hàng.
- Mô-đun Đơn hàng (Order Data):
Đóng vai trò kết nối khách hàng với sản phẩm. Nó theo dõi trạng thái đơn
hàng (đang xử lý, đã giao) và chi tiết vận chuyển.
- Triết lý:
Dữ liệu nào thường được cập nhật cùng nhau trong một giao dịch thì nên nằm
chung một mô-đun.
Lưu ý rằng việc chia nhỏ
dữ liệu có thể làm mất đi khả năng thực hiện các giao dịch (transaction)
tức thời trên nhiều mô-đun cùng lúc. Trong trường hợp này, bạn cần sử dụng các
kỹ thuật như Điều phối dịch vụ (Service Orchestrator) hoặc Kiến trúc
hướng sự kiện (Event-Driven) để đảm bảo dữ liệu giữa các mô-đun cuối cùng sẽ
đồng nhất với nhau.
Tóm lại,
Data Module là chiến lược "chia để trị" dành cho dữ liệu. Nó
biến kho dữ liệu cồng kềnh thành các khối lego linh hoạt, giúp ứng dụng đám mây
của bạn thực sự tự do và mạnh mẽ.
5. Polyglot Persistence (Lưu trữ đa ngôn ngữ)
Polyglot Persistence
(Lưu trữ đa ngôn ngữ) là một cuộc cách mạng
trong cách chúng ta nhìn nhận về lưu trữ dữ liệu. Thay vì ép buộc mọi loại dữ
liệu phải "nhồi nhét" vào một hệ quản trị cơ sở dữ liệu (CSDL) duy nhất,
mẫu thiết kế này khuyến khích việc lựa chọn công cụ phù hợp nhất cho từng
bài toán cụ thể.
Nếu trong kiến trúc vi dịch
vụ (microservices), mỗi nhóm có thể chọn một ngôn ngữ lập trình khác nhau
(Java, Go, Python) để giải quyết vấn đề tốt nhất (Polyglot Development),
thì dữ liệu cũng nên được đối xử tương tự.
Polyglot Persistence
cho phép ứng dụng lưu trữ từng phần dữ liệu khác nhau vào các loại CSDL khác
nhau — nơi mà cấu trúc dữ liệu và cách thức truy cập của chúng được tối ưu hóa
tốt nhất.
Trong IT truyền thống,
các doanh nghiệp thường tiêu chuẩn hóa mọi thứ trên một hệ CSDL quan hệ duy nhất
(như Oracle hay SQL Server) cho toàn bộ ứng dụng.
- Vấn đề:
Không có một CSDL nào có thể làm tốt tất cả mọi việc.
- Hệ quả:
Khi ép dữ liệu bán cấu trúc (như JSON) hoặc dữ liệu đồ thị phức tạp vào
các bảng SQL cứng nhắc, hiệu suất sẽ giảm sút và mã nguồn ứng dụng trở nên
rắc rối hơn vì phải thực hiện các bước chuyển đổi dữ liệu phức tạp.
Hình trên minh họa trực
quan triết lý Polyglot Persistence bằng cách chia ứng dụng thành các
mô-đun và gán cho mỗi mô-đun một "ngôi nhà" phù hợp:
- Mô-đun dữ liệu có cấu trúc
(Well-structured data): Được lưu trong Relational
Database (CSDL Quan hệ/Dạng bảng) để tận dụng khả năng truy vấn mạnh mẽ.
- Mô-đun dữ liệu bán cấu trúc
(Semi-structured data): Được lưu trong Document
Database (CSDL Tài liệu) giúp dữ liệu linh hoạt và dễ tiến hóa.
- Mô-đun dữ liệu phi cấu trúc
(Unstructured data): Được lưu trong Key-Value
Database (CSDL Khóa-Giá trị) để đạt tốc độ truy xuất tối đa.
Điểm mấu chốt:
Bạn có thể chạy nhiều loại CSDL này cùng lúc cho một ứng dụng tổng thể để mỗi
phần đều đạt hiệu suất cao nhất.
Ví dụ thực tế: Hệ thống Thương mại điện tử
Đây là một ví dụ rất thuyết
phục về cách áp dụng Polyglot Persistence trong một trang web bán hàng:
- Catalog (Danh mục sản phẩm):
Dùng Document Database để lưu mô tả, hình ảnh vì mỗi loại sản phẩm
có thuộc tính khác nhau.
- Shopping Cart (Giỏ hàng):
Dùng Key-Value Database để lưu dữ liệu tạm thời của người dùng với
tốc độ cực nhanh.
- Order (Đơn hàng):
Dùng Relational Database vì đây là dữ liệu cần sự chính xác tuyệt đối
(ACID) và các truy vấn báo cáo phức tạp.
Sự đánh đổi: "Sức mạnh đi kèm với trách nhiệm"
Sự linh hoạt này không phải
là miễn phí:
- Độ phức tạp tăng lên:
Việc vận hành nhiều loại CSDL khác nhau đòi hỏi đội ngũ kỹ thuật phải có
nhiều kỹ năng hơn.
- Quản trị khó khăn:
Mỗi loại CSDL có cách sao lưu, bảo mật và bảo trì khác nhau, làm tăng chi
phí quản trị.
- Giải pháp:
Nên sử dụng các dịch vụ Database-as-a-Service (DBaaS) trên đám mây
để giảm bớt gánh nặng quản lý hạ tầng.
Tóm lại, Polyglot Persistence là công cụ cần thiết để tối ưu hóa từng vi dịch vụ nhằm giải quyết các vấn đề nghiệp vụ duy nhất của nó. Nó biến CSDL từ một rào cản trở thành một "trợ thủ" đắc lực cho ứng dụng đám mây.
6. Database-as-a-Service" (Cơ sở dữ liệu dưới dạng dịch vụ)
Database-as-a-Service là
một giải pháp giải phóng các lập trình viên khỏi những rào cản hành chính
và kỹ thuật của hệ thống quản trị dữ liệu truyền thống, giúp họ tập trung hoàn
toàn vào việc xây dựng tính năng cho ứng dụng.
Bản chất của DBaaS: "Phó thác việc khó cho đám mây"
Thay vì tự cài đặt, Database-as-a-Service
(DBaaS) là một dịch vụ phần mềm (SaaS) trên đám mây giúp bạn đảm nhận hầu hết
các công việc "nặng nhọc".
- Cài đặt tự động:
Dịch vụ này đã cài đặt sẵn các máy chủ cơ sở dữ liệu. Bạn chỉ cần vài cú
nhấp chuột để tạo ra một thể hiện CSDL mới.
- Quản lý tự động:
Những việc như sao lưu dữ liệu (backup), quản lý giấy phép phần mềm
(licensing), và cập nhật bản vá đều do nhà cung cấp đám mây lo liệu.
- Dịch vụ hậu cần (Backend Service):
Ứng dụng của bạn kết nối với DBaaS như một dịch vụ hỗ trợ từ bên ngoài,
giúp ứng dụng nhẹ nhàng và linh hoạt hơn.
Sức mạnh đối với ứng dụng co giãn
Vì ứng dụng đám mây thường
là Replicable Application (ứng dụng có thể nhân bản để gánh tải), nên cơ
sở dữ liệu cũng phải là Replicated Database (cơ sở dữ liệu sao chép) để
tương xứng.
- Việc tự tay cài đặt một cụm cơ sở dữ liệu sao chép chạy trên nhiều máy chủ là cực kỳ khó và đòi hỏi kỹ năng chuyên sâu.
- DBaaS
biến công việc phức tạp này thành một tùy chọn có sẵn, giúp hệ thống của bạn
luôn sẵn sàng và có thể mở rộng quy mô một cách dễ dàng.
Thay đổi vai trò của con người: "Từ thợ cài đặt thành chuyên gia tối ưu"
DBaaS không có nghĩa là
loại bỏ các chuyên gia quản trị (DBA).
- Ngược lại, nó giúp họ thoát khỏi những việc lặp đi lặp lại như cài đặt máy chủ hay cấu hình lưu trữ.
- Các chuyên gia hiện nay có thể tập trung vào những việc có giá trị cao hơn như: tối ưu hóa thiết kế bảng, tinh chỉnh hiệu suất truy vấn, và tư vấn cấu trúc dữ liệu cho các đội phát triển.
Sự đánh đổi và lựa chọn
Dù tiện lợi, nhưng cũng cần
lưu ý một số điểm cần cân nhắc:
- Vendor Lock-in:
Bạn có thể bị phụ thuộc vào nhà cung cấp đám mây đó và không có quyền kiểm
soát trực tiếp vào máy chủ vật lý bên dưới.
- An ninh:
Một số dữ liệu nhạy cảm hoặc mang tính độc quyền quá cao có thể khiến tổ
chức e ngại khi đưa lên DBaaS.
- Các ví dụ tiêu biểu:
Các dịch vụ phổ biến hiện nay bao gồm Amazon Relational Database
Service (RDS) (cho SQL), Amazon DynamoDB (cho NoSQL), Azure
Cosmos DB (đa mô hình), hay IBM Cloudant.



Comments
Post a Comment