Я ищу несколько стратегий доступа к некоторым кэшированным данным, которые находятся во внутренней веб-службе компании. Фактически, предотвращение доступа к кэшированным данным во время обновления кэша.
У нас есть веб-служба .Net 3.5 C #, работающая в веб-ферме, которая поддерживает кеш-полдюжины или около того наборов данных. Эти данные являются элементами, связанными с конфигурацией, на которые ссылается «реальный» домен бизнес-логики, который также работает в этой веб-службе и возвращается для любого использования клиентом. Вероятно, речь идет о дюжине или около того таблиц с несколькими тысячами записей в них.
Мы реализовали механизм кэширования с использованием MS Enterprise Library 4.1. Нет большой причины использовать это в кэше ASP.Net, за исключением того, что мы уже использовали Enterprise Library для некоторых других вещей, и нам понравилась обработка истечения срока действия кэша. Это первый случай, когда мы реализовали здесь некоторое кэширование, поэтому, может быть, я упускаю что-то фундаментальное
Эти данные конфигурации не меняются слишком часто - возможно, пару раз в день. Когда эти данные конфигурации действительно изменяются, мы обновляем кэш на конкретном сервере, на который был отправлен запрос на обновление с новыми данными (процесс обновления проходит через веб-службу). Для тех других серверов в веб-ферме (в настоящее время в общей сложности 3 сервера) у нас установлен срок действия кэша, равный 15 минутам, по истечении которого данные перезагружаются из единой базы данных, к которой обращаются все серверы в ферме. Для наших конкретных целей эта задержка между серверами является приемлемой (хотя, я думаю, не идеальной).
Во время этого процесса обновления могут поступать другие запросы, требующие доступа к данным. Поскольку запрос может поступить во время процесса истечения срока действия / обновления, в настоящее время в кеше нет данных, что, очевидно, вызывает проблемы.
Какие существуют стратегии для решения этой проблемы? Если бы это происходило в приложении типа WinForm с одним доменом, мы могли бы взломать что-то, что могло бы предотвратить доступ во время обновления, используя переменные / циклы класса, многопоточность / мьютекс или какую-то другую синглтоноподобную структуру. Но я настороженно отношусь к реализации чего-то подобного в веб-ферме. Должна ли я быть? Является ли механизм кэширования распределенного сервера способом вместо каждого сервера, имеющего свой собственный кэш? Я бы хотел пока не делать этого, если бы мог, и придумать немного кодирования, чтобы обойти эту проблему. Я что-то упустил?
Спасибо за любой вклад.
ОБНОВЛЕНИЕ: я собирался использовать функцию блокировки ключевых слов для действия истечения срока действия, которое впоследствии обновляет данные, но я беспокоился об этом на веб-сервере. Я думаю, что это сработало бы, хотя мне кажется, что все еще была бы возможность (хотя и меньшая), что мы могли бы получить данные из пустого кэша между временем истечения срока его действия и временем, когда была введена блокировка (действие истечения срока действия) происходит в другой теме, я думаю). Итак, что мы сделали, если во время обычного запроса данных в кеше не было данных, мы предполагаем, что он находится в процессе обновления, и вместо этого просто извлекаем данные из источника. Я думаю, что это будет работать, так как мы можем предположить, что кеш должен заполняться постоянно, так как начальный процесс заполнения кеша будет происходить, когда одиночный класс, содержащий кеш, создается при первом запросе веб-службы. Поэтому, если кеш пуст, это действительно означает, что он в данный момент заполняется, что обычно занимает всего несколько секунд, поэтому любые запросы данных из кеша в течение этого времени будут единственными, которые не попадают в кеш.
Если кто-то со стажем хотел бы пролить больше света на это, это будет оценено.