Size: a a a

GraphQL — русскоговорящее сообщество

2018 November 06

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Kirill Nesmeyanov
причём ответ для резолвера подписчика и обычной квери в коде вообще не отличается
я знаю) мы делали raw subscriptions голыми руками)
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
в стандарте - делаешь подписку и в ответ должен прилететь ответ на этот запрос (тавталогия негодуэ)
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
ну так gql работает
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
просто этот ответ, в полном его виде может ещё и обновляться
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
обновление - это всего лишь оповещение, что по какому-то пути новые данные
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
например по user.friends в пуле этих данных (т.е. новый список друзей)
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
а дальше отдаётся то, что и так есть внутри пула (включая новые данные)
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
я доступно объяснил?)
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
Но опять же "почти" - означает, что надо сделать вид, что обновление этого списка "friends" пришло из резолвера, а не из пула данных. Т.к. резолвер ещё и сериализует, и валидирует и прочее, а мне этого пока не удалось добаиться.
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
Kirill Nesmeyanov
Но опять же "почти" - означает, что надо сделать вид, что обновление этого списка "friends" пришло из резолвера, а не из пула данных. Т.к. резолвер ещё и сериализует, и валидирует и прочее, а мне этого пока не удалось добаиться.
Ну вот тут два подхода:
— либо ты отсылаешь ивент с __typename + id того что изменилось, а в резолвере делаешь запрос в БД:
в таком случае в БД на один ивент обновления чего-то может отослаться 10000 запросов, если будет 10000 подписок.
В твоем случае из всех резолверов придет 10000 запросов в пул (redis или что у тебя там)
— либо во время ивента вычислять и отправлять полный набор необходимых данных для всех резолверов (тупо ссумируешь все поля и данные, в которых нуждаются ВСЕ подписчики) и уже в резолверах graphql отфильтрует то что нужно отправить
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
во втором случае непонятно как будут работать запросы с сортировкой, например
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
если разные клиенты хотят данные с разной сортировкой
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
в общем все это очень сложно)
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
было бы круто подписки с одинаковым контекстом (аргументы, права пользователя) стакать в один резолвер
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
чтобы 1000 юзеров, которые подписались на одни и те же данные с одними и теми же аргументами породили только один запрос в пул
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
graphql под ноду из коробки это не позволяет делать
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
может я что-то упускаю
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
Maxim Makarov
Ну вот тут два подхода:
— либо ты отсылаешь ивент с __typename + id того что изменилось, а в резолвере делаешь запрос в БД:
в таком случае в БД на один ивент обновления чего-то может отослаться 10000 запросов, если будет 10000 подписок.
В твоем случае из всех резолверов придет 10000 запросов в пул (redis или что у тебя там)
— либо во время ивента вычислять и отправлять полный набор необходимых данных для всех резолверов (тупо ссумируешь все поля и данные, в которых нуждаются ВСЕ подписчики) и уже в резолверах graphql отфильтрует то что нужно отправить
Да не надо ничего отсылать, т.к. эти данные и так есть внутри пула
источник

KN

Kirill Nesmeyanov in GraphQL — русскоговорящее сообщество
и запросы никакие делать не надо
источник

MM

Maxim Makarov in GraphQL — русскоговорящее сообщество
а еще по хорошему знать к какому из 300 инстансов подключен твой клиент и только на этот инстанс отправлять обновление, а не на все инстансы
источник