GRANDstack - Từ lý thuyết đồ thị cho đến sự cải tiến trong công nghệ

Nếu các bạn để ý thì hầu hết các bài viết của mình trong "Góc Kỹ Thuật" thì sẽ đều ít nhất một lần nhắc đến GraphQL. Dưới góc nhìn của mình thì mình cảm thấy GraphQL là một công nghệ go-to, rất đáng để học để có một góc nhìn trực quan về cách mà lý thuyết đồ thị (Graph Theory) được áp dụng vào thực tiễn.

Góc Của Chung | Đón đầu xu thế với 5 công nghệ cho phát triển web hiện đại (2021)
Trong khuôn khổ của lập trình web, có rất nhiều ý kiến cho rằng lập trình web giờ rất lỗi thời và dễ tiếp cận...Trong bài viết hôm nay, mình sẽ liệt kê ra một số công nghệ có thể làm mưa làm gió trong tương lai của nhóm ngành công nghệ này...

Trong bài viết về 5 công nghệ mà mình nghĩ sẽ làm mưa làm gió trong năm 2021, mình cũng đã có đề cập đến GraphQL. Vậy nên hôm nay bài viết này sẽ về một tech stack được xây dựng trên lý thuyết đồ thị và vẫn còn rất mới mẻ đó là GRANDstack.


GRANDstack là gì?

Logo của GRANDstack

GRANDstack là một Tech stack được xây dựng và phát triển để phù hợp cho những ứng dụng fullstack đòi hỏi một lượng data lớn. Điểm nổi bật nhất của GRANDstack là khả năng xử lý dữ liệu một cách linh hoạt hoạt và trực quan, củng cố bởi các cộng nghệ dựa trên lý thuyết đồ thị. Những công nghệ cộng hưởng để tạo thành GRANDstack gồm có

  • GraphQL (Graph Query Language): Công nghệ được phát triển và chóng lưng bởi "gã khổng lồ" Facebook. Được phát triển nội bộ vào năm 2012 trước khi phát hành công khai vào năm 2015. GraphQL trực quan hóa việc truy vấn dữ liệu thông qua một endpoint được khởi tạo. Điều này khiến quá trình phát triển API và sử dụng tử client trở nên đơn giản hơn.
  • React: Một thư viện/framework front-end cũng được phát triển bởi Facebook được ra mắt vào năm 2013. React được sử dụng để phát triển các SPA (Single Page Application) với một hiệu năng cực kì nhanh cùng với khả năng tái sử dụng các UI component.
  • Apollo: Công nghệ được triển khai theo chuẩn công nghiệp (industry-standard) trên GraphQL. Gồm một nhóm các công cụ hỗ trợ việc gọi giao thức và xây dựng Graph API. Apollo cung cấp Apollo Server để tạo một máy chủ qua lớp dữ liệu đồ thị (data graph layer) để làm việc với GraphQL và Apollo Client để các client có thể truy vấn và thao tác với dữ liệu từ máy chủ không phân biệt nền tảng (mobile, web).
  • Neo4J Database: Hệ quản trị cơ sở dữ liệu đồ thị được giới thiệu đầu tiên vào năm 2007 và công bố phiên bản 1.0 vào năm  2010. Neo4J là một trong những hệ quản trị cơ sở dữ liệu đồ thị được sử  dụng nhiều nhất. Cũng như mục đích mà GraphQL là để khiến mọi thứ trở nên trực quan hơn với nhà phát triển, Neo4J cũng áp dụng lý thuyết đồ thị và cho phép lập trình viên truy vấn dữ liệu như cái cách mà họ hình dung.
Nhóm công nghệ GRANDstack

Với những Tech stack phổ biến hiện nay như MERN stack hay LAMP stack thì RESTful API luôn là một lựa chọn ưu tiên xây dựng API từ back-end. Bởi RESTful API với tuổi đời hơn hai thập kỉ (1998) có một chỗ đứng vững chãi trong lòng lập trình viên. Tuy nhiên khi mà GraphQL được ra mắt thì các mũi nhọn dư luận đổ dồn về "con đẻ Facebook" về những tính năng mà nó mang lại cũng như liệu GraphQL có thật sự hiệu quả hơn RESTful API hay không?


BẮT ĐẦU VỚI GRANDstack

Video về cách khởi tạo dự án GRANDstack cho người mới bắt đầu (English)

Khi khởi tạo một ứng dụng React thì chúng ta sẽ thường sử dụng CRA hay create-react-app để setup một dự án React nhanh nhất.

Ở phía GRANDstack, mọi thứ cũng bắt đầu đơn giản như vậy, thay vì CRA thì chúng ta có


npx create-grandstack-app <Tên dự án>
create-grandstack-app với npx

hay


yarn create grandstack-app <Tên dự án>

Để minh họa trực tiếp cho các bạn dễ hình dung thì mình sẽ tạo ngay một dự án GRANDstack theo hướng dẫn này

Những gì diễn ra trên terminal

Ở đây thì Terminal Wizard của create-grandstack-app sẽ hỏi chúng ta một số thông tin như template mà dự án sử dụng (React, React-Typescript hay Angular). Sau đó là một số những lựa chọn không bắt buộc như khởi tạo git repo. Để có thể tạo một dự án GRANDstack thì chúng ta cần phải có một Neo4J database được đăng ký từ https://neo4j.com/sandbox/ để máy chủ GraphQL có thể kết nối với Neo4J.

Những thông tin cho database nhận được sau khi đăng ký

Dựa trên những thông tin đã được cung cấp, quay lại terminal và nhập những thông tin ấy vào các trường thích hợp. Lúc này trên terminal sẽ tiến hành khởi tạo dự án

Sau quá trình khởi tạo thì lúc này trong cây thư mục dự án gồm có một folder front-end, một folder api hay back-end và một folder Neo4J để setup hay config cơ sở dữ liệu.

Dự án của chúng ta lúc này đã được khởi tạo gồm các liên kết tới cơ sở dữ liệu và kết nối giữa client với server thông qua Apollo.

Theo mình đánh giá thì đây là một cách tiếp cận rất hữu ích và tiết kiệm được nhiều thời gian trong giai đoạn sơ khai của dự án.


KIẾN TRÚC CỦA GRANDstack

Sơ lược về workflow của GRANDstack thì đầu tiên dữ liệu được gửi từ phía người dùng thông qua giao thức HTTP  từ Apollo Client sẽ được vận chuyển và đọc bởi Apollo Server - nơi gồm endpoint chứa các GraphQL API. Máy chủ Apollo Server đọc dữ liệu và biên dịch GraphQL thành *CYPHER để giao tiếp với Neo4J. Ngược lại, các giao tiếp từ server tới client cũng sẽ thông qua Apollo Server dưới backend và Apollo Client trên React.

*CYPHER: Cypher là một ngôn ngữ truy vấn biểu đồ khai báo cho phép truy vấn dữ liệu biểu cảm và hiệu quả trong biểu đồ thuộc tính. Cypher phần lớn là một phát minh của Andrés Taylor khi làm việc cho Neo4j, Inc. vào năm 2011.

LÝ DO NÀO MÀ BẠN NÊN LỰA CHỌN GRANDstack?

Sau khi tham khảo video và một số bài viết của tác giả Michael Porter từ Muddy Boots Code - một công ty chuyên làm việc với các quyền sỡ hữu trong lĩnh vực khai thác khoáng sản và dầu khí. Một lĩnh vực kinh doanh mà Michael cho rằng các dữ liệu dựa trên rất nhiều về "quan hệ" (relationship-based).

Trong lĩnh vực này thì quyền sỡ hữu được truyền từ đời này sang đời khác, thậm chí nhượng quyền từ gia đình này sang gia đình khác. Vậy nên việc áp dụng nguyên lý đồ thị vào bài toán kinh doanh này có thể giải quyết được các vấn đề về dữ liệu.

Cách mà GRANDstack khiến cuộc sống của bạn trở nên dễ dàng hơn
  • Neo4J với GraphQL làm cho việc model (nặn kiểu) các dữ liệu và quan hệ giữa các đối tượng trở nên dễ dàng hơn.
  • CRUD Tự động - không cần các *resolver (trừ khi bạn muốn tạo ra một số tùy chỉnh khác)
  • Khả năng sử dụng CYPHER *directives để tạo ra các thuộc tính nhánh
  • Các tùy chỉnh thông qua *APOC và CYPHER khi việc tự động khởi tạo *mutations/queries không hoạt động như những gì bạn muốn

*resolver: Khi thiết kế GraphQL API thì các bạn cần phải khởi tạo các resolver chứa logic. Resolver gồm mutation/query/subscription.

*directive: Directive là một tính năng nâng cao của GraphQL, hiểu nôm na thì nó giống như là một middleware vậy.

*APOC hay Awesome Procedures on Cypher: Là một thư viện Neo4J để giúp nhà phát triển sử dụng các procedures chung đa nền tảng. Từ đó, họ chỉ cần viết thêm các thêm các business logic mở rộng.

*mutations/queries: Mutation trong GraphQL có thể hiểu là POST trong RESTful API và tương tự queries là GET


Và đó là những gì mình tìm hiểu về GRANDstack. Mình nghĩ lý thuyết đồ thị là một kiến thức không thể thiếu trong lập trình. Và có thể áp dụng ngay kiến thức ấy vào thực tiễn thông qua các công nghệ có thể khiến chúng ta học tập tốt hơn. 😁

Góc Của Chung

Góc Của Chung