Подписка на GraphQL с использованием отправленных сервером событий и EventSource - PullRequest
2 голосов
/ 16 марта 2019

Я рассматриваю реализацию типа «подписки» с использованием отправленных сервером событий в качестве резервного API.

С чем я борюсь, так это с интерфейсом, если быть более точным, с уровнем http такогооперация.

Проблема:

Использование собственного EventSource не поддерживает:

  1. Указание метода HTTP, "GET" используется по умолчанию.
  2. Включая полезную нагрузку (запрос GraphQL)

Пока # 1 неопровержим, # 2 можно обойти с помощью параметров запроса.

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

Решение, о котором я думаю, - это создать выделенную конечную точку для каждого возможного события.

Например: URI для события, представляющего завершенную транзакцию между сторонами:

/graphql/transaction-status/$ID

Будет преобразован в этот запрос на сервере:

subscription TransactionStatusSubscription {
    status(id: $ID) {
        ready
    }
}

Проблемы с этим подходом:

  1. Необходимо добавить создание обработчика для каждого перевода URI-в GraphQL.
  2. Развертывание новой версии сервера
  3. Потеря гибкости, предлагаемой GraphQL -> Клиент должен контролировать запрос
  4. Отслеживать все конечные точки в базе кода (бэк-энд, фронт- конец, мобильный)

Возможно, мне больше не хватает проблем.

Возможно, есть какой-нибудь лучший подход, о котором вы можете подумать?Один из них позволил бы улучшить подход к предоставлению полезных данных запроса с использованием EventSource?

1 Ответ

3 голосов
/ 17 марта 2019

Подписки в GraphQL обычно реализуются с использованием WebSockets, а не SSE. И Apollo, и Relay поддерживают использование subscription-transport-ws на стороне клиента для прослушивания событий. Apollo Server включает встроенную поддержку для подписок, использующих WebSockets. Если вы просто пытаетесь реализовать подписки, было бы лучше использовать одно из этих существующих решений.

Тем не менее, есть библиотека для использования SSE для подписок здесь . Похоже, он больше не поддерживается, но вы можете покопаться в исходном коде, чтобы получить некоторые идеи, если вы стремитесь заставить работать SSE. Глядя на источник, похоже, что автор обошел ограничения, о которых вы упоминали выше, инициализируя каждую подписку запросом POST, который возвращает идентификатор подписки.

...