Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RustのSchema_First_GraphQLライブラリrusty-gqlを作った話.pdf

Takuro
October 16, 2022

 RustのSchema_First_GraphQLライブラリrusty-gqlを作った話.pdf

Takuro

October 16, 2022
Tweet

More Decks by Takuro

Other Decks in Programming

Transcript

  1. RustのSchema First GraphQLライブラリ
    rusty-gqlを作った話
    Takuro Iwamoto

    View Slide

  2. Introduction
    ・Tak-Iwamoto / 岩本卓朗
    ・webアプリケーションエンジニア

    View Slide

  3. Outline
    ・RustとGraphQL
    ・rusty-gqlの紹介、デモ
    ・GraphQLライブラリの実装方法

    View Slide

  4. RustとGraphQL

    View Slide

  5. GraphQL
    ・APIのスキーマ、型の定義
    ・クライアントのクエリに基づいたAPIレスポンス
    Rust
    ・メモリ効率、パフォーマンスに優れた言語
    ・リッチな型システム

    View Slide

  6. GraphQL
    ・APIのスキーマ、型の定義
    ・クライアントのクエリに基づいたAPIレスポンス
    Rust
    ・メモリ効率、パフォーマンスに優れた言語
    ・リッチな型システム

    View Slide

  7. GraphQL Rust

    View Slide

  8. 既存のRustのGraphQLライブラリ
    ・juniper
    ・async-graphql
    ・Code Firstのアプローチ

    View Slide

  9. ・Code First: コードでGraphQLのスキーマ定義と実装を行う
    ・Schema First: GraphQLでスキーマ定義した後にコードを生成
    Code First vs Schema First

    View Slide

  10. ・Code First: コードでGraphQLのスキーマ定義と実装を行う
    ・Schema First: GraphQLでスキーマ定義した後にコードを生成
    Code First vs Schema First
    どちらが良いのか?

    View Slide

  11. At Netflix we strongly prefer schema-first development.
    ・The schema design is front and center of the developer experience.
    参照: Netflix Technology Blog: Open Sourcing the Netflix Domain Graph Service Framework: GraphQL
    For Spring Boot
    Netflix製のGraphQLライブラリ

    View Slide

  12. At Netflix we strongly prefer schema-first development.
    ・The schema design is front and center of the developer experience.
    参照: Netflix Technology Blog: Open Sourcing the Netflix Domain Graph Service Framework: GraphQL
    For Spring Boot
    Netflix製のGraphQLライブラリ

    View Slide

  13. At Netflix we strongly prefer schema-first development.
    ・The schema design is front and center of the developer experience.
    参照: Netflix Technology Blog: Open Sourcing the Netflix Domain Graph Service Framework: GraphQL
    For Spring Boot
    Netflix製のGraphQLライブラリ
    rusty-gqlはSchema Firstを採用

    View Slide

  14. rusty-gql

    View Slide

  15. rusty-gql
    ・Schema First
    ・Convention Over Configuration
    ・Code Generate from GraphQL schema

    View Slide

  16. Getting Started
    ・CLIをinstallしてProject作成

    View Slide

  17. ・schema/** 配下に.graphqlファイルを定義
    ・rusty-gql generate(rusty-gql g)を実行
    ・関連ファイルが生成される
    schema/schema.graphql
    GraphQLのスキーマ定義

    View Slide

  18. Resolverの実装
    schema/schema.graphql
    src/graphql/query/todos.rs

    View Slide

  19. Demo

    View Slide

  20. GraphQLライブラリの実装方法

    View Slide

  21. GraphQLライブラリとは
    ・GraphQLライブラリ: GraphQLの仕様通りに処理を行うもの

    View Slide

  22. GraphQLライブラリとは
    ・GraphQLライブラリ: GraphQLの仕様通りに処理を行うもの
    GraphQL処理系

    View Slide

  23. GraphQLライブラリとは
    ・GraphQLライブラリ: GraphQLの仕様通りに処理を行うもの
    GraphQL処理系 言語処理系のプロセスと類似

    View Slide

  24. GraphQL処理系の実装方法
    1. GraphQLリクエストをparseして抽象構文木(AST)に変換
    2. ASTからオブジェクトのFieldごとにResolverを実行
    3. 実行結果をserializeしてクライアントに返す

    View Slide

  25. GraphQL処理系の実装方法
    1. GraphQLリクエストをparseして抽象構文木(AST)に変換
    2. ASTからオブジェクトのFieldごとにResolverを実行
    3. 実行結果をserializeしてクライアントに返す

    View Slide

  26. GraphQL AST
    ● SelectionSet: 複数のFieldを持つ
    ● Field:
    ○ オブジェクトのField
    ○ SelectionSetを持つ場合もある。
    GraphQL Spec
    https://spec.graphql.org/October2021/

    View Slide

  27. Parser
    ・github.com/graphql-rust/graphql-parser

    View Slide

  28. GraphQL処理系の実装方法
    1. GraphQLリクエストをparseして抽象構文木(AST)に変換
    2. ASTからオブジェクトのFieldごとにResolverを実行
    3. 実行結果をserializeしてクライアントに返す

    View Slide

  29. Resolver
    ● Fieldごとにどのような値を返すのか定義したメソッド
    ○ rusty-gqlではResolverとして非同期関数を定義
    ● クエリにFieldが含まれているときのみ実行される

    View Slide

  30. GraphQL
    Rust

    View Slide

  31. GraphQLクエリ Rustの処理
    ※疑似コードです
    Queryは並列に実行

    View Slide

  32. GraphQL処理系の実装方法
    1. GraphQLリクエストをparseして抽象構文木(AST)に変換
    2. ASTからオブジェクトのFieldごとにResolverを実行
    3. 実行結果をserializeしてクライアントに返す

    View Slide

  33. Serdeを使用してSerialize
    GraphQL Rust

    View Slide

  34. Serdeを使用してSerialize
    GraphQL Rust
    どうやってGqlValueを
    生成するのか?

    View Slide

  35. FieldResolver trait
    GqlValueを返すFieldResolver traitを定義
    組み込みの型に対してもtraitをimplしている

    View Slide

  36. proc-macroの活用
    GraphQLの型にはproc-macroでFieldResolverをimplする

    View Slide

  37. Summary
    ・RustとGraphQLは型定義が柔軟にできる点で相性が良い
    ・Schema FirstなGraphQLライブラリrusty-gqlを作った
    ・rusty-gqlは並列処理、proc-macroなどRustの機能を最大限
    利用して実装している

    View Slide

  38. Thank you for watching!

    View Slide