Почему подписки GraphQL используют AsyncIterator?
AsyncIterator
требует извлечения данных с помощью .next()
, Но с веб-сокетами я обычно хочу выдвигать данные, когда происходят события. Единственное, о чем я могу думать, это то, что при использовании pull-based они могут ограничивать скорость.
Так что зовет .next()
? Это таймер, или он слушает опубликованное сообщение, ставит его в очередь, затем вызывает .next()
пока не займёт всю очередь?
Подходит ли это для данных в реальном времени, таких как GPS-позиции на карте?
Посмотрел тут и до сих пор не смог разобраться: https://github.com/facebook/graphql/blob/master/rfcs/Subscriptions.md
Репозиторий подписок GraphQL от Apollo: https://github.com/apollographql/graphql-subscriptions
1 ответ
AsyncIterator
перебрать EventStream
затем каждое событие разрешается когда-нибудь фильтром и / или манипуляциями с полезной нагрузкой.
Манипуляции с полезной нагрузкой могут вызывать другой асинхронный запрос к базе данных или разрешать другие типы graphQL, что отнимает много времени.
Поэтому GraphQL использует систему, основанную на извлечении, для ограничения скорости разрешает eventStream. Если вы не используете withFilter
ни resolves
, у вас не будет задержки на событии, кроме как с большим количеством пользователей.
GraphQL подходит для данных с низкой задержкой.
Источник: https://github.com/graphql/graphql-js/blob/master/src/subscription/subscribe.js#L44