Оптимизация производительности для интерактивных веб-сайтов

Недавно я завершил разработку веб-сайта со средним (?) трафиком (пиковая скорость 60 000 посещений в час), однако сайт нужно обновлять только раз в минуту, а достижение требуемой производительности можно описать одним словом: «кэширование». ".

Для такого сайта, как SO, где данные, поступающие на сайт, меняются все время, я бы предположил, что требуется другой подход.

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

Я предполагаю, что вам понадобится распределенный кеш для управления обслуживанием данных и страниц, которые обновляются порядка нескольких секунд, с, возможно, распределенным кешем над базой данных для посредничества при записи?

Могут ли те, кто более опытен, описать некоторые ключевые принципы архитектуры/дизайна, которые они используют для обеспечения высокой интерактивности таких веб-сайтов, как SO?


person Ben Aston    schedule 22.11.2008    source источник


Ответы (2)


Подавляющее большинство сайтов читает гораздо больше, чем пишет. Нередко на каждую запись приходится тысячи или даже миллионы чтений.

Следовательно, любое решение по масштабированию зависит от разделения масштабирования операций чтения и масштабирования операций записи. Как правило, масштабирование чтения действительно дешево и просто, масштабирование записи сложно и дорого.

Самый простой способ масштабировать чтение — кэшировать целые страницы за раз и истечь через определенное количество секунд. Если вы посмотрите на популярный веб-сайт Slashdot. вы можете видеть, что именно так они масштабируют свой сайт. К сожалению, эта стратегия кэширования может привести к нелогичному поведению конечного пользователя.

Из вашего вопроса я предполагаю, что вам не нужен этот примитивный вид кэширования. Как вы упомянули, вам нужно обновить кеш на месте.

Это не так страшно, как кажется. Главное, что нужно понять, это с точки зрения сервера. Stackoverflow не обновляется постоянно. Обновляется довольно редко. Может быть, один или два раза в секунду. Для компьютера секунда почти вечность.

Более того, обновления, как правило, происходят для элементов в кэше, которые не зависят друг от друга. В качестве примера рассмотрим переполнение стека. Я предполагаю, что каждая страница вопроса кэшируется отдельно. Большинство вопросов, вероятно, обновляются в среднем в минуту в течение первых пятнадцати минут, а затем, вероятно, раз в час после этого.

Таким образом, в большинстве приложений вам практически не нужно масштабировать записи. Их так мало и далеко друг от друга, что вы можете иметь один сервер, выполняющий запись; Обновление кэша на месте на самом деле является вполне жизнеспособным решением. Если у вас не очень высокий трафик, вы получите очень мало одновременных обновлений одного и того же кэшированного элемента в одно и то же время.

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

Когда необходимо выполнить запись, она выполняется только с одного сервера, и это обновляет эту конкретную кэшированную html-страницу. Каждый сервер владеет собственным подмножеством кеша, поэтому не существует единой точки отказа. Процесс обновления тщательно продуман, так что транзакция гарантирует, что никакие два запроса не будут записываться в файл в одно и то же время.

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

person Simon Johnson    schedule 22.11.2008

Возможно, вас заинтересует эта статья, в которой описывается структура серверов Викимедиа. Очень познавательно!

В статье есть ссылки на данный PDF-файл. пропустите это.

person Claudiu    schedule 22.11.2008