Я бы порекомендовал использовать движок Apollo для наблюдения за тем, что на самом деле происходит с каждым запросом, как вы можете видеть на следующем снимке экрана:
вы можете добавить его в свойКонфигурация сервера Apollo
engine: {
apiKey: "service:xxxxxx-xxxx:XXXXXXXXXXX"
},
Кроме того, я почувствовал более высокую производительность при определении значения defaultMaxAge на контроле кэша:
cacheControl: {
defaultMaxAge: 300, // 5 min
calculateHttpHeaders: true,
stripFormattedExtensions: false
},
другая вещь, которая может помочь, - это увеличить максимальный кэш.Устаревание сшитых объектов, если это имеет смысл, вы можете сделать это, добавив подсказки кеша в распознаватель сшивания схемы:
mergeSchemas({
schemas: [avatarSchema, mediaSchema, linkSchemaDefs],
resolvers: [
{
AvatarFlatFields: {
faceImage: {
fragment: 'fragment AvatarFlatFieldsFragment on AvatarFlatFields { faceImageId }',
resolve(parent, args, context, info) {
info.cacheControl.setCacheHint({maxAge: 3600});
return info.mergeInfo.delegateToSchema({
schema: mediaSchema,
operation: 'query',
fieldName: 'getMedia',
args: {
mediaId: parseInt(parent.faceImageId),
},
context,
info,
});
}
},
}
},
Наконец, использование dataLoaders может значительно ускорить обработку запросов, когдавключив пакетную обработку и кэширование загрузчиков данных, читайте больше на их github, и код будет выглядеть примерно так:
public avatarLoader = (context): DataLoader<any, any> => {
return new DataLoader(ids => this.getUsersAvatars(dataLoadersContext(context), ids)
.then(results => new Validation().validateDataLoaderArrayResults(ids, results))
, {batch: true, cache: true});
};