Tất tần tật về dự án EDMA

EDMA cũng có thể coi là một cột mốc nho nhỏ khi đây cũng là lần đầu tiên mình có một dự án được star bởi 120 Github users (cho đến thời điểm của bài blog này). Vì vậy, mình cũng muốn chia sẻ về niềm vui nho nhỏ này của mình với các bạn.

Tất tần tật về dự án EDMA
EDMA on Product Hunt

Cho các bạn chưa biết ngữ cảnh của bài viết này: Cách đây nửa năm, trước khi mình sang Mỹ du học, mình có dành ra 1 tháng ròng (cụ thể là tháng 12) để tập trung build một sản phẩm mã nguồn mở có tên là EDMA.

GitHub - nomadiz/edma: EDMA is an interactive terminal app for managing multiple embedded databases system at once with powerful byte deserializer support.
EDMA is an interactive terminal app for managing multiple embedded databases system at once with powerful byte deserializer support. - GitHub - nomadiz/edma: EDMA is an interactive terminal app for…
Github của dự án EDMA

Đây cũng là dự án đầu tiên mà mình thật sự hoàn thiện và đưa đến cộng đồng. Nhờ vậy mà đối với mình, EDMA cũng có thể coi là một cột mốc nho nhỏ khi đây cũng là lần đầu tiên mình có một dự án được star bởi 120 Github users (cho đến thời điểm của bài blog này). Vì vậy, mình cũng muốn chia sẻ về niềm vui nho nhỏ này của mình với các bạn.

E.D.M.A. là gì?

E.D.M.A (Embedded Database Management for All) là một sản phẩm mã nguồn mở được viết bằng ngôn ngữ lập trình Rust để quản lý các cơ sở dữ liệu nhúng trực ngay trên terminal. Đối với các cơ sở dữ liệu nhúng, các dữ liệu thường được lưu trữ trực tiếp dưới dạng là dữ liệu byte thập lục phân (hexadecimal yte data). Do đó, việc truy vấn và chỉnh sửa là cực kỳ khó khăn. Cứ tưởng tượng mọi thứ bạn nhận được khi truy vấn dữ liệu là một mớ các mã hex như bên dưới, làm sao bạn có thể hiểu được ý nghĩa đằng sau các mã này?

Ví dụ về các byte data thập lục phân (hexadecimal byte data)

Một số chức năng chính của EDMA

Demo dự án EDMA

Tích hợp nhiều cơ sở dữ liệu nhúng

EDMA tích hợp với nhiều cơ sở dữ liệu nhúng (hiện tại là 3) bao gồm RocksDB, ReDB và Sled. Cách cơ sở dữ liệu này là 3 trong số các cơ sở dữ liệu phổ biến nhất trong hệ sinh thái Rust.

Trước hết là RocksDB. Đối với các nhà phát triển hệ thống nhúng, RocksDB đã quá quen thuộc khi đây là một dự án mã nguồn mở được chính ông lớn Facebook phát triển. RocksDB được phát triển và liên tục năng cấp trong nhiều năm với nhiều tính năng hỗ trợ việc phát triển nhúng. Vì lựa chọn Rust là ngôn ngữ lập trình chính cho dự án, RocksDB là một lựa chọn đầu tiên nên được EDMA hỗ trợ vì cơ sở dữ liệu này được một lượng lớn nhà phát triển sử dụng.

Các cơ sở dữ liệu nhúng được EDMA hỗ trợ

Bên cạnh đó, mình cũng tích hợp thêm 2 cơ sở dữ liệu nhúng phổ biến trong cộng đồng Rust và chỉ được phát triển dành Rust là ReDB và Sled.

Template để hỗ trợ "deserialize" các dữ liệu byte

Hệ thống template để deserialize dữ liệu trong EDMA

Dữ liệu trong cơ sở dữ liệu nhúng khác với dữ liệu được trình bày trong cơ sở dữ liệu quan hệ. Trong khi cơ sở dữ liệu quan hệ gắn nhãn dữ liệu với các loại và thuộc tính cụ thể khi nó được tạo, cơ sở dữ liệu nhúng không thể làm được điều đó. Loại dữ liệu duy nhất mà cơ sở dữ liệu nhúng hiển thị là mảng byte. Ví dụ, [0 0 0 1 50 32 20]. Con người bình thường gần như khó mà có thể đọc được các dữ liệu như vậy.  Sử dụng EDMA, dữ liệu byte có thể được chuyển đổi thành dữ liệu đọc được bởi con người bằng cách sử dụng hệ thống byte template.

Ý tưởng này được mình tham khảo từ cách mà smart contract được thiết kế trong mạng blockchain Solana.

solana-course/deserialize-instruction-data.md at main · Unboxed-Software/solana-course
Contribute to Unboxed-Software/solana-course development by creating an account on GitHub.
Hướng dẫn deserialize data trong Solana

Mình phát triển EDMA để giải quyết vấn đề của chính mình

Thực tế thì vấn đề này là do mình trực tiếp trải qua trong quá trình xây dựng một sản phẩm khác có tên là SolomonDB. Đây là một side project được mình làm trong thời gian rãnh rỗi. SolomonDB một cơ sở dữ liệu đồ thị tương thích với ngôn ngữ truy vấn Gremlin

GitHub - nomadiz/solomon-db: An embedded Gremlin-compatible graph database written in Rust
An embedded Gremlin-compatible graph database written in Rust - GitHub - nomadiz/solomon-db: An embedded Gremlin-compatible graph database written in Rust
Github của dự án SolomonDB

Trong quá trình mình cố gắng thiết kế SolomonDB dựa trên kiến trúc của Neo4j nhằm lưu trữ các dữ liệu vào bộ nhớ và đĩa (mình sử dụng RocksDB là storage engine chính), vì RocksDB là một cơ sở dữ liệu nhúng, việc truy vấn và chỉnh sửa dữ liệu đều yêu cầu  sự chính xác từng li khi làm việc các byte ở dưới bộ nhớ. Tuy nhưng, các byte đều là các mã thập lục phân ở trên, đây là lúc mà vấn đề xảy ra.

Quá trình phát triển EDMA

Ngôn ngữ lập trình

Vì trong giai đoán đó, mình đang có hứng thú với các ngôn ngữ hệ thống như Rust hay C++. Cả SolomonDB và EDMA đều là dự án bên lề nhằm để mình luyện tập và trau dồi kiến thức về Rust. Do đó, EDMA hiển nhiên được viết bằng Rust. Tuy nhiên, vì là một công cụ quản lý cho các cơ sở dữ liệu nhúng, EDMA sẽ cần tích hợp với các cơ sở dữ liệu nhúng khác để làm đa dạng trình quản lý. Tuy nhưng, hầu hết các cơ sở dữ liệu nhúng lớn nhỏ đều được phát triển trên C++ hoặc Rust.

Vậy sao không phải là C++ mà là Rust? Thực tế thì mình không thấy quá khác biệt, được cái mình thích Rust hơn :D. Nhưng Rust cũng có FFI (Foreign Function Interface) để có thể giao tiếp với các thư viện bằng C++. Nên dù là ngôn ngữ nào đi nữa thì EDMA vẫn hỗ trợ được.

One design fits ALL

Đối với EDMA, việc thiết kế kiến trúc sao cho có thể tích hợp được nhiều cơ sở dữ liệu nhất có thể là mục tiêu tối thượng. Do đó, mình có tham khảo qua mã nguồn của một dự án cực kì nổi gần đây là SurrealDB.

surrealdb/lib/src/kvs at main · surrealdb/surrealdb
A scalable, distributed, collaborative, document-graph database, for the realtime web - surrealdb/lib/src/kvs at main · surrealdb/surrealdb
Cách SurrealDB tích hợp với nhiều cơ sở dữ liệu Key-Value

Vì bản thân SurrealDB cũng nhắm đến mục tiêu trở thành 1 database "all in one". Nên về phía kiến trúc của dự án này, các database được tích hợp sẽ theo đúng 1 cấu trúc của Transaction và hỗ trợ các API được khai báo của cấu trúc này (tham khảo hình dưới).

Cấu trúc Transaction và các database được tích hợp trong RocksDB

Tuy nhiên, vì muốn tích hợp và hỗ trợ luôn những tính năng cụ thể của các cơ sở dữ liệu khác nhau, ví dụ như đối với RocksDB, phân luồng bằng column family hoặc level compaction (chức năng của các LSM storage) là rất cần thiết. Mình sẽ phải cần thêm 1 cấu trúc đủ linh hoạt để đáp ứng được nhu cầu của dự án.

Vậy mình giải quyết vấn đề đó như thế nào?

Nếu các tập dữ liệu ở RocksDB được phân luồng bởi COLUMN FAMILY. Thì với ReDB, tập dữ liệu sẽ được phân luồng vào các TABLE. Do đó, khác nhau trong các cách thiết kế của cơ sở dữ liệu khiến cho mục tiệu hiện thực hoá "Management tool for ALL" của EDMA khó khăn hơn đôi chút.

Migrate to scalable tag bucket datastructure · nomadiz/edma@4f0e7f1
EDMA is an interactive terminal app for managing multiple embedded databases system at once with powerful byte deserializer support. - Migrate to scalable tag bucket datastructure · nomadiz/edma@4f0e7f1
Commit để add cấu trúc Tag Bucket

Mình tạo ra một cấu trúc dữ liệu gọi là Tag Bucket. Bạn cứ hiểu nôm na Tag Bucket không khác gì một JSON object được truyền giữa các component trong hệ thống để hỗ trợ từng trường hợp nhất định.

Ví dụ ứng dụng Tag Bucket vào Column Family của RocksDB

Vì vậy, bất cứ khi nào mình cần một param cụ thể nào, tag bucket sẽ chứa thêm một trường dự liệu dành cho param đó. Ví dụ như "column family" hay "table" tương ứng với COLUMN FAMILY và TABLE mà mình nói đến ở trên. Do đó, sẽ không gặp phải vấn đề xung đột giữa các API với nhau.

Từ 0 đến 100 ⭐️ đầu tiên trên Github

Để đưa EDMA từ con số 0 đến 100 sao, và hiện tại là 120 sao thực tế thì không quá khó. Có 2 kênh social chính mà mình nhắm đến

  • Reddit (Gần như hầu hết lượng sao là đến từ đây): Một số kênh trên Reddit rất active với các dự án Rust mới có thể kể đến như /opensource, /rust hay /software. Và đây cũng là các kênh mình đăng bài giới thiệu sản phẩm.
EDMA: A terminal app fo Embedded Database management written in Rust
by u/Beneficial_Ad1805 in rust
  • Rust language forum: Vì EDMA là một sản phẩm được viết cho hệ sinh thái Rust nên việc active trên forum của Rust là rất hữu ích. Đây cũng là nơi mình update các version mới và chức năng mới của sản phẩm thường xuyên.
Release: EDMA v0.1.0 - An embedded database management tool
EDMA v0.1.0 beta version has been released! What is EDMA? EDMA: Embedded Database Management for All is an open source project made to manage embedded key-value storages. EDMA is a TUI (Terminal User Interface) that is easy to install and configure. It allows engineer to traverse the embedded data…

Tương lai của EDMA

Hiện tại mình tạm thời sẽ không phát triển tiếp tục phiên bản trên Terminal của EDMA nữa vì mình đang tập trung phát triển một dự án cá nhân khác. Tuy nhiên, mình vẫn thấy đây là một dự án tiềm năng và giúp ích được cho cộng đồng. Trong tương lai gần, nếu không có gì thay đổi, mình sẽ chuyển hướng EDMA sang dạng Desktop App vì về lâu dài, Desktop App sẽ là hướng đi dễ dàng mở rộng và chuyên nghiệp hơn. Cảm ơn các bạn đã đọc bài viết của mình đến đây! 🧑‍💻

Subscribe to Tin Chung's Blog

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe