Tinkoff Python
Episode 11 (Final) - path 2
HighLoad, масштабирование, отказоустойчивость

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

Данные читаем из базы

С увеличением нагрузки увеличиваем кол-во процессов/потоков для обработки запросов

Но рано или поздно нам придется поставить второй сервер/виртуалку и добавить новые инстансы приложения

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

На стороне клиента

Клиенты знают адреса всех серверов, и сами выбирают на какой ходить
DNS балансировка

Revers-proxy (nginx, haproxy)

Алгоритмы балансировки
- Round robin
- По кол-ву запросов
- По весам
HTTPS, throttling часто настраивается на стороне reverse-proxy
Балансер тоже является точкой отказа и может быть продублирован

Слишком много запросов на чтение в бд?
Репликация

+ Увеличиваем возможность обрабатывать запросы на чтение
+ Отказоустойчивость (можно переключить запись на реплику, если мастер упал)
- Eventual consistency - изменения доходят до реплик с задержкой (для критично важных запросов читаем из мастера)
Запросы становятся тяжелыми и медленными?
Добавляем кэширование, денормализацию

Объемы хранимых данных слишком велики?
Шардирование

Данные можно делить по условию или типу
Например данные разных клиентов в разных базах, логи за разные периоды времени и тд - это разделение по условию. Под шардированием подразумевают такой способ.
Хранить сообщения чата в одной базе, аватарки пользователей в другой - это разделение по типу
Консистентность не гарантируется, например уникальный индекс по данным на разных шардах придется строить в отдельной базе данных.
Индексы для поиска по всем данным также можно выносить в отдельные базы (например elastic для поиска по тексту)
Решардшинг

Hashring

Шардирование + Репликация

Слишком много запросов на запись в базу?
Пишем асинхронно через очередь (celery, rq, etc.)

Очереди также могут быть отказоустойчивы и продублированы
Файловый сервер с обработкой картинок
Приложения на хостах с хорошим cpu для обработки изображений

Диск для записи


Сервера раздающие файлы с реплик диска
При этом мы имеем N resizer`ов, которые пишут данные на M дисков, которые реплицируются на M*X копий, с которых раздают файлы Y файловых серверов
Чат

Авторизация

API gateway
Апи, с которым взаимодействуют клиенты. Гейт скрывает внутреннюю структуру системы и упрощает ее изменения. Часто в роли такого апи может выступать не отдельное приложение, а revers-proxy

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}Спасибо, что были с нами!)
Вопросы?
Tinkoff Python 11
By Afonasev Evgeniy
Tinkoff Python 11
- 514