https://docs.google.com/document/d/1JEkSYpoR43cNAt3sYsmh8OHSL11YHJSKRaR9HWUMhFY/edit
Реализовать коллектор погоды в 50 крупнейших городах для управления нагрузкой Дата-центров Под крупнейшими городами считались города, сортированные по количеству населения.
- Скачать и установить Docker, docker compose https://www.docker.com/get-started/
- Получить API ключ на сайте https://openweathermap.org/
- Склонировать репозиторий себе на компьютер
git clone git@github.com:catstyle1101/datafort.git
- Выполнить команды
cd datafort
cp .env.example .env
- Установить необходимые переменные окружения в файле .env
OPENWEATHER_API_KEY=<some_key_here>
PGUSER=<your_username>
POSTGRES_PASSWORD=<your_password>
POSTGRES_DB=<your_datbase_name>
DB_HOST=db
DB_PORT=5432
- Запустить проект
docker compose up --build
- Через одну минуту система соберет данные с 50 гордов мира и запишет их в базу данных Postgres
- Система 1 раз в час опрашивает сервер openweathermap и сохраняет погоду в БД. Первый запуск через 1 минуту после старта контейнеров
- Города также записаны в БД, система выбирает до 50 самых густонаселенных городов
- В случае, если городов в БД нет, то система заливает их из файла csv/cities.csv
- Запросы в БД и в API реализованы синхронно.
- Python
- Pydantic
- SQLAlchemy
- Docker
- Celery
- PostgreSQL
- Время заката/восхода (без солнца нагрузка на кондиционирование снижается)
- Минимальная и максимальная температура (позволит спрогнозировать пиковую/минимальную мощность)
- Давление (в динамике давление позволяет спрогнозировать ближайшую погоду)
- Влажность (влияет на эффективность систем кондиционирования)
Описать почему выбрана такая структура БД?
В БД 2 сущности City и Weather c отношнением один-ко-многим. Таким образом можно легко получать данные по погоде по определенному городу Добавлять города в БД и затем делать запросы только в ТОП 50.
Почему выбрана та или иная технология?
SQLAlchemy - выбрана так как это очень популярная ORM, легко сменить БД, практически не меняя код самого модуля.
Какие технологические ограничения есть на данном этапе?
Запросы делаются синхронно, как в БД так и в API, можно увеличить скорость переписав запросы на асинхронном движке БД и Асинхронном движке HTTP запросов (например aiohttp) ограничения со стороны API (в частности - Calls per minute: 60 и 1,000,000 calls/month, а значит, когда городов станет больше 1388 (или мы будем опрашивать более 60 городов в минуту), нужно будет в любом случае покупать подписку иначе мы упремся в ограничения со стороны API).