Что я должен сделать, чтобы масштабировать веб-сайт с высоким трафиком?

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/1280

Вопрос

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

Мне интересно услышать обо всем, что вы считаете наилучшей практикой от задач на уровне развития, до инфраструктуры, управления.

Это было полезно?

Решение

Дизайн для параллелистики

То есть, как вы кодируете, планируйте иметь несколько потоков. Планируйте общее состояние (часто только БД). Планируйте несколько процессов. Планируйте физическое распределение.

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

Другие советы

Несколько вещей, которые вы можете рассмотреть:

  • Разделение чтения и записи вашего хранилища данных.
    • CQRS/Sourcing Event Sourcing
    • CQS
    • Сообщение обновления/актеры
  • Избегание общего процесса и состояния потока
    • Следовательно, избегая блокировки
    • Вы можете избежать этого через систему типов, создавая свои классы, структуры и другие типы данных, чтобы быть неизбежными, т.е. не изменяясь после строительства. Особенно для сложных абстрактных типов данных это работает на удивление (например, реализация jQuery)
  • Не блокировать потоки веб -сервера на io. Если вы используете ASP.NET Используйте асинхронные страницы/действия с помощью библиотеки APM-шаблона/параллельной задачи (TPL)
  • Не сохранение состояний в словаре пользовательской серии
    • Это должно быть перемещено через потоки, когда в IIS происходит миграция ниток.
    • Наличие интеллектуальной маршрутизации, так что несбезопасные/статические ресурсы не обслуживались с той же основой применения (например, ASP.NET), которые добавляют накладные расходы. Например, посмотрите на наличие разных веб -серверов.
  • Написание кода продолжения прохождения с асинхронным паттерном рабочего процесса (например, Bind (haskell) /callcc/tasks.continuewith/f#'s async)
  • Используйте теорию очередей, чтобы рассчитать, где могут произойти узкие места
  • Используйте обновления на основе push, а не на основе тяги для чтения моделей и другого состояния приложения. Например, через Rabbitmq/nservicebus
  • Используйте наименее применимые «http handler»
  • Для статических файлов подают электронные биржи и политики срока действия кэша, чтобы позволить веб-инфраструктуре работать так же, как и должно (например, с прокси с Squid)
  • (Найдите меня, чтобы решить ваши проблемы с масштабированием и получить учебники на месте;))

Ничего не поделиться архитектурой.

Имея это в виду, и вопреки тому, что вы можете подумать, не прыгайте к масштабному решению сразу. Зарядные накладные расходы против вызова в пределах системы не должны быть недостаточны. Например, для создания подключения БД в любом сетевом интерфейсе требуется намного больше времени, чем для локального вызова. Бюджет, сколько времени в управлении, власти и настройке необходимо в масштабировании по сравнению с дополнительной $ для настоящей большой системы.

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

Параллелизуйте запросы по нескольким именам хостов

Частью стандарта HTTP является раздел, в котором говорится, что веб -клиенты запрашивают максимум 2 сеанса на хост DNS. Вот решение, в котором вы и псевдоним www.domain.com и получаете параллелизм с более высоким запросом, делая вашу страницу быстрее:

https://stackoverflow.com/questions/3653609/how-do-i-code-my-asp-net-page-to-parallelize-downloads-across-hostnames

По сути, это включает в себя редактирование вашего обработчика HTTP ASP.NET для чередования целевых хостов, на которые вы отправляете клиентов, где каждый хост является CNAME для «www».

Безопасный, быстрый, надежный DNS

Я нашел несколько веб-сайтов с высокой емкостью, используя DNS-сервер регистратора, который не имел SLA для времени безотказной работы или производительности. Кроме того, их серверы были расположены в Индии, и только задержка увеличивает вероятность того, что спиц DNS может отравить вашего клиента или кеша промежуточного интернет -провайдера. Это приведет к тому, что даже ваш защищенный SSL-защитник будет перенаправлен без того, чтобы никто не знал.

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

Я использую Dyndns или Neustar для большинства своих клиентов, поскольку у них довольно прочная инфраструктура DNS (хотя это дорого, и у меня нет другой связи для этих компаний).

Я думаю, что ключ будет прост:

Есть простой код. Это означает то, на что вы смотрите и понимаете. Когда вы расширяете и меняете серверы, вам нужно знать, что происходит. Вам также может потребоваться добавить кодеров, которые должны быстро понять. Крюки и XML -файлы, которые называют случайный код, который не очевиден, очень плохи.

Затем вы можете проверить и найти проблемы.

Смотри сюда: http://blog.servint.net/2013/08/27/oge-big-how-to-cale-a-website-part-1-infrastructure-that-cales/

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

Лицензировано под: CC-BY-SA с атрибуция
scroll top