StashQL, созданный с помощью OS Labs Tech Accelerator, представляет собой пакет npm, который используется для кэширования запросов и данных GraphQL с дополнительными параметрами для обновления кеша по сравнению с вашими традиционными пакетами.

Общие сведения (GraphQL и REST API)

REST API (также известный как RESTful API) уже давно является стандартом для разработки веб-API. Однако это не значит, что он идеален. REST API организован с точки зрения конечных точек, и для получения данных пользователям может потребоваться доступ к нескольким конечным точкам, что приводит к проблемам с избыточной или недостаточной выборкой данных. С другой стороны, GraphQL — это язык запросов, который дает пользователю возможность получить именно то, что он хочет, при извлечении данных, требуя при этом использования только одного запроса/конечной точки. В последнее время GraphQL приобрел значительную популярность и популярность благодаря своим быстрым, гибким и эффективным вызовам API. Но это не значит, что он без подводных камней. По сравнению с традиционной архитектурой RESTful кэширование на стороне сервера в GraphQL по-прежнему является проблемой. REST API дает пользователям возможность кэшировать ответы, помещая необязательный ключ в заголовок запроса. Эта функция позволяет REST API сохранять часто запрашиваемые клиентом данные в памяти, а не повторно запрашивать базу данных, что сокращает время отклика. Сам GraphQL не имеет встроенных функций кэширования, вместо этого он полагается на сторонние пакеты и библиотеки. Одна из проблем с этими внешними пакетами заключается в том, что у них нет гибкости в отношении того, как обновляется кеш. Вот где на сцену выходит StashQL.

StashQL

StashQL предоставляет пользователям GraphQL простой способ кэшировать свои данные и настраивать способ обновления данных в кеше, когда в базе данных происходит мутация. Кроме того, StashQL регистрирует, какие запросы и мутации были выполнены, данные, полученные обратно из базы данных (или ошибки), и время выполнения каждого запроса/мутации. Доступ к зарегистрированной информации можно получить непосредственно из папки журналов, созданной StashQL, или через интерфейс командной строки StashQL.

StashQL можно установить, набрав:

npm install stashql

После установки пользователь может создать новый экземпляр класса StashQL, который потребует от пользователя передать свою схему GraphQL и кэш Redis, а также необязательный третий целочисленный параметр для установки времени жизни (TTL) кэшированных данных.

const StashQL = new stashql(schema, redisCache, 100)

Затем пользователи могут использовать новый экземпляр StashQL и его встроенные методы в качестве традиционных функций промежуточного программного обеспечения.

app.use('/graphql', StashQL.queryHandler, (req, res) => {
  return res.status(200).json(res.locals.data);
})

При отправке запросов или мутаций GraphQL пользователи должны использовать метод queryHandler() StashQL.При первом запуске запроса queryHandler() >метод выполнит запрос как обычно, а затем кэширует запрос вместе с возвращенными данными в кэш Redis пользователя. Если запрос уже сохранен в кеше, метод queryHandler() просто извлечет данные из кеша, избегая ненужных обращений к базе данных. Если кеш необходимо очистить, StashQL также предлагает метод clearCache(), который очищает все кешированные данные.

Что делать, если в базе данных происходит мутация? StashQL предоставляет два метода, методы refillCache и clearRelatedFields, для обновления кеша пользователя, чтобы им никогда не приходилось беспокоиться об устаревших данных, возвращаемых их запросами. Оба эти метода могут быть переданы в качестве необязательных аргументов в пользовательских типах мутаций GraphQL.

Аргумент refillCache принимает строковое значение, которое может быть любым полем, которое пользователь хочет обновить после запуска изменения. Метод queryHandler() увидит этот аргумент, возьмет его строковое значение и обновит любые кэшированные данные, относящиеся к переданному строковому значению, повторно выполнив соответствующие запросы, чтобы получить наиболее актуальные данные. информация о дате из базы данных.

mutation{
  addAuthor ( name:"John Smith", refillCache:"authors"){
    name
  }
}

Подобно аргументу refillCache, аргумент clearRelatedFields также будет принимать строковое значение, которое будет любым полем, которое пользователь захочет обновить после изменения. Увидев этот аргумент, вместо обновления кэшированных данных, относящихся к переданной строке, путем повторного запуска соответствующих запросов метод queryHandler() удалит соответствующие данные из кэша.

exampleQuery =
`
query{
  author{
    name
  }
}
`
mutation{
  addAuthor(name:"John Smith", refillCache:exampleQuery){
    name
  }
}

Когда следует использовать аргумент refillCache или аргумент clearRelatedFields? Мы объясним их различные варианты использования ниже.

Пользователь должен использовать refillCache, если он запускает мутацию и у него есть только несколько запросов в кеше, которые имеют дело с переданным полем. Поскольку этот метод повторно запускает все запросы в кеше пользователя. которые соответствуют переданному полю, может быть выполнено несколько сетевых запросов одновременно (для повторного запуска запросов и получения наиболее актуальных данных). Важно отметить, что использование этого метода может привести к перегрузке базы данных или даже к сбою базы данных, если кэш содержит слишком много данных, соответствующих переданному полю.

Сценарий 1. Предположим, что у пользователя в базе данных есть лишь небольшой объем кэшированных данных об авторах. Теперь предположим, что пользователь хочет добавить автора в свою базу данных, но хочет убедиться, что он не получит устаревшие данные из своего кеша при запросе любых данных, связанных с авторами. Этот пользователь должен рассмотреть возможность передачи метода refillCache и значения «authors». Это приведет к повторному запуску любых кэшированных запросов, связанных с авторами, и обновлению соответствующих кэшированных данных.

Если пользователь выполняет изменение, которое повлияет на значительный объем кэшированных данных, ему следует подумать о передаче аргумента clearRelatedFields.После просмотраclearRelatedFields >, StashQL возьмет переданное поле, найдет любые кэшированные данные, соответствующие этому полю, и удалит их из кэша. Теперь при следующем запуске запроса он отправится в базу данных, отправит обратно обновленные данные, а затем кэширует их. Это позволяет избежать множественных сетевых запросов и значительно снижает вероятность перегрузки базы данных.

Сценарий 2: скажем, у пользователя есть большой объем кэшированных данных об авторах в его базе данных. Теперь давайте предположим, что пользователь хочет добавить автора в свою базу данных, но хочет убедиться, что он не получит устаревшие данные из своего кеша при запросе любых данных, связанных с авторами. В этом случае пользователю следует рассмотреть возможность передачи аргумента clearRelatedFields и значения «авторы». Это очистит все кешированные данные, относящиеся к авторам, так что в следующий раз, когда пользователь запустит запрос данных об авторе, он просто повторно запустит ТОЛЬКО этот запрос вместо ВСЕХ запросов, которые имеют дело с авторами.

Что дальше для StashQL?

В настоящее время CLI StashQL позволяет пользователям только просматривать и очищать все журналы. Однако команда StashQL планирует улучшить и расширить это в ближайшем будущем. Мы планируем предоставить пользователям больше возможностей для регистрации, извлечения, визуализации и загрузки данных. Мы также планируем добавить новые методы, которые еще больше улучшат функции кэширования и мутации StashQL.

Спасибо всем, что нашли время, чтобы узнать о нашем инструменте с открытым исходным кодом.

StashQL: СайтGitHubnpmTwitter

Хотите подключиться? Вот наша команда:

Хакудо Уэно: GitHubLinkedIn

Саймон Чен: GitHubLinkedIn

Ян Мэдден: GitHubLinkedIn

Луи Мендес: GitHubLinkedIn