Я нахожусь в процессе создания API на основе GraphQL (с использованием Java) и пытаюсь оптимизировать его, используя стратегию пакетной обработки данных «DataLoader», что кажется хорошим способом для этого.
Моя основная рекомендация заключается в создании экземпляра «DataLoader» для каждого запроса, как рекомендуется.
Что мне интересно;Где мне разместить экземпляр «DataLoader»?Кажется, у меня есть несколько вариантов:
Создать экземпляр (для каждого типа), сохранить его в «контексте» и использовать его в соответствующем преобразователе.
Плюсы вЭтот подход заключается в том, что сервисный уровень не обращает внимания на «DataLoader», поскольку он представляет собой GraphQL (что-то вроде?).
(предпочтительно) Создайте экземпляр для каждой службы и используйте его при необходимости.
Например, скажем, есть служба с именем CharacterService, и у нее есть несколько методов, которые возвращают «Character», используя уровень данных, приведенный ниже.
Плюсы :
Резолверы не должны искать соответствующий экземпляр в контексте, когда бы они ни были вызваны, подход DataLoader централизован в службе, и "пакетирование""используется за пределами области GraphQL.
Минусы :
Методы служб изменятся с синхронного типа возврата на асинхронный, например:
public Character getCharacter () {...}
// Превращается в:
public CompletableFuture Кроме того, getCharacter () {...}
, если служба будет создана более одного раза, это повлияет на пакетирование / кэширование,так как будут два загрузчика данных, которые делают одно и то же, только с разными кэшами и жизненными циклами.
Гибридный - возьмите службу и создайте другой экземпляр на основе интерфейса службы, который будет использовать вызовы метода составления и делегирования для составной службы, поддерживаемые экземпляром «DataLoader».
Однако это будет трудно поддерживать, поскольку это приведет к увеличению вдвое содержания.
Мне бы хотелось услышать ваши мысли, так как я чувствую, что могуупустить что-то.