GraphQL DataLoader - загрузчик на уровне сервисов против каждого резольвера - PullRequest
0 голосов
/ 08 октября 2018

Я нахожусь в процессе создания API на основе GraphQL (с использованием Java) и пытаюсь оптимизировать его, используя стратегию пакетной обработки данных «DataLoader», что кажется хорошим способом для этого.

Моя основная рекомендация заключается в создании экземпляра «DataLoader» для каждого запроса, как рекомендуется.

Что мне интересно;Где мне разместить экземпляр «DataLoader»?Кажется, у меня есть несколько вариантов:

  1. Создать экземпляр (для каждого типа), сохранить его в «контексте» и использовать его в соответствующем преобразователе.
    Плюсы вЭтот подход заключается в том, что сервисный уровень не обращает внимания на «DataLoader», поскольку он представляет собой GraphQL (что-то вроде?).

  2. (предпочтительно) Создайте экземпляр для каждой службы и используйте его при необходимости.
    Например, скажем, есть служба с именем CharacterService, и у нее есть несколько методов, которые возвращают «Character», используя уровень данных, приведенный ниже.

    Плюсы :
    Резолверы не должны искать соответствующий экземпляр в контексте, когда бы они ни были вызваны, подход DataLoader централизован в службе, и "пакетирование""используется за пределами области GraphQL.

    Минусы :
    Методы служб изменятся с синхронного типа возврата на асинхронный, например:

    public Character getCharacter () {...}

    // Превращается в:
    public CompletableFuture Кроме того, getCharacter () {...}

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

  3. Гибридный - возьмите службу и создайте другой экземпляр на основе интерфейса службы, который будет использовать вызовы метода составления и делегирования для составной службы, поддерживаемые экземпляром «DataLoader».

    Однако это будет трудно поддерживать, поскольку это приведет к увеличению вдвое содержания.

Мне бы хотелось услышать ваши мысли, так как я чувствую, что могуупустить что-то.

...