У меня очень высокий трафик (10 миллионов показов в день) / сайт с высокой доходностью, созданный с помощью .net. Основные метаданные хранятся на сервере SQL. У меня и моей команды есть уникальная стратегия кэширования, которая включает в себя регулярный запрос к базе данных новых метаданных с сервера среднего уровня, сериализацию данных в файлы и отправку их на веб-узлы. Веб-приложение использует данные в этих файлах (некоторые из них на самом деле являются сериализованными объектами) для создания экземпляров объектов и кэширует те в памяти, которые используются для запросов в реальном времени.
Преимущество этой модели в том, что она:
- Позволяет веб-узлам кэшировать все данные в памяти и не выполнять никаких операций ввода-вывода при запросах к базе данных.
- Если база данных когда-либо неожиданно выйдет из строя или из-за окон обслуживания, веб-серверы продолжат работу и будут приносить доход. Вы даже можете запустить веб-сервер без необходимости извлечения его начальных данных из БД, поскольку все необходимые данные находятся в файлах на его собственных дисках.
- Позволяет нам полностью масштабироваться по горизонтали. Если пропускная способность страдает, мы можем просто добавить веб-сервер.
Недостатки в том, что эти уровни кэширования и сохранения увеличивают сложность кода, который запрашивает базу данных, упаковывает данные и распаковывает их на веб-сервере. Каждый раз, когда наша модель предметной области требует от нас добавления сущностей, необходимо закодировать больше этой «сантехники». Эта архитектура существует уже четыре года, и, возможно, есть более эффективные способы решения этой проблемы.
Одна стратегия, которую я рассматривал, заключается в использовании репликации для репликации нашей базы данных главного сервера sql на экземпляры локальной базы данных, установленные на каждом веб-сервере. Приложение веб-сервера будет использовать обычные методы sql / ORM для создания экземпляров объектов. Здесь мы все еще можем выдержать сбои основной базы данных, и нам не нужно было бы кодировать специализированный кеширующий код, а вместо этого можно было бы использовать nHibernate для обработки персистентности.
Это выглядит как более элегантное решение, и хотелось бы посмотреть, что думают другие или есть ли у кого-нибудь еще какие-либо альтернативы.