Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/capcom6-learning/otus-python-basic-project


https://github.com/capcom6-learning/otus-python-basic-project

Last synced: about 2 months ago
JSON representation

Awesome Lists containing this project

README

        

# Серверная часть погодного портала для метеостанций

Приложение предназначено для сбора информации о текущей погоде с метеостанций и предоставления погодной информации клиентам.

## Требования

### Функциональные требования

- получение данных с нескольких метеостанций;
- получение данных в нескольких форматах;
- работа как минимум с 3 измерениями: температура воздуха, скорость ветра, направление ветра;
- предоставление информации о текущей погоде;
- предоставление информации о погоде за период в виде графиков;
- предоставление информации о прогнозе погоды (за счет внешних сервисов);
- наличие веб-интерфейса пользователя с анонимным доступом;
- наличие API для мобильных приложений;
- наличие административного интерфейса для управления списком метеостанций.

### Нефункциональные требования

- хранение погодных данных не менее 5 лет;
- возможность горизонтального масштабирования и шардирования хранилища.

### Оценка нагрузки

1. 1_000 метеостанций.
2. Измерения каждые 5 секунд -> 1_000 запросов на 5 секунд -> 200 RPS.
3. 100_000 пользователей в сутки.
4. Среднее время сессии 5 минут.
5. Автоматическое обновление страницы каждые 10 секунд -> 30 запросов на пользователя -> 3_000_000 запросов в сутки -> 35 RPS.

С учетом неравномерности нагрузки от пользователей - 200 RPS + 3 * 35 RPS = 305 RPS.

### Оценка хранилища

1. Одна запись - 512 байт.
2. 17_280 измерений в сутки с каждой метеостанции -> 17_280_000 записей в сутки с 1_000 метеостанций -> 8 ГБ в сутки.
3. Прогнозные данные: 1_000 метеостанций каждые 2 часа 1 запись -> 6МБ в сутки.
4. За 5 лет - 15 ТБ данных.
5. + индексы.

### Оценка кэша

1. Кэширование сформированных графиков.
2. Один график - 64 кб.
3. 1_000 метеостанций x 3 графика x 64 кб -> 188 МБ ОЗУ.

### Оценка пропускной способности

1. Получение данных с метеостанций: 200 RPS * 1_024 байта (данные + заголовки) = 200 кб/с.
2. Предоставление данных пользователям: 3_000_000 запросов в сутки, 50% - текущая погода (1_024 байта), 30% - массив данных (100 кб), 20% - графики (192 кб) = 1,43 ГБ + 85,83 ГБ + 109,86 ГБ = 197,12 ГБ в сутки -> 2_392 кб/с.

С учетом неравномерности нагрузки - 10 МБ/с.

## Минимальная реализация

В рамках MVP планируется реализовать:

- [x] API администратора:
- [x] Basic авторизация;
- [x] добавление, редактирование и удаление метеостанций.
- [x] получение данных от метеостанций в одном формате;
- [x] сохранение данных в БД;
- [x] API клиентов:
- [x] список метеостанций;
- [x] текущие погодные данные;
- [x] массив данных за период по выбранным измерениям;
- [x] графики изменения параметров.
- [x] страница состояния метеостанций.

### Технологии

Планируется использовать следующее ПО, библиотеки и технологии:

* Nginx, Gunicorn, Uvicorn, FastAPI - HTTP-доступ;
* MongoDB, Motor - хранение данных и доступ к ним;
* Matplotlib - построение графиков;
* Jinja2 - шаблонизатор для страницы состояния.

## Рабочие заметки

Ссылка запроса прогноза. Время отстает на ~ -17 часов.

https://www.windguru.net/int/iapi.php?q=forecast&id_model=3&rundef=2022082018x0x240x0x240&initstr=2022082018&id_spot=233638&WGCACHEABLE=21600&cachefix=54.643x90.165x369