Я использую aws-appsync в клиенте Node.js для хранения кэшированного списка элементов данных. Этот кэш должен быть доступен постоянно, в том числе, когда он не подключен к Интернету.
Когда мое приложение Node запускается, оно вызывает запрос, который возвращает весь список элементов из источника данных AppSync. Это кэшируется кеш-хранилищем Apollo, которое позволяет выполнять будущие запросы (используя тот же запрос GraphQL), используя только кеш.
Приложение также делает подписку на мутации, которые могут изменять список на других клиентах. При изменении элемента в списке новые данные отправляются в приложение. Это может инициировать повторный выбор исходного запроса для всего списка, тем самым поддерживая актуальность кэша.
Получение всего списка, когда изменился только один элемент, неэффективно. Как я могу поддерживать кеш в актуальном состоянии, минимизируя при этом количество данных, которое нужно извлекать при каждом изменении?
Решение должно предоставлять единую точку для доступа к кэшированным данным. Это может быть либо запрос GraphQL, либо прямой доступ к хранилищу кеша. Однако использование результатов нескольких запросов недопустимо.
Документация Apollo указывает на то, что это должно быть возможно:
В некоторых случаях простого использования [автоматических обновлений магазина] недостаточно для правильного обновления приложения. Например, если вы хотите добавить что-то в список объектов без повторной загрузки всего списка ... Клиент Apollo не может обновить существующие запросы для вас.
Альтернативы, которые он предлагает, - это повторное получение (по сути, то, что я описал выше) и использование обратного вызова update
для ручного обновления результатов кэшированного запроса в хранилище.
Использование update
дает вам полный контроль над кэшем, позволяя вносить изменения в модель данных в ответ на мутацию любым удобным вам способом. update
- рекомендуемый способ обновления кэша после запроса.
Однако здесь речь идет о мутациях, сделанных одним и тем же клиентом, а не о синхронизации между клиентами с использованием подписок. Опция обратного вызова update
не доступна для подписки (которая предоставляет обновленные данные элемента) или запроса (который может получить обновленные данные элемента).