Khi bắt đầu phát triển một hệ thống phần mềm, hầu hết các team đều hướng đến những kiến trúc đơn giản nhất có thể. Điều này hoàn toàn dễ hiểu, bởi sự đơn giản giúp quá trình phát triển nhanh hơn, tiết kiệm nguồn lực và đưa sản phẩm ra thị trường sớm. Ví dụ điển hình là lựa chọn kiến trúc Monolithic thay vì Microservices, hoặc chỉ sử dụng một cơ sở dữ liệu duy nhất. Những lựa chọn này giúp việc phát triển, bảo trì dễ dàng và tiết kiệm nhân lực.
Tuy nhiên, khi hệ thống ngày càng mở rộng và phức tạp hơn, các kiến trúc đơn giản sẽ dần bộc lộ nhiều hạn chế. Lúc này, việc tìm kiếm những giải pháp hiệu quả hơn trở nên cần thiết. Một trong những giải pháp đó chính là mô hình Polyglot Persistence – cách tiếp cận đa cơ sở dữ liệu giúp tối ưu hóa hiệu năng và khả năng mở rộng cho hệ thống.
Nếu bạn thắc mắc tại sao cần sử dụng nhiều loại cơ sở dữ liệu khác nhau, hãy tham khảo bài viết trước để có cái nhìn rõ hơn. Giờ thì cùng khám phá sâu hơn về mô hình Polyglot Persistence nhé!
“Polyglot”?
Khi nói đến “Polyglot”, hãy lấy ví dụ thực tế là bản đồ, mỗi nhu cầu sử dụng bản đồ sẽ có một loại bản đồ khác nhau. Khi nào bản tin thời tiết, bạn sẽ cần một loại bản đồ về nhiệt độ, lượng mưa, nhưng khi cần tìm đường đi, bạn sẽ cần một loại bản đồ về giao thông chẳng hạn, v.v. Do đó từ “Polyglot” có nghĩa là “nhiều ngôn ngữ”, “nhiều loại” khác nhau, mà trong ngữ cảnh bài viết này là “nhiều loại cơ sở dữ liệu”.
Polyglot Persistence là gì?
Trong thế giới công nghệ phát triển nhanh chóng, khái niệm Polyglot Persistence ngày càng trở nên quan trọng. Điều này có nghĩa là mỗi loại cơ sở dữ liệu (CSDL) sẽ phù hợp với một nhu cầu cụ thể trong hệ thống. Cũng giống như việc chọn bản đồ phù hợp cho từng nhu cầu di chuyển, khi xây dựng hệ thống, bạn sẽ cần chọn đúng loại CSDL cho từng mục tiêu khác nhau.
Ví dụ, nếu bạn cần đảm bảo tính toàn vẹn của dữ liệu, CSDL OLTP như MySQL, PostgreSQL là lựa chọn phù hợp. Nhưng khi cần phân tích dữ liệu lớn, bạn sẽ nghĩ đến CSDL OLAP như BigQuery, Redshift. Còn với các hệ thống có lượng truy cập khổng lồ, NoSQL như Cassandra, Redis sẽ là giải pháp tối ưu. Để tìm kiếm dữ liệu nhanh chóng, các công cụ tìm kiếm như Elasticsearch hay Solr sẽ phát huy tác dụng.
Điều quan trọng nhất là bạn cần hiểu rõ nhu cầu và tính chất của hệ thống để lựa chọn CSDL phù hợp.
Ví dụ thực tế
Xây dựng một mạng xã hội từ những bước đầu tiên
Hãy tưởng tượng chúng ta đang phát triển một mạng xã hội. Người dùng có thể tạo bài viết, bình luận và tìm kiếm nội dung. Để phục vụ những nhu cầu này, chúng ta cần xây dựng hệ thống với 3 services chính:
- User service: Dịch vụ này sẽ đảm nhiệm việc tạo mới, cập nhật và xóa thông tin người dùng. Để đảm bảo tính toàn vẹn của dữ liệu, tôi sẽ sử dụng PostgreSQL - một CSDL OLTP mạnh mẽ.
- Post service: Với lượng truy cập lớn từ người dùng vào các bài viết, chúng ta cần một CSDL có khả năng xử lý nhanh chóng. Cassandra - một NoSQL database - sẽ là lựa chọn lý tưởng để đáp ứng nhu cầu này.
- Search service: Để hỗ trợ người dùng tìm kiếm nhanh chóng, Elasticsearch - một công cụ tìm kiếm mạnh mẽ - sẽ được sử dụng.
Bổ sung tính năng mới: Thêm tương tác bài viết
Nhưng sau một thời gian phát triển, mạng xã hội của chúng ta cần những tính năng thú vị hơn, chẳng hạn như cho phép người dùng tương tác với bài viết, thích, lưu, v.v. Để phục vụ nhu cầu này, tôi sẽ phải thiết kế lại Post service của mình, sử dụng Redis để phục vụ nhu cầu lưu trữ lượt tương tác của người dùng với bài viết với tốc độ cao một cách hiệu quả.
Các vấn đề phát sinh
Trong quá trình theo dõi hoạt động của Post Service, chúng ta nhận ra việc đọc và ghi dữ liệu cùng lúc vào Cassandra chưa tối ưu. Dù Cassandra mạnh mẽ trong việc xử lý truy vấn nhanh, nhưng nó không đảm bảo tính toàn vẹn dữ liệu khi ghi. Vì vậy, tôi quyết định tách việc ghi và đọc ra hai CSDL riêng biệt: khác nhau: PostgreSQL cho dữ liệu ghi, và Cassandra cho dữ liệu để đọc.
Tuy nhiên, nếu tách riêng dữ liệu đọc và dữ liệu ghi, chúng ta sẽ phải đối mặt với vấn đề Data Synchronization giữa 2 cơ sở dữ liệu, khi này sẽ phải áp dụng một kiến trúc khác, chẳng hạn như CQRS để giải quyết vấn đề này. Chủ đề này tương đối rộng, tôi sẽ dành riêng một bài viết khác để giải thích chi tiết về kiến trúc CQRS và các kiến trúc khác liên quan.
Vậy là chúng ta đã thấy một ví dụ cụ thể về việc sử dụng mô hình Polyglot Persistence trong hệ thống phần mềm. Trong ví dụ trên, tôi chỉ dừng lại ở mức cơ bản nhất, trong thực tế, việc thiết kế một hệ thống phức tạp hơn nhiều, và việc chọn lựa cơ sở dữ liệu phù hợp với nhu cầu sử dụng dữ liệu của hệ thống là một quá trình phức tạp và đòi hỏi sự hiểu biết sâu rộng về cả kiến thức về cơ sở dữ liệu lẫn về hệ thống phần mềm.
Kết luận
Polyglot Persistence là một mô hình quan trọng trong việc thiết kế hệ thống phức tạp, giúp chúng ta chọn đúng loại cơ sở dữ liệu phù hợp với nhu cầu sử dụng dữ liệu của hệ thống. Tuy nhiên, việc sử dụng nhiều cơ sở dữ liệu cũng đồng nghĩa với việc chúng ta phải đối mặt với những vấn đề phức tạp hơn, chẳng hạn như Data Synchronization giữa các cơ sở dữ liệu, và việc này đòi hỏi sự hiểu biết sâu rộng về cả kiến thức về cơ sở dữ liệu lẫn về hệ thống phần mềm.
Hy vọng rằng bài viết này đã giúp các bạn hiểu hơn về mô hình Polyglot Persistence, và cách áp dụng nó vào thiết kế hệ thống phần mềm của mình. Nếu có bất kỳ ý kiến, thắc mắc nào, hãy để lại comment bên dưới, tôi sẽ trả lời sớm nhất có thể. Cảm ơn các bạn đã đọc bài viết!