:)

Высокая доступность приложения

Статический контент

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

Заодно ограничим количество запросов с одного адреса до одного в секунду:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
 limit_req_status 444;
 server { location / { limit_req zone=one burst=5; } }

Еще добавим  limit_conn_zone  для ограничения количества подключений с каждого IP-адреса до 10-и.

limit_conn_zone $binary_remote_addr zone=addr:10m;
 server { location / { limit_conn addr 10; } }

С дятлом мы разобрались теперь с улиткой (ограничим медленные запросы):

server { client_body_timeout 5s; client_header_timeout 5s; }

Базовые настройки nginx

Затем анонимус будет пытаться брутфорсить логин, врятли что-то получится за 3 попытки с увеличивающимися паузами, а затем придется менять IP.

Но не только  атаки или всплеск  активности пользователей, но и  пользовательский опыт  будет в восторге, если отдавать пользователю для веб версии готовый html, с отложенной загрузкой связанных файлов,  а для роботов (клиентов  API) - json .

Связанные файлы хранятся отдельно, приложение отдельно, база отдельно.

Подключаться к базе только по необходимости.

Основные данные, для быстрой отдачи пользователю без  запроса к базе данных, генерируются в json при создании объекта, если json отсутствует в статическом файле для определенного вида/выборки, обращаемся к базе.

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

Мультисервисная архитектура

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

Отказоустойчивость:

Балансировка серверов:

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

Репликация Базы данных:

Добавление реплик в зависимости от нагрузок по принципу: Мастер  - Мастер. В разные датацентры во избежание обстоятельств непреодолимой силы.

Сегментирование Базы данных:

1. Для чтения  2 Для сложной выборки 2. Для записи

Таблицы:

Большой полнотекстовый Контент объекта, может весить несколько  мегабайт его мы храним отдельно от объекта и даже  можем архивировать.

Выполненные заказы отправляются в  архив и хранятся отдельно от активных заказов в работе.

Также в архив отправляются чаты, последнее сообщение в котором более месяца назад,  при активировании переписки, возвращается обратно.