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
- 436