Подавляющее большинство сайтов читает гораздо больше, чем пишет. Нередко на каждую запись приходится тысячи или даже миллионы чтений.
Следовательно, любое решение по масштабированию зависит от разделения масштабирования операций чтения и масштабирования операций записи. Как правило, масштабирование чтения действительно дешево и просто, масштабирование записи сложно и дорого.
Самый простой способ масштабировать чтение — кэшировать целые страницы за раз и истечь через определенное количество секунд. Если вы посмотрите на популярный веб-сайт Slashdot. вы можете видеть, что именно так они масштабируют свой сайт. К сожалению, эта стратегия кэширования может привести к нелогичному поведению конечного пользователя.
Из вашего вопроса я предполагаю, что вам не нужен этот примитивный вид кэширования. Как вы упомянули, вам нужно обновить кеш на месте.
Это не так страшно, как кажется. Главное, что нужно понять, это с точки зрения сервера. Stackoverflow не обновляется постоянно. Обновляется довольно редко. Может быть, один или два раза в секунду. Для компьютера секунда почти вечность.
Более того, обновления, как правило, происходят для элементов в кэше, которые не зависят друг от друга. В качестве примера рассмотрим переполнение стека. Я предполагаю, что каждая страница вопроса кэшируется отдельно. Большинство вопросов, вероятно, обновляются в среднем в минуту в течение первых пятнадцати минут, а затем, вероятно, раз в час после этого.
Таким образом, в большинстве приложений вам практически не нужно масштабировать записи. Их так мало и далеко друг от друга, что вы можете иметь один сервер, выполняющий запись; Обновление кэша на месте на самом деле является вполне жизнеспособным решением. Если у вас не очень высокий трафик, вы получите очень мало одновременных обновлений одного и того же кэшированного элемента в одно и то же время.
Так как же это настроить? Мое предпочтительное решение состоит в том, чтобы кэшировать каждую страницу отдельно на диск, а затем иметь много веб-головок, доставляющих эти статические страницы из некоторого взаимно доступного пространства.
Когда необходимо выполнить запись, она выполняется только с одного сервера, и это обновляет эту конкретную кэшированную html-страницу. Каждый сервер владеет собственным подмножеством кеша, поэтому не существует единой точки отказа. Процесс обновления тщательно продуман, так что транзакция гарантирует, что никакие два запроса не будут записываться в файл в одно и то же время.
Я обнаружил, что эта конструкция отвечает всем требованиям масштабирования, которые нам до сих пор требовались. Но это будет зависеть от характера сайта и характера нагрузки, будет ли это правильным для вашего проекта.
person
Simon Johnson
schedule
22.11.2008