Как StackOverflow оптимизирует производительность для отображения вопросов? - PullRequest
6 голосов
/ 24 марта 2009

Я пытаюсь изучить C # .net для программирования веб-приложения.

И, узнав, что stackoverflow использует C # .net, я рад его обнаружить.

Я заметил это на домашней странице или в разделе вопросов, всякий раз, когда я обновляю страницу. Страница всегда возвращает мне самую свежую информацию в обязательном порядке и на приемлемой скорости.

Я не уверен, как ты это делаешь. Извините за длинную серию вопросов. Я пытаюсь узнать, каковы лучшие методы для извлечения данных, подкачки, производительности и т. Д.

Я знаю, что домашняя страница возвращает только ограниченное количество вопросов и их статистику, но раздел вопросов фактически возвращает все.

Как вы оптимизируете это?

  1. На домашней странице всегда ли вы берете ВСЕ статистику последних вопросов? таким образом, ваш запрос выглядит примерно так: «выбрать * из вопросов, упорядоченных по дате / времени создания 20»?

    То есть * содержит ВСЕ сведения, включая заголовок вопроса, идентификатор, просмотры и т. Д.

    Используете ли вы HttpContext.Current.Server.cache, чтобы помочь с этим?

  2. Что касается вопросов, это еще более интригующе.

    Как вы делаете пейджинг?

    Всегда ли вы извлекаете из базы данных только результаты для конкретной страницы?

    Или вы берете все результаты и сохраняете их в наборе данных? Тогда вы используете какой-то элемент управления сеткой данных, чтобы помочь с подкачкой?

Если это последнее, как вы поддерживаете данные для обновления?

Ответы [ 4 ]

12 голосов
/ 23 сентября 2009

Здесь, в Stack Overflow, мы пытаемся использовать агрессивное кэширование на многих уровнях:

  • страницы, полностью кэшированные выходным кэшем IIS, независимо от аутентификации пользователя
  • страниц, кэшированных только для анонимных пользователей; зарегистрированные пользователи видят самый последний контент
  • части html страниц, кэшированные для всех; HttpRuntime.Cache используется для этого

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

A Страница списка вопросов будет кэшировать идентификаторы (Int32[]) всех вопросов для определенного фильтра сортировки / тегов, что делает пейджинг тривиальным. Также выполняется дальнейшее кэширование статистики (например, количество вопросов, количество связанных тегов).

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

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

Итак, посмотрите на кеширование как на головоломку - какие части можно безопасно разделить между всеми моими запросами? Исходя из расходов, какие части ДОЛЖНЫ быть разделены по всем моим запросам?

1 голос
/ 24 марта 2009

Понятия не имею, как они это сделали - я не писал ТАК.

Для чего-то подобного я бы использовал какой-то механизм кэширования для всего класса Question со всеми его ответами. Кэш-память будет недолгой, но поскольку новые / горячие вопросы просматриваются очень часто, они остаются в живых. Более старые вопросы должны быть запрошены в БД. Это также предотвратит проблему с многопоточностью, когда один человек отвечает на вопрос, а другой просматривает вопрос.

Еще одна вещь, которую вы можете заметить здесь, это то, что они интенсивно используют AJAX. Но поскольку AJAX.Net является чрезвычайно трафиком бесполезной, они реализовали вызовы AJAX, чтобы они возвращали простые объекты JSON, например. при голосовании возвращается только объект успеха с новым числом голосов или возвращается сообщение об ошибке, например: (это выдуманный пример, который не отражает того, что происходит, потому что я не могу потрудиться проверить правильность в настоящее время)

{"status": "ok", "votes": 3}

AJAX.Net вернет все содержимое UpdatePanel, независимо от его размера, который, независимо от его размера, все равно будет довольно большим.

1 голос
/ 24 марта 2009

SO использует MVC и LINQ2SQL. Я бы послушал некоторые из подкастов , чтобы лучше понять особенности. Я знаю, что они часто используют кэширование, но не уверен, включает ли это список вопросов на домашней странице.

0 голосов
/ 23 сентября 2009

Вы также можете взглянуть на этот Переполнение стека Вдохновленный обмен знаниями .

Это группа статей, пытающаяся эмулировать переполнение стека. Вы должны быть в состоянии найти кодовую базу здесь в CodePlex.

...