News for hackers. Stuff that matters.
Re:GraphQL Performance Monitoring Is Hard by ehutch79 on Friday July 26, 2019 @06:28PM (#20538911)
I keep seeing stuff like this and wonder where the actual advantage to graphQL is?
Re:GraphQL Performance Monitoring Is Hard by kenrose on Friday July 26, 2019 @06:54PM (#20539062)
1. Fewer API round trips compared to REST. 2. Clients only download the data they need. No more REST silly patterns like BFF trying to support multiple client needs.

Yes, this does make instrumentation and rate limiting harder, but not impossible. It’s akin to using SQL... sometimes the query optimizer does weird things, but declaratively asking for your data is much better than imperatively pulling and joining it yourself.

Re:GraphQL Performance Monitoring Is Hard by BinaryIdiot on Saturday July 27, 2019 @03:39AM (#20540886)
> 1. Fewer API round trips compared to REST.

Why? This is always my chief complaint about GraphQL: there is no reason it should take fewer trips than directly hitting an endpoint unless you're structuring everything very rest-y in which case you're doing it wrong and GraphQL is a bandaid (and you'd still probably make the same amount of trips unless you're heavily caching things). IMO.

> 2. Clients only download the data they need.

Most third party APIs let you specify what fields you want via a query string or post variable which amounts to the same thing.

Honestly I think if people stopped trying to force REST into everything and just made RPC like calls to HTTP we'd have far less of a need for GraphQL.

Don't get me wrong, I still think GraphQL is pretty cool for third party access in some respects but I don't think it's as useful as a lot of people make it out to be.

Re:GraphQL Performance Monitoring Is Hard by viraptor on Saturday July 27, 2019 @05:51AM (#20541233)
You only get the same amount of API trips as graphql if you support the use case of every current API user. And the one that will start tomorrow. And one after that. Etc.

The great thing here is that you don't have to anymore - you automatically support them all (or close to). And if it saves you from writing and documenting each of those new endpoints, that's a win at least in development time for me.

Re:GraphQL Performance Monitoring Is Hard by biggestdecision on Saturday July 27, 2019 @03:55AM (#20540931)
Sure, it's possible to setup a REST api with those features (return full objects for fields rather than ID's, client specifies which fields to return in the query). But then you've basically just built a graphQL api. Any syntax you pick for allowing the client to specify which (nested) fields to return is going to look like a graphQL query. And using graphQL gives you some nice tools to use on the client side.
Re:GraphQL Performance Monitoring Is Hard by BinaryIdiot on Saturday July 27, 2019 @04:01AM (#20540957)
> But then you've basically just built a graphQL api

Not really. The type of API where you specify what you want and the API itself included whatever data you need in an RPC fashion has been around for decades, I feel weird calling it a "graphql api".

Ultimately GraphQL gives you some tools. The developer just has to figure out if those tools make up for the additional overhead (processing, size, training, etc). Sometimes it'll be justified I just think more often then not it really isn't.

Re:GraphQL Performance Monitoring Is Hard by wereHamster on Saturday July 27, 2019 @04:23AM (#20541021)
> [other types of APIs] has been around for decades

GraphQL is indeed not a new invention. It's a standardisation of existing ideas, that has been given a particular name, and a whole community of people who are building tooling around it.

If you tell me you are using/implementing GraphQL then I immediately know what to expect. I know which tools I can use, I know you have a schema, I know I can run queries and the syntax of those etc. But if you tell me that you are using a REST/HATEOAS/RPC with some particular query syntax then I first have to spend a day reading through the documentation to understand the API.

Re:GraphQL Performance Monitoring Is Hard by chii on Saturday July 27, 2019 @09:12AM (#20541881)
> REST/HATEOAS/RPC ... I first have to spend a day reading through the documentation to understand the API.

i think you're giving graphql too much credit, and give too little to REST.

The schema of graphql is going to require just as much reading up and domain knowledge as the REST api.

Re:GraphQL Performance Monitoring Is Hard by biggestdecision on Saturday July 27, 2019 @04:19AM (#20541011)
Sure it's not a new concept. But on the web graphQL is the most prominent implementation of that concept.

You can roll your own version of the concept, but why bother when a perfectly serviceable one already exists? With already written client & server implementations in your language of choice?

Re:GraphQL Performance Monitoring Is Hard by tjpnz on Saturday July 27, 2019 @03:52AM (#20540920)
>1. Fewer API round trips compared to REST. 2. Clients only download the data they need. No more REST silly patterns like BFF trying to support multiple client needs.

In most cases a thoughtfully designed REST API built according to HATEOAS shouldn't exhibit these problems. I've seen too many teams with a flawed understanding of both viewing GraphQL as some kind of silver bullet. Instead of stopping to consider their architecture they just rush out and implement GraphQL only to find themselves having significantly worse performance issues than they were having before.

Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @04:32AM (#20541055)
My understanding of the advantage of GraphQL is that it allows you to load a structure like

    user {
      groups(first: 10) {
        posts(first 1) {
          content
          author {
            name
            address {
              state
            }
          }
        }
      }
    }
and have all the round-trips take place within a datacentre, instead of needing to query

    /user 
    /user/12/groups?limit=10
    /groups/34/posts?limit=1
    /posts/56
    /users/78
    /users/78/address
and without having to write a separate

    /top_posts_view
endpoint.

I don't understand from the description "a thoughtfully designed REST API built according to HATEOAS" what your proposal to solve this problem is.

Re:GraphQL Performance Monitoring Is Hard by JoachimSchipper on Saturday July 27, 2019 @05:23AM (#20541171)
A quick search suggests that GraphQL should usually cause one client -> server -> SQL-server query - i.e. only one network round trip. No?
Re:GraphQL Performance Monitoring Is Hard by biggestdecision on Saturday July 27, 2019 @05:51AM (#20541234)
Client-API round trips matter, because the latency is very high. API-DB latency will be much lower, so the number of round trips there is less important. GraphQL allows you to query any nested structure in one Client-API round trip, but there may be many API-DB round trips per query.
Re:GraphQL Performance Monitoring Is Hard by jeremyjh on Saturday July 27, 2019 @10:06AM (#20542087)
It is better to have the resolver aggregate data, than to have multiple calls from the client to do it. The earliest uses of GraphQL was as a service aggregater. I'd be curious to know where you are seeing this "advice".
Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @05:46AM (#20541223)
I've only used it to aggregate backend services rather than as an SQL query builder, and this is also how it's used at Facebook.

I'd have concerns about writing business logic in resolvers. If I was using it with a single SQL db I'd probably write a separate non-GraphQL layer for business logic and keep the resolvers thin.

Re:GraphQL Performance Monitoring Is Hard by vmasto on Saturday July 27, 2019 @08:29AM (#20541719)
Can you expound on the concerns?
Re:GraphQL Performance Monitoring Is Hard by true_religion on Saturday July 27, 2019 @05:12AM (#20541138)
REST works, but it forces you to use a single endpoint at a time.

For example, let's say you have have two endpoints /albums/1/ and /users/2/ and want to query them both at the same time.

They're unrelated data, so following REST best practices would make them separate endpoints.

With GraphQL, they're seperate resolvers but you can write

   {
     albums { get(id: 1) { .... } }
     users { get(id: 2) { .... } }
   }

And combine them those two calls into a single query. Maybe this is also possible via REST, but I haven't seen it.
Re:GraphQL Performance Monitoring Is Hard by toast0 on Saturday July 27, 2019 @10:30AM (#20542178)
If the endpoints are unrelated and you know them both before querying either, you can certainly query them concurrently from nearly any client language.

GraphQL can do it, but I don't think that's a big strength, compared to the dependent queries it can do. Using the results from one query to drive a further query without going back to the client will save a bunch of time if the client is far from the server.

Re:GraphQL Performance Monitoring Is Hard by true_religion on Saturday July 27, 2019 @01:58PM (#20543205)
Sure you can make two queries concurrently, but does the server know you are doing that? With GeaphQL the server sees both queries at once, and can potentially optimize over that once someone notices that in their logs. And it expresses itself as a single network connection.

I do agree though with your point about dependent queries, though I have only used GraphQL for internal apis so my experience doesn’t include that sort of problem.

Re:GraphQL Performance Monitoring Is Hard by Aeolun on Saturday July 27, 2019 @08:05AM (#20541625)
Oh! This is interesting. I didn’t know I could do this too. That’s a bit nicer even than only the combining of nested calls that I was aware of.
Re:GraphQL Performance Monitoring Is Hard by bsaul on Saturday July 27, 2019 @04:31AM (#20541047)
I’ve read somewhere GraphQL major use case was in actually building BFF...

Unless you’re building one giant graphql enpoint exposing your whole database ?

Re:GraphQL Performance Monitoring Is Hard by davnicwil on Saturday July 27, 2019 @05:17AM (#20541155)
To me, the question is the other way round because the advantages (pointed out by all the other comments in this thread so I won't repeat) are clear, kind of immediately.

It's the disadvantages, particularly the 'unknown unknowns' that I wonder about, and that's what's kept me from using it. GraphQL so far seems like the archetypal counter example for the 'use boring stuff' philosophy of software engineering. I kind of hope I'm wrong here, because the advantages are big and pretty cool.

Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @06:04AM (#20541270)
GraphQL is pretty boring, at least on the server. You give your GraphQL library a schema and tell it how to deal with fields, and then it makes a tree of fields from your query and populates them according to your instructions.

It can get "exciting" on the client, particularly with libraries like Apollo. See for example the bug https://github.com/apollographql/apollo-client/issues/1186, which took two years to fix. The tooling for persisted queries can also be hard to set up, and they're close to required if you want to expose GraphQL to your client.

Re:GraphQL Performance Monitoring Is Hard by dmitriid on Saturday July 27, 2019 @06:43AM (#20541371)
It’s actually exciting on the server. Ad-hoc queries with unlimited complexity? Check. No caching? Check. No auth? Check.
Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @07:58AM (#20541600)
The solution to ad-hoc queries is to not use ad-hoc queries. Persisted queries are becoming common.

Caching is no harder in GraphQL than it is anywhere else. You define resolvers; if you want to put stuff in Redis, you're free to do so.

Auth is also no harder in GraphQL than it is anywhere else. You have complete control over what happens in a resolver, which includes authorising access and throwing an error/returning null/etc.

Re:GraphQL Performance Monitoring Is Hard by davnicwil on Saturday July 27, 2019 @08:09AM (#20541643)
To dig in on the persisted queries thing, which I mentioned in a reply to the sibling comment, have you seen practical advantages doing this vs just doing a plain old RPC style http API?

It seems to just move all the flexibility of GraphQL to dev time, and makes it only useful for a private API where you control both the client and the server. This is all fine, but then I just don't see why you'd move away from a classic API where caching is free for GETs and you don't have to go through the abstraction of GraphQL schemas and resolvers etc to do your endpoint logic, you can just do it.

One thing I could possibly see is that client side libraries like Apollo etc bring huge advantages like free client caching or other things I'm not aware of - is that the case?

Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @08:30AM (#20541722)
At the company which used GraphQL in production, two of the major reasons for adoption were decoupling the backend from the UI of the client, and allowing front-end developers to easily update the payload without making changes to the server, which weren't affected by using persisted queries. Caching was handled by separate backend services rather than the graphql service or the client, which wouldn't make sense for every usecase.

Apollo was really useful for managing state across the client. Tools like optimistic updates were very nice too. Unfortunately, it was somewhat buggy when we were using it, and the API kept changing, but I think it's more stable now.

It was also good to have a well-defined schema between client and backend, although you should have one anyway.

Re:GraphQL Performance Monitoring Is Hard by davnicwil on Saturday July 27, 2019 @09:01AM (#20541844)
Yeah, that makes sense. I think the usecase I'm optimising for is solo and/or full stack engineers in a relatively small team where everyone is free to do everything. When that's the case, obviously these kinds of abstractions may just get in the way rather than help.

I've worked for companies in the past that had the organisational setup you describe, however, where frontend engineers didn't even have pull access to the code for api services they were talking to, where this would have been a massive advantage in terms of productivity.

I seem to end up at this conclusion in most discussions about GraphQL, usually with facebook scale being referenced, where it seems that as a technology its main advantages might actually be architectural in terms of the organisation of how massive systems are engineered, by huge numbers of people.

The temptation is always to jump in and compare the technical merits and specifics, and overlook this, but I'm coming more to the opinion that this is the answer here to when to use GraphQL over REST / RPC over http. That is, at the scale of a massive engineering organisation, it might be an abstraction whose advantages outweigh the downsides, but probably not if you're a small team.

Re:GraphQL Performance Monitoring Is Hard by strken on Saturday July 27, 2019 @04:50PM (#20544113)
It's less about what front-end engineers are allowed to do, and more about having an abstraction flexible enough that new front-end features don't need changes on the backend unless the data model changes. Backend or full stack engineers can design endpoints however they want, whether it's RESTful JSON or gRPC, and GraphQL acts as a flexible aggregation and presentation layer.

If you're finding that your endpoints are filled with unnecessary optional fields, that they're specific to a single screen in the UI, that nearly every new feature involves work that's duplicated across front-end and backend, or that you're suffering a performance hit from the round-trip time between front-end and backend when you query nested objects, then GraphQL can be an option. These are problems that you run into when your product starts to get bigger and more unwieldy, so if your UI has five screens and doesn't reuse the same content then you might not see a lot of gain. Having said that, my former company was under ten engineers, so I don't think you need to be Facebook-scale to benefit.

Totally agree that the advantage is architectural. It's not a question of technical merits or of REST being bad. GraphQL is a layer of abstraction to separate data from presentation, and like other abstractions, you shouldn't use it unless you have a reason to.

Re:GraphQL Performance Monitoring Is Hard by dmitriid on Sunday July 28, 2019 @12:21PM (#20548290)
Edit: my viewpoint is applicable to public APIs. If your client(s) and your backend are under your control, then GraphQL is useful.

> The solution to ad-hoc queries is to not use ad-hoc queries. Persisted queries are becoming common.

So, you either reinvent REST, or fall prey to ad-hoc queries with potentially unlimited complexity.

Also, persistent queries don't save you from unlimited complexity when those are automatically persisted, which is what Apollo offers.

> Caching is no harder in GraphQL than it is anywhere else. You define resolvers; if you want to put stuff in Redis, you're free to do so.

Putting stuff in Redis does not make it caching.

> You have complete control over what happens in a resolver, which includes authorising access and throwing an error/returning null/etc.

So, you throw an error in a deeply nested resolver in an ad-hoc query with unknown complexity, and .... this is "no harder"?

Re:GraphQL Performance Monitoring Is Hard by barbellguy97 on Saturday July 27, 2019 @07:41AM (#20541541)
What do you mean wirh unlimited complexity, no caching oe aithorization? Have you ever used ot server-sody? Because they are all solved problems, except maybe caching in the transport layer, depensing on which forn of caching you're targetting.
Re:GraphQL Performance Monitoring Is Hard by davnicwil on Saturday July 27, 2019 @07:48AM (#20541565)
What are the generally accepted solutions to these problems? Can you point to any sources? They're probably the big 3 that have stopped me from using GraphQL so far.

Only thing I'm currently aware of that might 'solve' arbitrary complexity and caching is limiting queries to pre-approved whitelisted ones the server knows about and references with an id, which is more of a workaround than a solution, and removes the main advantages for whole sets of usecases like open apis for 3rd party use.

Re:GraphQL Performance Monitoring Is Hard by Ralfp on Saturday July 27, 2019 @10:49AM (#20542265)
Unlimited query complexity:

- graphql() function takes "validators" argument for a reason ;) There are multiple strategies for limiting complexity, but common ones are boxing (limiting depth and width of query) or query cost limitation.

For auth, you authenticate user using custom middleware before entering the query executor. Inside query executor you can do one of many things, depending on what makes sense for you: error field resolution, return "null", or return custom type like "ObjectNotFoundError".

For caching, you cache inside resolvers that do something costful, or in data loaders those resolvers call.

Re:GraphQL Performance Monitoring Is Hard by davnicwil on Saturday July 27, 2019 @11:08AM (#20542348)
Thanks for this reply!

Are things like query depth, width and cost limiting available as parameters to common libraries?

On the auth thing, one thing I commonly do with REST is have a general 'is this user authenticated' middleware and then later have a 'permissions' middleware that checks if the user has rights to see/modify the thing they are trying to, but that's at the service level for that particular thing.

Would you follow a similar strategy in GraphQL? Generic auth in a middleware for a user, then specific access management auth inside specific resolvers later on?

Re:GraphQL Performance Monitoring Is Hard by Ralfp on Saturday July 27, 2019 @01:54PM (#20543177)
> Are things like query depth, width and cost limiting available as parameters to common libraries?

No, they are mostly 3rd party utils. I those exist for Apollo server.

> Would you follow a similar strategy in GraphQL? Generic auth in a middleware for a user, then specific access management auth inside specific resolvers later on?

Yes. Or I would move auth check up a level, and implement schema directive like "@authenticated" or "@hasPerm("perm")" so resolver would do only data resolution, but each approach has advantages and downsides.

Re:GraphQL Performance Monitoring Is Hard by dmitriid on Saturday July 27, 2019 @07:48AM (#20541560)
> What do you mean wirh unlimited complexity, no caching oe aithorization?

I mean what I mean exactly.

- GraphQL allows ad-hoc queries of unlimited complexity.

- Since it's POST requests, there's no caching on the HTTP layer.

- Since it's add-hoc queries, it's hard to devise a cache for the DB layer.

- There are no easy solutions for either authentication or authorisation for queries (and subqueries and/or fields)

> Because they are all solved problems

If by solved you mean "busily reinventing the wheel and adding layers and layers of unneeded complexity, and it will only work if you buy into a single vendor's solution such as Apollo".

For crying out loud, one of the "solutions" for caching is to actually parse both the incoming and the outgoing requests, read the fields and decide if it needs to be cached.

Re:GraphQL Performance Monitoring Is Hard by Aeolun on Saturday July 27, 2019 @08:10AM (#20541649)
> For crying out loud, one of the "solutions" for caching is to actually parse both the incoming and the outgoing requests, read the fields and decide if it needs to be cached.

That sounds exactly the same as the thing you do when caching a HTTP request to me..?

Whether the fields are in the request body or the query string is pretty much irrelevant.

I think you are just annoyed that they misappropriated HTTP to do it.

Re:GraphQL Performance Monitoring Is Hard by dmitriid on Sunday July 28, 2019 @12:17PM (#20548261)
> That sounds exactly the same as the thing you do when caching a HTTP request to me..?

ETag, Is-Modified-Since, Last-Modified, Cache-Control don't require any parsing of the request body.

And the relevance is huge. It's one thing to match a resource id in a URL in an idempotent cacheable request. It's another to have request body fully parsed by a caching middleware layer in a non-idempotent non-cacheable request.

> I think you are just annoyed that they misappropriated HTTP to do it.

They looked at HTTP and threw out everything HTTP already has built in. And all the tools.

Re:GraphQL Performance Monitoring Is Hard by Aeolun on Sunday July 28, 2019 @07:09PM (#20550323)
> It's another to have request body fully parsed by a caching middleware layer in a non-idempotent non-cacheable request.

As far as I understand it you can use the request body directly as a caching key. No need to parse it. If you request exactly the same thing there’s no need to re-request it.

Re:GraphQL Performance Monitoring Is Hard by dmitriid on Monday July 29, 2019 @02:16AM (#20551911)
That would be a way to do it, but that would require the client to send exact queries. Depending on how queries are constructed, that will not always be the case.

Also, a quick look at the top search query for “Apollo graphql caching” shows that Apollo needs to deconsteuct the object (both for the request and the response) to be able to cache things: https://www.apollographql.com/docs/react/advanced/caching/

(I’m using Apollo here as one of the most advanced GraphQL solutions)

Re:GraphQL Performance Monitoring Is Hard by true_religion on Saturday July 27, 2019 @05:08AM (#20541131)
GraphQL is basically well structured RPC calls. So everything you wanted to do with SOAP, with none of the headaches and really nice instrumentation and documentation thrown in as part of the protocol.

I'm usually surprised with all the comparisons to REST. It's far more practical and way less dogmatic.

Re:GraphQL Performance Monitoring Is Hard by aleksei on Saturday July 27, 2019 @07:16AM (#20541458)
> I'm usually surprised with all the comparisons to REST.

I'd say that's because you should mentally substitute RPC whenever you see REST. Basically everyone talking about REST APIs mean RPC over HTTP with nouns in the endpoints.

Re:GraphQL Performance Monitoring Is Hard by tepidandroid on Friday July 26, 2019 @10:04PM (#20539928)
Along with what kenrose said, imagine the flexibility of being able to request the exact view that you need from the server for any client you have in mind. A perfect view fetched in a single trip -no overfetching or underfetching, no bespoke HTTP endpoints for every new use-case and a self documenting API + type-safety to boot.

Some trade-offs are things like more backend complexity, querying complex data (like deeply nested or recursive data structures) becomes harder, limiting exponential query complexity as the data branches out, etc. It also becomes more difficult to predict resource usage and to monitor performance, as the article mentions.

Re:GraphQL Performance Monitoring Is Hard by lkrubner on Saturday July 27, 2019 @04:19AM (#20541010)
There is something badly broken with your process for denormalization if you think bespoke endpoints are more work than GraphQL. Presumably you have to denormalize for many internal uses, as well as external ones, so it pays to automate that process till it is both flexible and easily configured and automatic.
Re:GraphQL Performance Monitoring Is Hard by thom on Saturday July 27, 2019 @06:38AM (#20541354)
But you’ve just described a bunch of work to do to achieve what’s GraphQL gives you for free, surely?
Re:GraphQL Performance Monitoring Is Hard by lkrubner on Saturday July 27, 2019 @12:24PM (#20542703)
Are you sure? GraphQL, with no extra effort, gives your Business Intelligence unit everything they need? GraphQL, "for free", populates a hot cache of your 10% most active data? GraphQL, with no effort, feeds historical data to your AI prediction engine, and also provides a high level summary to your CEO, and combines multiple databases into a unified view of inventory?

Most companies have denormalize data to a great many materialized views, to support multiple use cases. I don't see how GraphQL gives you those materialized views for free. I admit, I have not worked with GraphQL since 2017, and maybe the eco-system has come a long way. But at the time, we were doing all the work ourselves, and much of it was redundant with other efforts we had ongoing.

Re:GraphQL Performance Monitoring Is Hard by lkrubner on Saturday July 27, 2019 @11:48PM (#20545740)
Are you sure? GraphQL, with no extra effort, gives your Business Intelligence unit everything they need? GraphQL, "for free", populates a hot cache of your 10% most active data? GraphQL, with no effort, feeds historical data to your AI prediction engine, and also provides a high level summary to your CEO, and combines multiple databases into a unified view of inventory?

Most companies have denormalize data to a great many materialized views, to support multiple use cases. I don't see how GraphQL gives you those materialized views for free. I admit, I have not worked with GraphQL since 2017, and maybe the eco-system has come a long way. But at the time, we were doing all the work ourselves, and much of it was redundant with other efforts we had ongoing.

Re:GraphQL Performance Monitoring Is Hard by thom on Sunday July 28, 2019 @04:33AM (#20546466)
If GraphQL advocates (and dare I say consultants) are suggesting you build every single part of your business off of GraphQL then yes that seems absurd. That’s not really how I’ve seen it used though.
Re:GraphQL Performance Monitoring Is Hard by kthejoker2 on Sunday July 28, 2019 @10:09AM (#20547611)
So ... assuming you have an OLAP engine or as a fallback some analytics-friendly MVs, couldn't GraphQL be laid on top of those, too? Why does it have to be either/or?
Re:GraphQL Performance Monitoring Is Hard by dmitriid on Saturday July 27, 2019 @06:42AM (#20541366)
There’s nothing free. Requesting “any view for any potential client” will most likely cripple your backend because you can’t optimise ad-hoc queries.
Re:GraphQL Performance Monitoring Is Hard by thom on Saturday July 27, 2019 @10:43AM (#20542237)
So in the presumably rare case that this happens can one not just add a new view, map it in the GraphQL schema and still come out far ahead on development time? I just feel like a huge number of people are going to accept lower complexity in the short term with some optimisation to do later. That seems like an fairly sensible and defensible tradeoff. I’ll admit I’m not picturing public APIs though.