Как спроектировать систему высокой доступности? Где рассмотреть?

Java

Эта статья была включена из JavaGuide с открытым исходным кодом автора:github.com/Snailclimb(69k+Star [Java Learning + Interview Guide] Копия, которая охватывает основные знания, которые необходимо освоить большинству Java-программистов).

Небольшая статья, этот вопрос часто встречается в интервью. Эта статья в основном включает следующее содержание:

  1. определение высокой доступности
  2. Какие условия могут сделать систему недоступной?
  3. Какие способы повышения доступности системы? Просто краткое упоминание. Более конкретное содержание будет представлено в последующих статьях. Возьмем в качестве примера ограничение тока. Вам нужно понять: что такое ограничение тока? Как ограничить ток? Зачем ограничивать ток? Как это сделать? Подскажите принцип? .

Что такое высокая доступность? По каким критериям оценивается юзабилити?

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

Обычно мы используем количество девяток для оценки доступности системы. Например, 99,9999% означает, что система доступна только 0,0001% времени за все время работы. Такая система очень и очень доступна! Конечно, также будут системы, которые могут даже не подняться до 9, если доступность не очень хорошая.

Какие условия могут привести к недоступности системы?

  1. хакерская атака;
  2. Аппаратный сбой, например сломанный сервер.
  3. Всплеск параллелизма/запросов пользователей приводит к тому, что вся служба отключается или некоторые службы становятся недоступными.
  4. Плохой запах в коде вызывает утечку памяти или другие проблемы, приводящие к зависанию программы.
  5. Важная роль архитектуры веб-сайта, такой как Nginx или база данных, внезапно становится недоступной.
  6. Природные катаклизмы или техногенные разрушения.
  7. ......

Какие есть способы повысить доступность системы?

1. Обратите внимание на качество кода и строго контролируйте тест

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

Кроме того, Amway, эта малышка, имеет практическое влияние на улучшение качества кода:

  1. sonarqube: гарантирует, что вы будете писать более безопасный и чистый код! (ps: этот плагин в основном используется в текущем проекте).
  2. Инструмент для диагностики Java с открытым исходным кодом Arthas от Alibaba также является хорошим выбором.
  3. Анализ кода и другие инструменты, которые поставляются с IDEA, также очень хороши для сканирования кода.

2. Используйте кластеры, чтобы уменьшить число единых точек отказа

Давайте возьмем в качестве примера обычно используемый Redis! Как обеспечить высокую доступность нашего кеша Redis? Ответ — использовать кластер и избегать единой точки отказа. Когда мы используем экземпляр Redis в качестве кеша, после зависания экземпляра Redis может зависнуть вся служба кеша. После использования кластера, даже если есть один экземпляр Redis, другой экземпляр Redis окажется сверху менее чем за секунду.

3. Ограничение тока

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

4. Настройки механизма тайм-аута и повтора

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

5. Механизм взрывателя

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

6. Асинхронный вызов

Для асинхронных вызовов нам не нужно заботиться о конечном результате, поэтому мы можем вернуть результат сразу после завершения запроса пользователя. Однако после использования async нам может понадобитьсяСоответствующим образом изменить бизнес-процессы для сотрудничества,НапримерПосле того, как пользователь отправляет заказ, пользователь не может немедленно сообщить пользователю, что заказ был успешно отправлен. уведомление по электронной почте или SMS о том, что заказ выполнен успешно.. В дополнение к реализации асинхронности в программах мы часто используем очереди сообщений, которые могут улучшить производительность системы (сокращение пиковых нагрузок, уменьшить время отклика) и уменьшить связанность системы за счет асинхронной обработки.

7. Используйте кеш

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

8. Другие

  1. Основные приложения и службы отдают приоритет лучшему оборудованию
  2. Отслеживайте использование системных ресурсов и добавляйте настройки сигналов тревоги.
  3. Позаботьтесь о резервном копировании и откате, если это необходимо.
  4. Релиз в оттенках серого:Разделить кластер серверов на несколько частей, каждый день освобождать только часть машин, следить за стабильностью работы и отсутствием сбоев, продолжать высвобождать часть машин на следующий день, а на следующий день продолжать высвобождать весь кластер несколько дней часть сервера
  5. Периодически проверяйте/заменяйте оборудование:Если вы не покупаете облачные сервисы, вам все равно необходимо регулярно проверять оборудование.Некоторое оборудование, которое необходимо заменить или обновить, необходимо вовремя заменить или обновить.
  6. .....(Я добавлю это, когда подумаю об этом! Каждый может добавить это!)

Суммировать

如何设计高可用系统?

Рекомендация проекта с открытым исходным кодом

Другие рекомендации автора по проектам с открытым исходным кодом:

  1. JavaGuide: [Изучение Java + интервью] Обложка, которая охватывает основные знания, которые необходимо освоить большинству Java-программистов.
  2. springboot-guide: Учебное пособие по Spring Boot, подходящее для начинающих и опытных разработчиков (поддержка в свободное время, добро пожаловать в совместную поддержку).
  3. programmer-advancement: Я думаю, некоторые хорошие привычки, которые должны быть у техников!
  4. spring-security-jwt-guide:Начинать с нуля! Spring Security с JWT (включая проверку авторизации) бэкэнд-часть кода.

публика