stackshareio / graphql-cache

A caching plugin for graphql-ruby
MIT License
335 stars 25 forks source link

[FEAT] Cache introspection queries #62

Open alecgorge opened 5 years ago

alecgorge commented 5 years ago

Is your feature request related to a problem? Please describe. This project looks almost perfect for addressing some hotspots in our code!

Describe the solution you'd like I would like to be able to apply caching to the introspection fields/queries. Introspection queries are currently the heaviest GraphQL query we face because we have a very large schema—but our schema doesn't change while the server is running. I plan on using a cache key of the build number + schema name in production.

It isn't clear to me how to attach caching to these automatically provided fields.

Additional context We are open to other solutions besides caching at the field level but aren't keen on directly matching against the query because when we open up our GraphQL API to more 3rd parties we can't ensure they always introspect in the same way.

query IntrospectionQuery {
  __schema {
    queryType {
      name
    }
    mutationType {
      name
    }
    subscriptionType {
      name
    }
    types {
      ...FullType
    }
    directives {
      name
      description
      locations
      args {
        ...InputValue
      }
    }
  }
}

fragment FullType on __Type {
  kind
  name
  description
  fields(includeDeprecated: true) {
    name
    description
    args {
      ...InputValue
    }
    type {
      ...TypeRef
    }
    isDeprecated
    deprecationReason
  }
  inputFields {
    ...InputValue
  }
  interfaces {
    ...TypeRef
  }
  enumValues(includeDeprecated: true) {
    name
    description
    isDeprecated
    deprecationReason
  }
  possibleTypes {
    ...TypeRef
  }
}

fragment InputValue on __InputValue {
  name
  description
  type {
    ...TypeRef
  }
  defaultValue
}

fragment TypeRef on __Type {
  kind
  name
  ofType {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
              }
            }
          }
        }
      }
    }
  }
}
thebadmonkeydev commented 5 years ago

@alecgorge I'm sorry it has taken so long to respond to this issue. I no longer work at Stackshare and don't have write access to the repo anymore.

That's an interesting use case that I haven't seen before (caching introspection queries). I'm not entirely sure whether graphql-cache is the write tool for this issue or not. We make a lot of assumptions about what it is that we're caching. I'll do some investigation and see if I can come up with a way to accomplish this in a stable way.