Как реализовать кеширование для Angular SPA

Я разрабатываю приложение Angular 7 с бэкэндом в ядре ASP.NET. Приложение размещено в службе приложений Azure, и там же находится база данных SQL. Я заметил, что есть некоторые таблицы, которые меняются редко, например, таблица стран, но, с другой стороны, мне нужно часто использовать их в моем SPA. Интересно, какое решение для кеширования подошло бы моему случаю.

Пока ничего конкретного не пробовал. Насколько я понимаю, если я кэширую страны на стороне SPA, я не смогу получить доступ к недавно добавленным (что происходит время от времени), пока пользователь не перезагрузит страницу и приложение не перезапустится. Я знаю, что такая услуга, как Redis cache, решит проблему, но это довольно дорого. Поскольку служба приложений Azure может масштабироваться, я также не могу использовать такие решения, как SignarR. Я думал об использовании push-уведомлений, например, https://www.telerik.com/blogs/push-notifications-in-asp-net-core-with-angular

Я хотел бы услышать, прав ли я в своих опасениях и какое решение является рекомендуемым, с плюсами и минусами, пожалуйста :)


comment
Как насчет кеширования вывода? docs.microsoft.com/en- us / aspnet / core / performance / caching /   -  person umutesen    schedule 17.04.2019
comment
@UmutEsen Что ж, это некоторая возможность, так как это спасает меня от попадания в БД. Однако мне потребуется, чтобы мой спа-центр перезванивал бэкэнду каждый раз, когда мне нужны страны. Можете ли вы сказать по своему опыту, справедливы ли перечисленные мной опасения? Я новичок в разработке веб-приложений.   -  person Misza    schedule 17.04.2019


Ответы (1)


Я считаю, что у вас есть вызов API Dot net core для получения списка стран. На мой взгляд, вы должны кешировать вызов API, который фактически получает список стран.

Несмотря на то, что все приложения управляются данными и выглядят очень динамично, то, что действительно менялось в одном и том же пользовательском сеансе, было не так уж и много, но мы все равно делали http-запросы на новый контент.

Самое простое решение - кеширование. Кеширование где? На сервере? но это не мешает всем нашим приложениям работать с нашими сервисами и, таким образом, - увеличивать нагрузку на них.

Может быть, мы могли бы использовать сервис-воркер, поскольку он позволяет кешировать вызовы API? Да, это был один из вариантов, поскольку он уже имеет довольно хорошую интеграцию с Angular и позволяет использовать простое решение для выборочного кеширования ресурсов и API. Однако мы хотели иметь возможность не только выбирать, что кэшировать, но и когда это делать.

Фактически мы можем кэшировать все результаты вызовов API, но только если мы были уверены, что источник данных каким-либо образом не изменился.

Если вы используете Angular и Typescript, и все наши вызовы данных проходят через RxJ, мы можем создать декоратор Cache Observable, который мы будем использовать только для предоставления возможности кэширования определенным методам.

До:

getCountry(take?: number, skip?: number) {
    return this.http.get(
      `${environment.api}/Country/latest?take=${take}&skip=${skip}`
    );
  }

это станет:

@Cacheable({
    cacheBusterObserver: CountryNotifier
  })
  getCountry(take?: number, skip?: number) {
    return this.http.get(
      `${environment.api}/Country/latest?take=${take}&skip=${skip}`
    );
  }

Обратите внимание, что @Cacheable () был применен только к желаемому нами методу, а также был передан cacheBusterObserver, который в основном является нашим механизмом на основе Subject, чтобы сообщить этому точному декорированному методу, чтобы освободить все его кеши, когда в этом потоке испускается какое-либо значение.

Например, метод ниже будет «перебирать кеш» кешей метода выше, если Observable, который он возвращает, испускает значение

@CacheBuster({
    cacheBusterNotifier: countryNotifier
  })
  saveCountry(id: string, name: string, review: string) {
    return this.http.put(`${environment.api}/Country`, {
      id,
      name,
      review
    });
  }

Это может быть самый сложный пример, но у нас также есть другие конфигурации, такие как maxCacheCount, maxAge, SlidingExpiration и настраиваемые решатели и преобразователи кеша, которые дают нам точный контроль над тем, что, когда и как кэшировать.

person Mohit Verma    schedule 08.05.2019
comment
Это может быть хорошим способом реализовать кеширование на стороне SPA, но мне не поможет, если другой экземпляр SPA добавит Country. В этом случае исходный экземпляр не сможет заметить, что он все еще работает со старыми данными. - person Misza; 09.05.2019