61
GraphQL Lessons Learned Bernd Schönbach, Patrick Surrey LeanIX GmbH

LeanIX GraphQL Lessons Learned - CodeTalks 2017

Embed Size (px)

Citation preview

Page 1: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GraphQLLessons LearnedBernd Schönbach, Patrick Surrey

LeanIX GmbH

Page 2: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Agenda

2

Introduction• Aboutus• AboutLeanIX• AboutGraphQL

WhyGraphQL?

GraphiQL

APIDesign

GraphQL ClientDesign

Apollo

Mutations

N+1SelectIssue

ExceptionHandling

Page 3: LeanIX GraphQL Lessons Learned - CodeTalks 2017

About Us

3

PatrickSurrey BerndSchönbach

Page 4: LeanIX GraphQL Lessons Learned - CodeTalks 2017

About LeanIX

4

Page 5: LeanIX GraphQL Lessons Learned - CodeTalks 2017

5

• Shortertimetomarket• Real-timebigdatainsights• Efficientscalability• Exceptionaluserexperience• Consistentchannels• Integratedworkflows• …

More• APIs• Devices• Sensors

ITArchitecturesaremoreimportantthaneverbefore

Page 6: LeanIX GraphQL Lessons Learned - CodeTalks 2017

LeanIXisthemostcomfortablesolution– asSaaS

6

AvailableIntegrations

Page 7: LeanIX GraphQL Lessons Learned - CodeTalks 2017

7

Industrials&Manufacturing

Financial&Insurance Consumer

Energy&Materials Pharma

TravelLogistics

MediaTelecoms

INTERNATIONALEXPANSION

Well-knownbrandsofallindustriestrustinLeanIX

Page 8: LeanIX GraphQL Lessons Learned - CodeTalks 2017

LeanIXisbasedonamodernMicroservices Stack

8

Pathfinder

Postgres

Elasticsearch

ArangoDB

PathfinderUISinglePageApp•Angular(2)•Typescript

BackendServices•GraphQL orRESTAPI•oAuth2/wJWT•SwaggerAPIDocs•Event-Bus(Webhooks)

Resources•Nosharingacrossservices•DeploymentwithDocker

Web-hooks MTM Export Image

s Survey Metric

Postgres

Kafka

Postgres

Shibbo

leth

PhantomJS

Postgres

Elasticsearch

Influ

xDB

“PlatformServices”

GraphQL

Page 9: LeanIX GraphQL Lessons Learned - CodeTalks 2017

About GraphQL

9

Page 10: LeanIX GraphQL Lessons Learned - CodeTalks 2017

10

“A query language for your API”http://graphql.org/

Page 11: LeanIX GraphQL Lessons Learned - CodeTalks 2017

11

History

• 2012nativemobileclientforNewsFeed

• Early2015announcedpublicly(https://www.youtube.com/watch?v=9sc8Pyc51uU)

• Sep.2015officiallyopensourced

• Nov.2016:Manymoreusers

Page 12: LeanIX GraphQL Lessons Learned - CodeTalks 2017

12

Basicidea

Server

WHATisavailable

Client

WHICHdataisneeded

1.Schema

2.Datarequirements

Java,Node,Ruby,PHP,Go,Scala,

.NET…

SimpleHTTP-Client

http://graphql.org/code/

Page 13: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

13

Page 14: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

14

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Page 15: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

15

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Page 16: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

16

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Page 17: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

17

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Page 18: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

18

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

query {id name type releasealias description...on Application {lifecycles {}relToSuccessor {}relToPredecessor {}relToBusinessCapability {}relToUserGroups {}[...]

}}

Page 19: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

19

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

query {id name type releasealias description

}

Page 20: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

20

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

query {id name

}

query {id name alias

}

query {id name description

}

Page 21: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why GraphQL?

21

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

query {id name...on Application {lifecycles {}relToBusinessCapabilities {}relToUserGroups {}

}}

Page 22: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GRAPHIQL

Page 23: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GraphiQL –Interactive in-browserGraphQL IDE

23

Runqueries

Integrated ExploreAPI

Seeresult

Page 24: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GraphiQL

24

• Available here:https://github.com/graphql/graphiql

• Greatway to document and explore the API

• Very helpfull during devolpment,e.g.for quickly testing the API

à Get it up and running from day one!

Page 25: LeanIX GraphQL Lessons Learned - CodeTalks 2017

APIDESIGN

Page 26: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Connections– InspiredbyRelayFramework

26

{"id": "factsheet-123”,"tags": [{ "id": "tag-1", "label": "Tag 1" },{ "id": "tag-2", "label": "Tag 2" }, { "id": "tag-3", "label": "Tag 3" }

]}

{idtags { id label }

}

FactSheet

Tag

Tag

Tag

Page 27: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Connections

27

{"id": "factsheet-123”,"tags": {

"edges": [{ "node": { "id": "tag-1", "label": "Tag 1" } },{ "node": { "id": "tag-2", "label": "Tag 2" } }, { "node": { "id": "tag-3", "label": "Tag 3" } }

]}

}

{idtags {

edges {node { id label }

}}

}

FactSheet

Tag

Tag

Tag

Page 28: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Connections- Advantages

28

{idtags {

totalCountpageInfo { startCursor endCursor hasNextPage }edges {

node { id label }}

}}

Page 29: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Connections- Advantages

29

{idtags {permissions { create read update delete }edges {node { id label }

}}

}

Page 30: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Connections– Lessonslearned

30

• MakestheAPImoregraphlike

• Usetheconnectionpatternrightfromthestart

• PreventsbreakingchangesinAPI

• UsethesamepatternthroughouttheAPI

• Clientscanhandleconnectionsinthesameway

Page 31: LeanIX GraphQL Lessons Learned - CodeTalks 2017

APIDesign– No“deadends”

31

{idtagId

}

{idtag { id label }

}

Page 32: LeanIX GraphQL Lessons Learned - CodeTalks 2017

APIDesign– Generallessonslearned

32

• APIdesignshouldbenottoousecasespecific

• YAGNI(„Youaren‘tgonna needit“)isusuallyagoodadvice,butshould

notbeappliedhere

• GraphQL isadvertisedas„...givesclientsthepowertoaskforexactly

whattheyneed“sodonotartificiallyrestricttheAPI

Page 33: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GRAPHQL CLIENTDESIGN

Page 34: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Doomed to fail ...

34

Lotsofparameters

Nobodydarestotouchthis

Evenmoregeneric

Page 35: LeanIX GraphQL Lessons Learned - CodeTalks 2017

GraphQL client – Querybuilding

35

Noparameters

Simple!:-)

Helpertomakerequests

Page 36: LeanIX GraphQL Lessons Learned - CodeTalks 2017

APOLLO

Page 37: LeanIX GraphQL Lessons Learned - CodeTalks 2017

What about the ApolloClient?

37

• ApolloClientavailablehere:

https://github.com/apollographql/apollo-client

• “Afully-featured,productionreadycachingGraphQL clientforevery

serverorUIframework”

• DeepintegrationpossiblewithReact,Angular,iOS,Android,…

Page 38: LeanIX GraphQL Lessons Learned - CodeTalks 2017

What about the ApolloClient?

38

Page 39: LeanIX GraphQL Lessons Learned - CodeTalks 2017

So,what about it then?

39

• Didyouuseit?

• No,itwasnotavailablewhenwestarted…

• Wouldyouuseit?

• Perhaps- itofferssomeniceabstractions(queriescanberestarted

forinstance),butourownverysimplisticapproachworksverywell

atthemoment

Page 40: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Mutations

40

Page 41: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Mutations

41

Mutation createApplication(name: “Application A“, alias: „APP-A“) { namealias

}

GraphQL Suggests:

Page 42: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Mutations

42

Mutation createFactSheet(input: {name: “Application A“, type: Application

}, patches: $patches) { namealias

}

Query:

{ patches: [{op:“add“, path:“/alias“, value:“APP-A“}

]}

Variables:

Page 43: LeanIX GraphQL Lessons Learned - CodeTalks 2017

N+1SelectIssue

43

Page 44: LeanIX GraphQL Lessons Learned - CodeTalks 2017

What is the N+1SelectIssue?

44

Application application =appDAO.getApplication();

for(Successor successor:application.getSucessors()){System.out.println(“Successor:“+successor.getName());}

Application application =appDAO.getApplication();

for(Successor successor:application.getSucessors()){System.out.println(“Successor:“+successor.getName());}

SELECT*FROMapplication WHERE...SELECT*FROMapplication WHERE...

SELECT*FROMsuccessor WHEREid =successor.id;SELECT*FROMsuccessor WHEREid =successor.id;SELECT*FROMsuccessor WHEREid =successor.id;...

#Selects

1

N

+SELECT*FROMsuccessor WHEREid =successor.id;SELECT*FROMsuccessor WHEREid =successor.id;SELECT*FROMsuccessor WHEREid =successor.id;...

Page 45: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why dowe have this issue with GraphQL?

45

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

Page 46: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why dowe have this issue with GraphQL?

46

• JavaLibraryuses Datafetcher

• Is afunction to connect GraphQL to underlying DB

• Knows only his level

Page 47: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why dowe have this issue with GraphQL?

47

Application {idnametypereleasealiasdescriptionLifecycles {...}Relations {SuccessorsPredecessorsBusiness CapabilitiesUser Groups[...]

}[...]

}

idnametypereleasealiasdescriptionLifecyclesRelations

idnametypereleasealiasdescriptionLifecyclesRelations

Page 48: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Why dowe have this issue with GraphQL?

48

• No context awareness

• No easyimplementation dueto „everything is agraph“

• Needsmanual implementation to fix.

Page 49: LeanIX GraphQL Lessons Learned - CodeTalks 2017

How To Solve This

49

• Prediction Library(enable context awareness)

• Batching

• Caching

• Facebooks solution is called relay

Page 50: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Exception Handling

50

Page 51: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Exception Handling

51

• Exceptions of JavaGraphQL Libraryare useless

• “Anerror occurred“

• You need context information to show usefull exceptions

• We implemented our own handler for that

Page 52: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Conclusion

52

Page 53: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Conclusion

53

• Stop thinking inREST

• No dead ends

• GrahpiQL first

• GraphQL is notthe solution for erverything

Page 54: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Breaking News

54

Page 55: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Breaking News

55

Page 56: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Breaking News

56

https://medium.com/@dwalsh.sdlr/using-graphql-why-facebook-now-owns-you-3182751028c9

Page 57: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Breaking News

57

https://code.facebook.com/posts/121714468491809/relicensing-the-graphql-specification/

Page 58: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Thank You

Page 59: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Questions?

Page 60: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Slides are available at:

https://de.slideshare.net/leanIX_net

Page 61: LeanIX GraphQL Lessons Learned - CodeTalks 2017

Sources

• http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/

• http://graphql.org/

• https://github.com/graphql/graphiql

• https://www.leanix.net/de

• https://www.apollodata.com

• https://github.com/graphql-java/graphql-java

• https://angular.io/

• https://facebook.github.io/relay/