Совместное использование кэша между. NET Core Controller и SignalR hub - PullRequest
1 голос
/ 11 марта 2020

У меня есть устаревшее хранилище данных, которое легко перегружается, с поверхом слоя REST API уровня ASP. NET Core v2.1. Этот REST API использует кэширование (IMemoryCache) для уменьшения мгновенной нагрузки на хранилище данных.

Теперь мне нужно добавить своего рода циклический опрос типа хранилища данных, чтобы обновлять элементы, или «обновления в реальном времени». Я хотел бы использовать этот же кэш в контроллере API, если это возможно, вместо того, чтобы добавлять в приложение совершенно другой сервис (redis). Последнее потребовало бы гораздо больше работы из-за изменения архитектуры нашей системы.

Я решил использовать SignalR для этих обновлений в реальном времени. Я добавил SignalR Hub в проект REST API. Браузеры подпишутся на указанный c идентификатор данных (группу), и система уведомит эти группы при обновлении элементов. Стратегия опроса хранилища данных для этих данных - это другой вопрос. Данные, поступающие через SignalR, представляют собой небольшое подмножество данных, предоставляемых API REST.

Но я хотел бы использовать один и тот же кэш на случай, если два или более клиентов запрашивают одни и те же данные в течение короткого периода времени (скажем, , 10 секунд).

Или эта проблема преувеличена?

Оба класса находятся в одном проекте. На данный момент самый простой способ - это иметь каждый доступ к этим данным индивидуально (хотя каждый может иметь свой собственный кэш):

APIController ------- +------+            
                      | Data |            
SignalR ------------- +------+            

Вот что я ищу:

APIController ------- Cache ---- +------+            
                        -        | Data |            
SignalR ----------------+        +------+            

Теперь я признаю, что похоже, что мне просто нужно redis или memcached, но redis - это то, что мне нужно здесь, и требует красной ленты. Постоянство не требуется, поэтому кэш памяти работает нормально.

Можно ли сделать это с помощью общего класса / службы stati c, внедренного в каждый? Или у меня проблема XY?

...