Как я могу управлять кэшем, хранящимся на веб-сервере, когда я использую 3 веб-сервера? - PullRequest
0 голосов
/ 23 июля 2010

Мы работаем над веб-приложением, которое распределено по 3 веб-серверам с балансировкой нагрузки.Большая часть данных, которые мы получаем через NHibernate, хранится в System.Web.Caching.Cache.

System.Web.Caching.Cache многое делает для повышения отзывчивости приложения, но есть несколько проблем, которые мы точно не знаем, как решить, например,

  1. когда пользователь запрашивает данные на сервере server1, эти данные кэшируются на сервере server1, но для следующего запроса балансировщик нагрузки может направить их на сервер server2.Эти данные, которые они запрашивали на сервере server1, больше недоступны, и server2 должен будет снова запросить их у базы данных.

  2. Если пользователь делает что-то на сервере server1 для аннулирования кэшированных данных, кешсбрасывается на server1.Однако исходный кэш по-прежнему доступен на server2 и server3, поэтому, когда пользователь отправляет последующий запрос и направляется на один из других серверов, ему будут представлены недопустимые данные.

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

Каковы лучшие способы решения этих проблем?

Должны ли мы хранить кэш на отдельном сервере, например, для HttpContext.Session с сервером SessionState?

Есть ли у нас способ установить зависимость кэша от кэша на двух других серверах?

Можно ли реализовать зависимость кэша от реальных таблиц или строк базы данных?При этих изменениях кеш сбрасывается?- или мы могли бы настроить триггер базы данных, чтобы как-то очистить кеш?

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Да, многосерверная среда демонстрирует слабость кэша ASP.NET в том, что он только для одного сервера.Возможно, вы захотите использовать распределенный кеш, такой как AppFabric , который даст вам один логический кеш, который лежит в основе всех трех веб-серверов.

AppFabric можно использовать с NHibernate в качестве кэша второго уровня - см. http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/ (хотя следует помнить, что этот вопрос предполагает, что текущая реализация может быть не актуальнойдата выпуска AppFabric v1).

0 голосов
/ 23 июля 2010

У вас есть несколько вариантов:

1) Использовать распределенный кеш (например, distcache, speed или ncache)

2) Используйте экземпляр общего кэша (например, memcached), который используется всеми вашими веб-серверами.

NHibernate имеет провайдеров кэша второго уровня для всех из них, которые можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...