FIGHTING API FRAGMENTATION WITH
GraphQL
https://xkcd.com/927/
Can you easily traverse the data model of our entire organization?
Can you determine what part of the data model can change?
First day on the job
Umm, We have REST APIS...
WITH SWAGGER
Growth leads to increased data model complexity
Which leads to REST APIS with Swagger calling rest APIs with Swagger
APIS!!!
Which leads to Complexity+Latency
Bored Already?
Demo(lition) time
What & When
- Strongly-typed, declarative, introspective query language and type system for your entire organization-wide domain model
- RFC spec published in 2015
- Used internally by Facebook since 2012
- Open source implementations in Node, Scala, Python, PHP, etc.
WHO
JSON IS GREAT AT DESCRIBING DATA trees
BUT TREES ARE JUST SNAPSHOTS OF PARTS OF A GRAPH
JSON IS BAD AT DESCRIBING DATA GRAPHS
"MOST DOMAIN MODELS ARE GRAPHS" -- Abe Lincoln
STEPS TO UNDERSTANDING GraphQL
1. On the server,
Describe your TYPES
type Project {
name: String
tagline: String
contributors: [User]
}
type User {
name: String
email: String
failedLogins: Integer
isActive: Boolean
homepage: String
}
2. On the server,
RESOLVE your data
{
project: ({id}) => projectsService
.get(`/projects/${id}`)
.then(data => ({
tagline: data.PoorlyNamedTagLine,
contributors: data.contributors
})
}
3. On the CLIENT,
REQUEST SOME DatA
{
project(name: "GraphQL") {
tagline
contributors {
name
email
}
}
}
4. On the CLIENT,
YOU GET SOME JSON DATA
{
"project" : {
"tagline": "A query language for APIs",
"contributors" : [
{
"name": "Jim Cummins",
"email": "jimthedev@gmail.com"
},
{
"name": "Bart Simpson",
"email": "bart@springfield.us"
}
]
}
}
{
project(name: "GraphQL") {
tagline
contributors {
name
email
}
}
}
Notice how the response shape mimics the query shape.
Why does it matter?
When putting graph data in a tree, you over-fetch data which makes your responses large and your site feel slow.
SQL has been around for over 40 years and is popular because it is declarative and does not over-fetch.
In a declarative language I must declare exactly what data I want. The computer then gives me only the exact data I want.
Is it meant to replace JSON- rest?
Not necessarily. GraphQL can compliment JSON REST by sitting in front of it.
If REST is not available or not needed, it can fetch data itself by connecting directly to the DB.
How do I know if I need GraphQL?
IS GRAPHQL SQL?
No, but it is declarative like SQL.
Unlike SQL it can query APIs or databases.
GraphQL is not tied to a specific database, vendor or backend language.
You'LL know you've hit the limits of Tree structures (JSON) over rest when
Your API has querystring filters like:
?includes=['products', 'profile']
You fetch more than one resource type at a time to save bandwidth. (thus replicating rpc)
The majority of your the calls to your rest api are cache misses.
Your payload size is growing at a faster rate than the size of the fields you want off the payload.
You return duplicate data.
DB SCHEMAS AND APIs HARD TO CHANGE
DOCUMENTATIONFRAGMENTATION CHANG
FRONT END NOT PERFORMANT
Beginning GraphQL
By jimthedev
Beginning GraphQL
- 1,418