SlideShare a Scribd company logo
1 of 29
Download to read offline
CALIBAN
FUNCTIONAL GRAPHQL LIBRARY FOR SCALA
Scala Matsuri - October 2020
Scalaの GraphQLライブラリ
WHO AM I?
> Pierre Ricadat aka @ghostdogpr
>
!
exiled to
"
> Developer at devsisters
> Contributor to ZIO
> Creator of Caliban
自己紹介
フランス出身韓
Caliban作者
GRAPHQL ?
GraphQLとは?
GRAPHQL IN A NUTSHELL
> query language for APIs
> server exposes a typed schema
> client requests and receives only what they want
> client and server can use any programming language
> good tooling
GraphQLの
API のためのクエリ言語、スキーマは型付き
GRAPHQL SCHEMA
type Query {
user(id: ID): User
users: [User!]!
}
type User {
id: ID!
name: String!
age: Int
}
GraphQLスキーマ
GRAPHQL QUERY
query {
user(id: "xxx") {
name
age
}
}
GraphQLクエリ
GRAPHQL IN SCALA
> Sangria
> Caliban
> server
> client (including Scala.js support)
ScalaのGraphQLライブラリ
MOTIVATIONS
> minimize boilerplate
> purely functional
> strongly typed
> explicit errors
> user friendly
動機
ボイラープレートの最小化 / 純
DEFINING A SCHEMA
case class User(
id: UUID,
name: String,
age: Option[Int]
)
type User {
id: ID!
name: String!
age: Int
}
スキーマ定義
DEFINING A SCHEMA
case class UserArgs(id: UUID)
case class Query (
user: UserArgs => Option[User]
users: List[User]
)
type Query {
user(id: ID): User
users: [User!]!
}
スキーマ定義
SUPPORTED SCHEMAS
> Int, String, Boolean, List, Option, Tuple...
> Java Time, Java UUID
> Future, ZIO, ZStream
> case classes, sealed traits (derived by Magnolia)
> Monix, Cats Effect, Circe, Refined (via interop)
サポートしているスキーマ
各種基本の型、ライブラリに加え、自分でも
DEFINING A RESOLVER
val query = Query(
args => userService.getUser(args.id),
userService.getAllUsers
)
val api = graphQL(RootResolver(query))
リゾルバーの定義
CHECK YOUR SCHEMA
println(api.render)
/**
type Query {
user(id: ID): User
users: [User!]!
}
type User {
id: ID!
name: String!
age: Int
}
**/
スキーマを表示確認
TEST YOUR API
val query = "query { user(id: "xxx") { name age } }"
for {
interpreter <- api.interpreter
result <- interpreter.execute(query)
} yield result
APIをテストする
SERVE YOUR API
> http4s
> Akka HTTP
> Play Framework
> Finch
val route: HttpRoutes[Task] = Http4sAdapter.makeHttpService(interpreter)
APIをサーバーで動かす
N + 1 PROBLEM
query {
order(id: 12345) {
name
products {
name
}
}
}
NAIVE
for {
order <- getOrder(id)
products <- ZIO.foreachPar(order.pIds)(getProduct)
} yield Order(order.name, products)
n + 1 requests
そのままだと・・・
N+1回のリクエスト
OPTIMIZED
for {
order <- getOrder(id)
products <- ZQuery.foreachPar(order.pIds)(getProduct)
} yield Order(order.name, products)
2 requests
最適化すると
2回のリクエスト
ZQUERY
case class GetProduct(id: Int) extends Request[Throwable, Product]
val ProductDataSource =
DataSource.fromFunctionBatchedM("ProductDataSource")(
requests => dbService.getProducts(requests.map(_.id))
)
def getProduct(id: Int): ZQuery[Any, Throwable, Product] =
ZQuery.fromRequest(GetProduct(id))(ProductDataSource)
> See zio-query
ZQueryを使うと
WRAPPERS
> parsing
> validation
> execution
> field execution
> whole execution
ラッパー
パース、
BUILTIN WRAPPERS
val api = graphQL(...) @@
maxDepth(30) @@
maxFields(200) @@
timeout(10 seconds) @@
printSlowQueries(1 second)
> Apollo Tracing, Apollo Caching, Apollo Persisted
Queries, etc.
組み
Apolloのトレース、キャシュ、永
MORE FEATURES
> combine APIs
> annotations
> code generation tool
> schema diff
> Apollo Federation
他の機能
APIの結合、アノテーション、コード生成ツール等
CALIBAN CLIENT
> no boilerplate
> no more string copy-pasting
> no need for aliases, fragments, etc
Calibanクライアント
無ボイラープレート、alias や fragment もいらない
STEP 1: CODEGEN TOOL
calibanGenClient <schemaPath> <outputPath>
type Location {
latitude: Float!
longitude: Float!
}
⬇
type Location
object Location {
def latitude: SelectionBuilder[Location, Double] = (...)
def longitude: SelectionBuilder[Location, Double] = (...)
}
コード生成ツール
STEP 2: WRITING QUERIES
val location =
Location.latitude ~ Location.longitude
val query =
Query.search(Some("Berlin Ostbahnhof")) {
Searchable.stations {
Station.name ~ Station.location {
location
}
}
}
クエリを書く
STEP 3: RUNNING QUERIES
val request = query.toRequest(uri)
SttpClient.send(request)
> Response is already parsed into Scala types
> Use the sttp backend of your choice (including Scala.js)
クエリの
レスポンスはScalaの型としてパース /Scala.jsを含み、
好きなsttpバックエンドを使用可能
CURRENT STATE
> Recently celebrated 1st birthday
> Already 520 stars on github
> Built by 45 contributors
#
現在の
開 1年 /520スター/45コントリビューター/パフォーマ
ンス改善
THANKS!
> Website: https://ghostdogpr.github.io/caliban/
> Resources, FAQ, Examples
> ZIO Discord: #caliban
> Twitter: @ghostdogpr
ご
QUESTIONS?
質問はありますか?

More Related Content

What's hot

Production-ready GraphQL with Caliban
Production-ready GraphQL with CalibanProduction-ready GraphQL with Caliban
Production-ready GraphQL with CalibanPierre Ricadat
 
201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guideJunyi Song
 
Getting Started with Confluent Schema Registry
Getting Started with Confluent Schema RegistryGetting Started with Confluent Schema Registry
Getting Started with Confluent Schema Registryconfluent
 
Apache Flink Adoption @ Shopify
Apache Flink Adoption @ ShopifyApache Flink Adoption @ Shopify
Apache Flink Adoption @ ShopifyKevinLam737856
 
Graphql presentation
Graphql presentationGraphql presentation
Graphql presentationVibhor Grover
 
Java 8 presentation
Java 8 presentationJava 8 presentation
Java 8 presentationVan Huong
 
RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019Fabio Biondi
 
Thirteen ways of looking at a turtle
Thirteen ways of looking at a turtleThirteen ways of looking at a turtle
Thirteen ways of looking at a turtleScott Wlaschin
 
GraphQL Introduction
GraphQL IntroductionGraphQL Introduction
GraphQL IntroductionSerge Huber
 
FIWARE Wednesday Webinars - How to Secure IoT Devices
FIWARE Wednesday Webinars - How to Secure IoT DevicesFIWARE Wednesday Webinars - How to Secure IoT Devices
FIWARE Wednesday Webinars - How to Secure IoT DevicesFIWARE
 
RxJS Evolved
RxJS EvolvedRxJS Evolved
RxJS Evolvedtrxcllnt
 
Deploying Kafka Streams Applications with Docker and Kubernetes
Deploying Kafka Streams Applications with Docker and KubernetesDeploying Kafka Streams Applications with Docker and Kubernetes
Deploying Kafka Streams Applications with Docker and Kubernetesconfluent
 
Kafka Streams State Stores Being Persistent
Kafka Streams State Stores Being PersistentKafka Streams State Stores Being Persistent
Kafka Streams State Stores Being Persistentconfluent
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented ProgrammingScott Wlaschin
 
From Zero to Hero with Kafka Connect
From Zero to Hero with Kafka ConnectFrom Zero to Hero with Kafka Connect
From Zero to Hero with Kafka Connectconfluent
 
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...luisw19
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?FITC
 

What's hot (20)

Production-ready GraphQL with Caliban
Production-ready GraphQL with CalibanProduction-ready GraphQL with Caliban
Production-ready GraphQL with Caliban
 
201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide
 
Getting Started with Confluent Schema Registry
Getting Started with Confluent Schema RegistryGetting Started with Confluent Schema Registry
Getting Started with Confluent Schema Registry
 
An Introduction To REST API
An Introduction To REST APIAn Introduction To REST API
An Introduction To REST API
 
Apache Flink Adoption @ Shopify
Apache Flink Adoption @ ShopifyApache Flink Adoption @ Shopify
Apache Flink Adoption @ Shopify
 
Graphql presentation
Graphql presentationGraphql presentation
Graphql presentation
 
Java 8 presentation
Java 8 presentationJava 8 presentation
Java 8 presentation
 
RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019RxJS & Angular Reactive Forms @ Codemotion 2019
RxJS & Angular Reactive Forms @ Codemotion 2019
 
Rust
RustRust
Rust
 
Thirteen ways of looking at a turtle
Thirteen ways of looking at a turtleThirteen ways of looking at a turtle
Thirteen ways of looking at a turtle
 
GraphQL Introduction
GraphQL IntroductionGraphQL Introduction
GraphQL Introduction
 
FIWARE Wednesday Webinars - How to Secure IoT Devices
FIWARE Wednesday Webinars - How to Secure IoT DevicesFIWARE Wednesday Webinars - How to Secure IoT Devices
FIWARE Wednesday Webinars - How to Secure IoT Devices
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 
RxJS Evolved
RxJS EvolvedRxJS Evolved
RxJS Evolved
 
Deploying Kafka Streams Applications with Docker and Kubernetes
Deploying Kafka Streams Applications with Docker and KubernetesDeploying Kafka Streams Applications with Docker and Kubernetes
Deploying Kafka Streams Applications with Docker and Kubernetes
 
Kafka Streams State Stores Being Persistent
Kafka Streams State Stores Being PersistentKafka Streams State Stores Being Persistent
Kafka Streams State Stores Being Persistent
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
From Zero to Hero with Kafka Connect
From Zero to Hero with Kafka ConnectFrom Zero to Hero with Kafka Connect
From Zero to Hero with Kafka Connect
 
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?
 

Similar to Caliban: Functional GraphQL Library for Scala

ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJSTokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJSKhor SoonHin
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよkoji lin
 
JapanDreamin24_はじめてのGraphQL×LWC.pptx
JapanDreamin24_はじめてのGraphQL×LWC.pptxJapanDreamin24_はじめてのGraphQL×LWC.pptx
JapanDreamin24_はじめてのGraphQL×LWC.pptxRyota Tabuse
 
DVGA writeup
DVGA writeupDVGA writeup
DVGA writeupYu Iwama
 
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAmazon Web Services Japan
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Shinichi Tomita
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)Takahiro Yonei
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライMasanobu Sato
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
GitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APIGitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APITakahiro Kudo
 
DynamoDB Streamを使ったリアルタイム分析
DynamoDB Streamを使ったリアルタイム分析DynamoDB Streamを使ったリアルタイム分析
DynamoDB Streamを使ったリアルタイム分析ShinsukeYokota
 
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようAlfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようTasuku Otani
 

Similar to Caliban: Functional GraphQL Library for Scala (20)

API Gateway / AWS CLI
API Gateway / AWS CLIAPI Gateway / AWS CLI
API Gateway / AWS CLI
 
GraphQL with scala
GraphQL with scalaGraphQL with scala
GraphQL with scala
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJSTokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
JapanDreamin24_はじめてのGraphQL×LWC.pptx
JapanDreamin24_はじめてのGraphQL×LWC.pptxJapanDreamin24_はじめてのGraphQL×LWC.pptx
JapanDreamin24_はじめてのGraphQL×LWC.pptx
 
DVGA writeup
DVGA writeupDVGA writeup
DVGA writeup
 
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API GatewayAWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
AWS Black Belt Tech シリーズ 2015 - Amazon API Gateway
 
Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携Streaming API で実現する クラウド ⇔ イントラ連携
Streaming API で実現する クラウド ⇔ イントラ連携
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)
Salesforce DUG Japan Meetup#9(REST API, Metadata API etc)
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
GitHub Actions + Cloudflare API
GitHub Actions + Cloudflare APIGitHub Actions + Cloudflare API
GitHub Actions + Cloudflare API
 
DynamoDB Streamを使ったリアルタイム分析
DynamoDB Streamを使ったリアルタイム分析DynamoDB Streamを使ったリアルタイム分析
DynamoDB Streamを使ったリアルタイム分析
 
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみようAlfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
Alfresco勉強会#36 alfresco 5でカスタムREST APIを作ってみよう
 

Recently uploaded

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 

Recently uploaded (11)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

Caliban: Functional GraphQL Library for Scala

  • 1. CALIBAN FUNCTIONAL GRAPHQL LIBRARY FOR SCALA Scala Matsuri - October 2020 Scalaの GraphQLライブラリ
  • 2. WHO AM I? > Pierre Ricadat aka @ghostdogpr > ! exiled to " > Developer at devsisters > Contributor to ZIO > Creator of Caliban 自己紹介 フランス出身韓 Caliban作者
  • 4. GRAPHQL IN A NUTSHELL > query language for APIs > server exposes a typed schema > client requests and receives only what they want > client and server can use any programming language > good tooling GraphQLの API のためのクエリ言語、スキーマは型付き
  • 5. GRAPHQL SCHEMA type Query { user(id: ID): User users: [User!]! } type User { id: ID! name: String! age: Int } GraphQLスキーマ
  • 6. GRAPHQL QUERY query { user(id: "xxx") { name age } } GraphQLクエリ
  • 7. GRAPHQL IN SCALA > Sangria > Caliban > server > client (including Scala.js support) ScalaのGraphQLライブラリ
  • 8. MOTIVATIONS > minimize boilerplate > purely functional > strongly typed > explicit errors > user friendly 動機 ボイラープレートの最小化 / 純
  • 9. DEFINING A SCHEMA case class User( id: UUID, name: String, age: Option[Int] ) type User { id: ID! name: String! age: Int } スキーマ定義
  • 10. DEFINING A SCHEMA case class UserArgs(id: UUID) case class Query ( user: UserArgs => Option[User] users: List[User] ) type Query { user(id: ID): User users: [User!]! } スキーマ定義
  • 11. SUPPORTED SCHEMAS > Int, String, Boolean, List, Option, Tuple... > Java Time, Java UUID > Future, ZIO, ZStream > case classes, sealed traits (derived by Magnolia) > Monix, Cats Effect, Circe, Refined (via interop) サポートしているスキーマ 各種基本の型、ライブラリに加え、自分でも
  • 12. DEFINING A RESOLVER val query = Query( args => userService.getUser(args.id), userService.getAllUsers ) val api = graphQL(RootResolver(query)) リゾルバーの定義
  • 13. CHECK YOUR SCHEMA println(api.render) /** type Query { user(id: ID): User users: [User!]! } type User { id: ID! name: String! age: Int } **/ スキーマを表示確認
  • 14. TEST YOUR API val query = "query { user(id: "xxx") { name age } }" for { interpreter <- api.interpreter result <- interpreter.execute(query) } yield result APIをテストする
  • 15. SERVE YOUR API > http4s > Akka HTTP > Play Framework > Finch val route: HttpRoutes[Task] = Http4sAdapter.makeHttpService(interpreter) APIをサーバーで動かす
  • 16. N + 1 PROBLEM query { order(id: 12345) { name products { name } } }
  • 17. NAIVE for { order <- getOrder(id) products <- ZIO.foreachPar(order.pIds)(getProduct) } yield Order(order.name, products) n + 1 requests そのままだと・・・ N+1回のリクエスト
  • 18. OPTIMIZED for { order <- getOrder(id) products <- ZQuery.foreachPar(order.pIds)(getProduct) } yield Order(order.name, products) 2 requests 最適化すると 2回のリクエスト
  • 19. ZQUERY case class GetProduct(id: Int) extends Request[Throwable, Product] val ProductDataSource = DataSource.fromFunctionBatchedM("ProductDataSource")( requests => dbService.getProducts(requests.map(_.id)) ) def getProduct(id: Int): ZQuery[Any, Throwable, Product] = ZQuery.fromRequest(GetProduct(id))(ProductDataSource) > See zio-query ZQueryを使うと
  • 20. WRAPPERS > parsing > validation > execution > field execution > whole execution ラッパー パース、
  • 21. BUILTIN WRAPPERS val api = graphQL(...) @@ maxDepth(30) @@ maxFields(200) @@ timeout(10 seconds) @@ printSlowQueries(1 second) > Apollo Tracing, Apollo Caching, Apollo Persisted Queries, etc. 組み Apolloのトレース、キャシュ、永
  • 22. MORE FEATURES > combine APIs > annotations > code generation tool > schema diff > Apollo Federation 他の機能 APIの結合、アノテーション、コード生成ツール等
  • 23. CALIBAN CLIENT > no boilerplate > no more string copy-pasting > no need for aliases, fragments, etc Calibanクライアント 無ボイラープレート、alias や fragment もいらない
  • 24. STEP 1: CODEGEN TOOL calibanGenClient <schemaPath> <outputPath> type Location { latitude: Float! longitude: Float! } ⬇ type Location object Location { def latitude: SelectionBuilder[Location, Double] = (...) def longitude: SelectionBuilder[Location, Double] = (...) } コード生成ツール
  • 25. STEP 2: WRITING QUERIES val location = Location.latitude ~ Location.longitude val query = Query.search(Some("Berlin Ostbahnhof")) { Searchable.stations { Station.name ~ Station.location { location } } } クエリを書く
  • 26. STEP 3: RUNNING QUERIES val request = query.toRequest(uri) SttpClient.send(request) > Response is already parsed into Scala types > Use the sttp backend of your choice (including Scala.js) クエリの レスポンスはScalaの型としてパース /Scala.jsを含み、 好きなsttpバックエンドを使用可能
  • 27. CURRENT STATE > Recently celebrated 1st birthday > Already 520 stars on github > Built by 45 contributors # 現在の 開 1年 /520スター/45コントリビューター/パフォーマ ンス改善
  • 28. THANKS! > Website: https://ghostdogpr.github.io/caliban/ > Resources, FAQ, Examples > ZIO Discord: #caliban > Twitter: @ghostdogpr ご