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