SlideShare a Scribd company logo
1 of 73
From Back-end to Front-end
Kiev 2018
GraphQL - удобное API или хайп?
Vladimir Zaets
Kiev 2018GraphQL– удобное API или хайп?
VS
Kiev 2018GraphQL– удобное API или хайп?
Возможность возвращать разные форматы данных
Только JSON Разные форматы
данных. XML, JSON
Kiev 2018GraphQL– удобное API или хайп?
YES NO
Объем и структура
данных жестко
определенна на сервере
Возможность формировать структуру и объем
данных на клиенте
Kiev 2018GraphQL– удобное API или хайп?
C R U DR
QUERY
MUTATION
Для операции «Читать»
Для операций «Создать», «Обновить», «Удалить»
GET
POST
PUT
DELETE
Kiev 2018GraphQL– удобное API или хайп?
Конструкции и возможности языка
Kiev 2018GraphQL– удобное API или хайп?
Variables and Parameters
Декларация переменной.
Задается в JSON формате.
Передаем переменную “key” в качестве
аргумента указывая тип данной
переменной, в данном случаи “String ”.
Kiev 2018GraphQL– удобное API или хайп?
Variables and Parameters
Значение по умолчанию
Kiev 2018GraphQL– удобное API или хайп?
Aliases and Fragments
Kiev 2018GraphQL– удобное API или хайп?
Aliases and Fragments
Aliases
Kiev 2018GraphQL– удобное API или хайп?
Aliases and Fragments
Aliases
Kiev 2018GraphQL– удобное API или хайп?
Aliases and Fragments
Фрагменты представляют собой набор
полей которые которые можно
переиспользовать
Kiev 2018GraphQL– удобное API или хайп?
Directives
Kiev 2018GraphQL– удобное API или хайп?
Date in database: 1522269610866 (timestamp)
@dateFormat(format: “DD-MM-YYYY”)
Query result 28.03.2018
@upperCase
@hasScope(scope: [“read:rating”])
@isAuthenticated
@hasRole(role:[“admin:”])
@log
@price(locale:”en_US”)
Kiev 2018GraphQL– удобное API или хайп?
Directives
Directives
Kiev 2018GraphQL– удобное API или хайп?
DirectiveLocation. QUERY
DirectiveLocation.INLINE_FRAGMENT
DirectiveLocation.FRAGMENT_SPREAD
Kiev 2018GraphQL– удобное API или хайп?
https://github.com/lirown/graphql-custom-directive
Kiev 2018GraphQL– удобное API или хайп?
GraphQL Interfaces
Interface declaration Interface implementation
Kiev 2018GraphQL– удобное API или хайп?
GraphQL Interfaces
Request Response
Kiev 2018GraphQL– удобное API или хайп?
GraphQL Interfaces
Request Response
Kiev 2018GraphQL– удобное API или хайп?
Union types
Request Response
Kiev 2018GraphQL– удобное API или хайп?
Проблемы GraphQL
Kiev 2018GraphQL– удобное API или хайп?
• Дублирование схемы
• Несоответствие данных
• N+1
• Кэшированием
• Загрузка файлов
• Версионирование
Kiev 2018GraphQL– удобное API или хайп?
Дублирование схемы
SCHEMA
VS
SCHEMA
SCHEMA
SCHEMA
Etc.
Kiev 2018GraphQL– удобное API или хайп?
Kiev 2018GraphQL– удобное API или хайп?
• Конвертирует Postgres схему в GraphQL
• Имеет watch режим, позволяет следить за
изменением в Postgres схеме
• Позволяет считывать комментарии к
таблицам postgres и преобразовывать в поле
description в GraphqQL
Kiev 2018GraphQL– удобное API или хайп?
Генерирует CRUD для вашего типа.
Использует NDF формат для импорта
и экспорта в БД
Kiev 2018GraphQL– удобное API или хайп?
Несоответствие данных на клиенте и сервере
Kiev 2018GraphQL– удобное API или хайп?
На клиенте
На сервере
Kiev 2018GraphQL– удобное API или хайп?
Запрос посредством функции GraphQL
Kiev 2018GraphQL– удобное API или хайп?
Используя функцию runQuery и queryOne фреймворка VulcanJS
Kiev 2018GraphQL– удобное API или хайп?
Проблема N+1 / Избыточные
обращения к базе данных
Kiev 2018GraphQL– удобное API или хайп?
N+1
Kiev 2018GraphQL– удобное API или хайп?
Query
Query
Query
DB
Kiev 2018GraphQL– удобное API или хайп?
DB
Queue
Query item
Query item
Query item
Query item
Batching
Single query
Batching использует временные интервалы.
Batching работает на основе «тиков» -
проверяя очередь на наличие ожидающих
запросов каждые N миллисекунд. Если в
очереди есть несколько запросов, они
объединяются в один.
Kiev 2018GraphQL– удобное API или хайп?
DataLoader
https://github.com/facebook/dataloader
Kiev 2018GraphQL– удобное API или хайп?
Низкая производительность /
кэширование
Network Caching
Kiev 2018GraphQL– удобное API или хайп?
Kiev 2018GraphQL– удобное API или хайп?
Server Caching: Кэшируем результаты запросов в БД
Kiev 2018GraphQL– удобное API или хайп?
Client Caching: Кэшируем граф как список
Запись ответа в кэш
Запрос Ответ
Kiev 2018GraphQL– удобное API или хайп?
Загрузка файлов
Kiev 2018GraphQL– удобное API или хайп?
• Загружать с помощью других API и передавать ссылку на загруженный файл в
мутацию GraphQL.
• Использовать multipart/form-data. Передавая данные в контексте резолвера.
Kiev 2018GraphQL– удобное API или хайп?
Библиотеки для загрузки файлов
• NPM graphql-server-express-upload
• Apollo apollo-upload-client
Kiev 2018GraphQL– удобное API или хайп?
Версионирование GraphQL API
Kiev 2018GraphQL– удобное API или хайп?
http://domain/api/v2.2/
Kiev 2018GraphQL– удобное API или хайп?
GraphQL Security
Kiev 2018GraphQL– удобное API или хайп?
• Неограниченный уровень вложенности
• Запросы высокой сложности
• Слишком большое количество запросов
Kiev 2018GraphQL– удобное API или хайп?
Максимальная глубина запроса
Kiev 2018GraphQL– удобное API или хайп?
Максимальная глубина запроса
Kiev 2018GraphQL– удобное API или хайп?
Максимальная глубина запроса
Maximum Query Depth = 3
Depth: 0
Depth: 1
Depth: 2
Depth: 3
Kiev 2018GraphQL– удобное API или хайп?
Kiev 2018GraphQL– удобное API или хайп?
Сложность запросов
Kiev 2018GraphQL– удобное API или хайп?
Complexity: 1
Complexity: 5
Complexity: 1
Query Complexity = 7
Max Query Complexity = 100
Kiev 2018GraphQL– удобное API или хайп?
Kiev 2018GraphQL– удобное API или хайп?
Throttling
Kiev 2018GraphQL– удобное API или хайп?
Throttling на основе:
Времени выполнения
Сложности запросов
Throttling на основе времени выполнения
Kiev 2018GraphQL– удобное API или хайп?
Время выполнения: 100 Ms
Максимальное время выполнения сервером
(Bucket size) = 1000ms
Kiev 2018GraphQL– удобное API или хайп?
Throttling на основе сложности запроса.
Complexity: 1
Complexity: 1
Complexity: 1
Query Complexity = 3
Максимальная сложность: 15
Kiev 2018GraphQL– удобное API или хайп?
Таймаут
Kiev 2018GraphQL– удобное API или хайп?
GitHub API example
Kiev 2018GraphQL– удобное API или хайп?
Ограничение в получении данных с коллекции
Kiev 2018GraphQL– удобное API или хайп?
• Limit – максимальное количество баллов в час
• Cost – количество баллов текущего запроса
• Remaining – остаточное количество баллов
• ResetAt – время до сброса состояния
Kiev 2018GraphQL– удобное API или хайп?
Цена запроса: 6
Kiev 2018GraphQL– удобное API или хайп?
1
30
600
631 / 100 = 6,…..
Kiev 2018GraphQL– удобное API или хайп?
Kiev 2018GraphQL– удобное API или хайп?
Pagination
Kiev 2018GraphQL– удобное API или хайп?
Сursor based pagination
PRODUCT 1
PRODUCT 2
PRODUCT 3
PRODUCT 4
PRODUCT 5
PRODUCT 6
PRODUCT 7
У PRODUCT2
cursor:
W29iamV=
Kiev 2018GraphQL– удобное API или хайп?
Sorting and filtering
Kiev 2018GraphQL– удобное API или хайп?
Дополнительный параметр sort у
которого поля:
”field” – поле по которому будет
выполнятся сортировка.
”order”- порядок сортировки.
Фильтрация выполняется
по sku продукта.
Kiev 2018GraphQL– удобное API или хайп?
Гибкая фильтрация с
применением OR и AND
Kiev 2018GraphQL– удобное API или хайп?
В каких случаях стоит использовать GraphQL?
• При использовании микросервисной
архитектуры.
• При разработке простого API.
• При разработке платформы/сервиса которая
рассчитан на интеграцию с другими
системами/приложениями.
• Если команды размещены в разных локалях.
(сложность коммуникации)
• При использовании только одного ресурса
предоставления данных.
• При условии что вы разрабатываете
финальный продукт не рассчитанный на
дальнейшее развитие в ближайшем времени.
(Интернет-магазины, промо сайты, т.д)
Kiev 2018GraphQL– удобное API или хайп?
• GraphQL Voyager - визуально представляет GraphQL API в
виде интерактивного графа.
https://github.com/APIs-guru/graphql-voyager
• GraphCMS - создание, редактирование GraphQL контента.
https://graphcms.com/
• GraphQL Docs – позволяет создать статическую
документацию на основе вашего API.
https://github.com/2fd/graphdoc
• GraphQL Faker – позволяет подменять данные вашего API.
Полезно для тестирования.
https://github.com/APIs-guru/graphql-faker
• Optics – метрики запросов в GraphQL API.
https://www.apollographql.com/engine/
Kiev 2018GraphQL– удобное API или хайп?
Any questions?
The end.  Thank You.
Vladimir Zaets
https://github.com/VladimirZaets
https://www.linkedin.com/in/vladimir-zaets-22b2149a/
https://www.facebook.com/vladimir.zaets.75

More Related Content

Similar to JS Fest 2018. Владимир Заец. GraphQL - удобное API или хайп?

WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...WebCamp
 
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...GeeksLab Odessa
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013Roman Pavlushko
 
Анализируем результаты тестирования производительности с Graphite и Grafana
Анализируем результаты тестирования производительности с Graphite и GrafanaАнализируем результаты тестирования производительности с Graphite и Grafana
Анализируем результаты тестирования производительности с Graphite и GrafanaSQALab
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенPyNSK
 
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)Ontico
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vwИлья Трофимов
 
Илья Трофимов - машинное обучение с помощью vw
Илья Трофимов - машинное обучение с помощью vwИлья Трофимов - машинное обучение с помощью vw
Илья Трофимов - машинное обучение с помощью vwPavel Mezentsev
 
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...Iosif Itkin
 
Мастер класс Google analytics api и скрипты google docs spreadsheets
Мастер класс Google analytics api и скрипты google docs spreadsheetsМастер класс Google analytics api и скрипты google docs spreadsheets
Мастер класс Google analytics api и скрипты google docs spreadsheetsOleg Rudakov
 
ITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковEYevseyeva
 
Система мониторинга производительности своими руками (QA Fest 2016)
Система мониторинга производительности своими руками (QA Fest 2016)Система мониторинга производительности своими руками (QA Fest 2016)
Система мониторинга производительности своими руками (QA Fest 2016)Alexander Nedeliaev
 
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QAFest
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...Vyacheslav Nikulin
 
Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"Yandex
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...ADLABS
 

Similar to JS Fest 2018. Владимир Заец. GraphQL - удобное API или хайп? (20)

WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
 
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...
Java/Scala Lab: Владимир Илюшенко - Jelastic PaaS v2.5 Capabilities and Benef...
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
 
Анализируем результаты тестирования производительности с Graphite и Grafana
Анализируем результаты тестирования производительности с Graphite и GrafanaАнализируем результаты тестирования производительности с Graphite и Grafana
Анализируем результаты тестирования производительности с Graphite и Grafana
 
JSON-RPC
JSON-RPCJSON-RPC
JSON-RPC
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw
 
Илья Трофимов - машинное обучение с помощью vw
Илья Трофимов - машинное обучение с помощью vwИлья Трофимов - машинное обучение с помощью vw
Илья Трофимов - машинное обучение с помощью vw
 
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...
TMPA-2013 Senov: Applying OLAP and MapReduce Technologies for Performance Tes...
 
Мастер класс Google analytics api и скрипты google docs spreadsheets
Мастер класс Google analytics api и скрипты google docs spreadsheetsМастер класс Google analytics api и скрипты google docs spreadsheets
Мастер класс Google analytics api и скрипты google docs spreadsheets
 
ITmozg, Даниил Павлючков
ITmozg, Даниил ПавлючковITmozg, Даниил Павлючков
ITmozg, Даниил Павлючков
 
Система мониторинга производительности своими руками (QA Fest 2016)
Система мониторинга производительности своими руками (QA Fest 2016)Система мониторинга производительности своими руками (QA Fest 2016)
Система мониторинга производительности своими руками (QA Fest 2016)
 
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
QA Fes 2016. Александр Неделяев. Система мониторинга производительности своим...
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
 
Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"Фёдор Голубев "API Яндекс.Карт"
Фёдор Голубев "API Яндекс.Карт"
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...
Олег Рудаков "Google analytics api и скрипты google docs получение автоматизи...
 

More from JSFestUA

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJSFestUA
 
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJSFestUA
 
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JSFestUA
 
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JSFestUA
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
 
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JSFestUA
 
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJSFestUA
 
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JSFestUA
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JSFestUA
 
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJSFestUA
 
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JSFestUA
 
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JSFestUA
 
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJSFestUA
 
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJSFestUA
 
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJSFestUA
 
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJSFestUA
 
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JSFestUA
 
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJSFestUA
 
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJSFestUA
 
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JSFestUA
 

More from JSFestUA (20)

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
 
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
 
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
 
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
 
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
 
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstack
 
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
 
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
 
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
 
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
 
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
 
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
 
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
 
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
 
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
 
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
 
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
 
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
 

JS Fest 2018. Владимир Заец. GraphQL - удобное API или хайп?

Editor's Notes

  1. Первая проблема GraphQL это дублирование схемы. Не важно какую базу данных мы используем sql или nosql мы всегда должны декларировать схему для базы данных и для самого Graphql.Основная проблема даже не в том что вам несколько раз придетсяописсывать очень схожие схемы, а в том что вам нужно будет ихпостоянно синхронизировать, поддерживает в консистентном состоянии.
  2. И так какие есть варианты решения данной проблемы. Первый и самый явный это написать свой конвертер/генератор схемы, которыйсформирует схему для вашей БД из схемы Graphql, либо же обратно из схемы GraphQL схему вашей БД. У меня в проекте к примеру мы используем XML для декларации схемы. Так же вы можете воспользоватся одной из библиотек/фреймворков которые сделают это за вас.
  3. Для начала рассмотрим PostGraphql и PostGraphile.Это одна и та же утилита которые пережила переименование с PostGraphqlв PostGraphile.Данная утилита конвентирует схему Postgres в схему GraphQL.У нее есть довольно много настроек, она может сама запускать Graphql сервер на основе схемы Postgres базы, то есть выступатькак отдельный сервис так может быть внедрена в ваш GraphQL сервер,так же она имеет watch режим, то есть следит за изменением Postgres схемы, считывает комментарии к таблицам постргесс и переносит в поле дескрипшин графкл апи.
  4. Далее Prisma, позиционирует себя как realtime GraphQL database layer,то есть база данных для Graphql которая генерируется в реальном времени.Довольно похожа по своей работе на postgraphql но она работает в обратном направлении. Если postgraphql генерирует graphql схему основываясь на postgres схему то prisma генерирует схему базы данныхосновываясь на схему GraphQL задекларированую в формате SDL (Schema Definition Language).Prisma поднимает БД либо локально используя Docker (он должен быть у вас установлен) либо на своем сервисе, что для меня являетсяминусом, т.к мы не имеем возможность как либо влиять на БД. В качествеБД используется mysql, возможности выбора другой нет. Однако естьвозможность загружать предустановленные данные, импортировать и експортироватьданные с БД используя NDF формат. Так же очень важно то что можно использовать призму для генерации типов.Мы обьявляем тип, а призма генерирует CRUD операции для него.Graphcool является фрейворком построенным на основе призмы.Так же на сколько я слышал призма уже имеет и облачный сервис.
  5. Вторая проблема это "Несоответствие данных на клиенте и сервере"
  6. Допустим мы хотим получить имя автора поста.Для этого нам нужно получить сущность поста.На клиенте обращаясь к GraphqlAPI мы получим обьект пост который содержитинформацию о пользователи.На стороне сервера сущность поста не содержит данных о пользователе кромекак его идентификатор. И соответсвенно из колекции пользователей нам нужно будет выбрать пользователя под таким id и у сущности пользователя взять свойствоимени.В этом и состоит несоответствие данных.С одной стороны это логично, с другой, почти такой же код выполняетсяв резолвере Graphql API, так почему не обращатся напрямую к Graphql APIServer to Server.
  7. Как это делается.Первый вариант это использовать непосредственно функцию GraphQL. В неё нужно передать саму схему и запрос, так же можно передать значение по умолчанию контекст и переменные.
  8. При создании GraphQL сервера вы будете использовать фреймворк или библиотекии велика вероятность того что они будет содержать какой либо врапернад этой функцией для упрощения использования. В качестве примера я добавил функции runQuery и queryOne фреймворка VulcanJS. При их исиользовании вам нужно лишь передать саму квери, и параметрыкоторые нужны для запроса, а если не нужны то просто квери.
  9. Cледущая одна из найболее серезных проблем это избыточность обращенийк БД, то есть проблема N+1
  10. Допустим мы хотим получить имя продавца каждого продукта в определеннойкатегории. Довольно частый кейс. И в таком довольно простом примеремы уже имеем N+1 проблему.
  11. Давайте посмотрим результат выполнения запроса и как он формировался.Мы получаем коллекции продуктов и имя продавца для каждого из них, вполне ожидаемый вариант. Но как собирался данный ответ? происходило одно обращение в БД для полученияколекции продуктов, и еще 3 для получения имени продавца для каждого продукта.В данном случаи для того что бы собрать этот ответ потребовалось 4 обращения в бд.Cобственно N это количество айтемов в колекции. Если бы в нашем случаи было100 продуктов, то мы обратились бы раз что бы получить колекцию и 100 раз для получения имени продавца для каждого продукта, и того произошло б 101 обращениек базе данных.
  12. Как это решается? А решается это используя Batching. Batching работает на основе «тиков» - проверяя очередь на наличие ожидающих запросов каждые N миллисекунд. Если в очереди есть несколько запросов, они объединяются в один.В нашем случаи как мы видим, запрос на получения имени продавка каждого продукта складываются в очередь, и через N миллисекунд, когда отработаеточередной Batching тик, все что находится в очереди обьединяется и происходит всего одного обращения к БД.
  13. Реализация батчинга довольно сложная задача, особенно на некоторыхязыках, к счастью фейсбук позоботился об этом, и выпустил библиотекуdataLoader на плечи которой и перекладыватся Batching и частично кэширование.Реализация библиотеки есть на многих языках и работает она так же хорошо.Было проверено помимо NodeJS само собой, на PHP в которой посмтроенана колбеках что не свойственно для пхп.
  14. Следущая проблема это низкая производительность, а именно проблемыс кешированием.
  15. Сначала поговорим про сетевое кэширование.Сетевое кэширование с GraphQL невозможно.Используя Graphql API как мы уже знаем у нас фактически одна точка вхождени,один ендпоинт, таким образом мы не можем использовать кэширование на уровне сети, то есть использовать такие сервисы как варниш, фастли и другие,т.к они работают по принципу перехвата запроса на сетевом уровне,проверяют есть ли данные в кэше по текущей точке вхождения и если естьи возвращают данные, так и не проксируя запрос на сервер.соответсвенно это не подходит для GraphQL.
  16. С стороны сервера мы должны кешировать результаты обращений к самой БД. Сохраняя в виде плоского списка запрос как ключ и ответ как значение,ну это в самой простой имплементации.
  17. Теперь про кеширование на клиентеС Graphql API нужно кешировать каждое поле отдельно отражая графо-подобную структуру в виде списка. Давайте рассмотрим пример, у нас есть запрос у которого есть поле "product" у него есть поле "created_by" и у него поле нейм. Простой grqphql запрос. Мы кешируем все поля корневого типа в виде списка. В данном случаи product(id: "1").Первый айтем в списке содержит поле тайтл которое имеет скалярное значение и ссылку на второй аймет который представляет собой поле created_by. Поле created_by сохраняется как отдельный айтем в листе т.к это поле содержит значение сложно типа.
  18. Следущая проблема это загрузка файлов с помощу GraphQL API.Про загрузку файлов через GraphQL API в документации ничего не сказано, как же её реализовать?
  19. Первый самый простой способ это загружать файлы через другиетипы API, например REST и передавать ссылку на загруженый файлв мутацию Graphql.Второй способ, который используют большенство библиотек и фреймворковэто используя multipart/form-data. Мы считываем мультипарт дату с реквеста и передаем в качестве контекста в резолвер. Ну и с резолвера мы уже можем производить любые манипуляции с файлом, загрузить на CDN или что то еще.
  20. Как я уже говорит, что второй подход реализованы во многих библиотеках и фреймворках, например в apollo, либо же использовать midlware для NodeJS.
  21. Следущая проблема которую мы рассмотрим это версионирование API.
  22. В REST API мы привыкли добавлять версию непосредственно в url ендпойта.GraphQL как таковой не пропогандирует версионирование своего API,обьясняя это тем что клиент сам запрашивает нужные ему данныеи мы можем без учета версий расширять существующие типы.И многие считают это огромным плюсом что GraphQL API не нужно версионировать.Но вполне реальные случаи когда API меняется по 30 раз в неделю, и помимо разширения нам может быть нужно помунять интерфейссуществующих полей, например изменмить набор входящих аргументов,либо возвращаеймые данные или что угодно еще. Кейс возможно не частый но вполне возможный.Что мы можем сделать? Все что нам позволяет GraphQL это пометитьполе как deprecated написать причину, и разширить тип добавляя новое практически аналогичное поле с новым интерфейсом.Но с таким подходом API будет безгранично разширятся практически аналогичными полями. Далеко даже не факт что пользователи API заметят,что поле которые они используют стало депрекейтед, не смотря на точто в возвращаеймые данные будет добавлены свойства isDeprecated и deprecatedReason. С стандартным версионированием в REST такой проблемы нет, пользователи API могут быть уверены что версия API которую они используют останется без изменений.
  23. Далее давайте поговорим про security в graphql API.
  24. Далее давайте поговорим про security в graphql API.
  25. дальше и поговори про блемлему с максимальной глубиной запроса.
  26. Тк структура запроса формируется на стороне клиента то мы можем написать подобный запрос с не ограниченой вложеностю. Конечно такого допускать мы не должны.
  27. Для этого нам нужно указать, какую глубино вложености можно использовать. В данном случаи, допустим что мы указали maximym query depth 3, это значит что если у нас будет такой запрос как представлен выше уже не валидный, все что отмечено красным уже не валидная часть.
  28. Реализовать ограничение вложености мы можем использую библиотеку graphql-depth-limit. Конкретно эта библиотека работает с express и Koa graphql, но я уверен наверняка что существуют и другие и не только для NodeJS. Использовать в данном случаи её довольно просто, мы передаем в массив validationRules, функцию dephLimit которая предоставляет библиотека, и указываем какую глубино вложености мы позволяем. Так же она конечно содержить более гибкие настройки, можете посмотреть её API на гитхабе
  29. Но как мы понимаем, проблемными запросы могут быть не только глубокого уровня вложености, но если у нас и на одном уровне обьявлено много тяжелых запросов.
  30. Как нам дать понять приложению что запрос тяжелый. Допустим у нас такой простой запрос, давайте скажем что по умолчанию что получения любого поля в API это complexity 1. При этом мы указываем максимальную комплексити для одного запроса, допустим 100. Здесь конечно тяжело подобрать оптимальную complexity для вашего приложения, это зависит от многих факторов, если интерестно есть достаточно много статей по расчету сложности запроса. И далее, у нас представлено поле operations, и допустим мы знаем что для получения этого поля нам нужно достаточно много ресурсов, и конкретно для этого поля мы можем указать complexity вы, в данном случаи 5 и общая сложность запроса у нас будет являться 7. Соответсвенно при отправке такого запроса, будет произведена статическая проверка, то есть запросы в БД не будут отправлятся до того момента как не пройдет успешно статическая проверка, в данном случаи она пройдет успешно, т.к максимальное комплексити указано 100, а у нашем запросе всего 7, и только после этого будут происходить обращения к БД для получения данных по полям. Основной проблемой данного подхода является что что значения complexeti являются абстрактными, их практически непозможно просчитать точно, можно к примеру отталкиватся на время выполнения запроса, но это тоже довольно абстрактно.
  31. Для того что бы это имплементировать вы опять таки можете воспользоватся библиотекой. Мы указываем максимальную комплексити запроса, и так же мы можем указать значение по умолчанию как для скалярных полей, Так и для обьектов и списков. Далее передаем результат выполнения в массив валидейшн рулс. И используем директивы в определении типов для того что бы указать значение комплексити для определенного поля.
  32. Подходы с ограничением вложености и ограничением по сложности запроса смогут оберечь нас от слишком сложных и большых запросов, но тем не мениее не сможет уберечь нас от количества запросов которые отправляются на наш сервер. И для того что бы уберечся от слишком большого количества запросов мы можем использовать тротлинг подход.
  33. Данный подход позволит ограничит количество запросов опираясь либо на времени выполнения либо на сложности выполнения запросов.
  34. Давайте посмотрим пример на основе времени. Допустим у нас есть простой запрос. Предположим что время выполнения запроса равняется 100мс. Далее мы указываем какое количество серверного времени в опреленное время мы отдаем на обработку запросов для клиента. Допустим мы говорим что мы позволяем использовать 1000мс серверного времени в минуту. Таким образом клиент может отправить 10 таких запросов в минуту, после чего сервер будет отвергать все последущие запросы. Основная проблема что время выполнения запроса еще более относительная величина. По этому мы можем построить тротлинг на основе сложности запроса.
  35. В таком случаи мы ограничиваем по определенному комплексити сложность одного запроса, опредилив максимальное значение и так же мы определим значение максимальной сложности запросов относительно времени. К примеру, максимальная комлексити это 15 в минуту, таким образом клиент сможет отправить только 5 таких запросов за одну минуту, дальнейшие будут блокироватся. Таким образом мы мы миксуем подход с ограничение сложности для одного запроса и ограничеим по сложности относительно времени.
  36. И первое что вам конечно нужно реализовать это ограничения по таймауту. То есть если запрос выполняется слишком длительное количество времени мы должны оборвать его выполнения и вернуть ошибку. С этим думаю понятно, давайте пойдем
  37. Давайте немного посмотрим на GraphQL API, наверное вы знаете что гитхаб имеет graphql api, это 4 версия, но они одновременно поддержуют и активно обновляют 3тию REST версию API. Давайте посмотрим какие ограничение накладывает Github на свое API, для безопасности.
  38. И первое ограничение это ограничение на возможность получать более 100 айтемов из коллекции. Если мы попросим 1000 елементов то как видим мы получаем ошибку.
  39. Гитхаб апи иммет ограничение по комплексити, 5000 в час. Вместе с запросом на поучения данных мы можем запросить данные о текущем состоянии. Деларируем поле rateLimit Который содержит поля limit – которое говорит про комплексити в час Кост – количество баллов сложность текущего запроса Remaining – остаточное количество баллов сложности ResetAt – время до сброса состояния, когда нам гитхаб снова выдаст очки сложности
  40. Вот например такой запрос будет иметь цену 6.
  41. Но давайте разберемся как гитхаб считает. Гитхаб считает по 1 балу за запрос. То есть для получения полекции оранизаций мы получим мы используем всего 1 бал. Далее мы хотим получить мемберов из каждой организации, и того у нас получается 30 вариаций, и мы тратим 30 балов. Далее мы хотим получить фоловером, для каждого из 20 мемберов из каждой организации. И того 30 организаций мы умножаем на 20 мемберов для того что бы учесть все вариации, и того мы получим 600 балов. Сумируем их и получаем 631, затем эту сумму делим на 100 и получаем 6, это и есть стоймость текущего запроса. Значения округляются до целого числа. Таким образом мы можем отправить около 830 таких запросов в час.
  42. Ну и вот к примеру реальный запрос, который отправляет одна из наших утилит которая работает с гитхаб апи. В данном случаи гитхаб отпадает по таймауту. Выполняется этот запрос успешно только если мы будем запрашивать не 100 а 50 айтемов.