У меня есть схема GraphQL, аналогичная следующей.В одном Браво есть несколько Альф, и каждый из них имеет ссылку друг на друга.(Браво может получить свои Альфы, а Альфа может получить свои Браво.)
type Alpha {
id: ID!
value: Int!
bravo: Bravo!
}
type Bravo {
value: Int!
alphas: [Alpha!]!
}
input InputAlpha {
value: Int!
}
type Mutation {
putAlpha(alpha: InputAlpha): Alpha!
}
schema {
mutation: Mutation
}
Как вы можете сказать, оба типа имеют значение.Значение Альфа произвольно, но значение Браво является суммой связанных с ним Альф.По причинам производительности (и стоимости) значение Bravo кэшируется в таблице DynamoDB и изменяется при каждом обновлении Alpha.
Альфы обновляются с помощью простого распознавателя AppSync DynamoDB PutItem
, при этом предполагается, чтозначение его Bravo будет обновлено лямбда-функцией, наблюдающей за потоком таблицы.Это работает хорошо по большей части;Я могу поставить Альфы со случайными значениями, и я могу получить значение их Браво.
Проблема возникает, когда я пытаюсь запросить значение Браво в том же запросе.(Функция Lambda требует некоторого времени для обновления из потока.)
mutation putAlpha {
putAlpha(alpha: {
value: 10
}) {
id
value
bravo {
value
}
}
}
Естественно, это возвращает старый кешированный value
из bravo
, потому что функция Lambda не была запущена к тому времениБраво разрешено.
Есть ли способ дождаться срабатывания лямбда-функции потока DynamoDB перед разрешением bravo
или, возможно, сделать операцию PutItem
синхронной?
Единственная альтернатива IМожно подумать о том, чтобы сделать putAlpha
распознаватель лямбда-функцией вместо простого распознавателя и выполнить там логику обновления Bravo.
Является ли этот тип лямбды непрерывным обновлением значения кэша нормальным, или я делаю это?что-то не так?