Как успях да живея така?
Неотдавна трябваше да работя върху бекенда на силно натоварен проект, в който беше необходимо да организирам редовното изпълнение на голям брой фонови задачи със сложни изчисления и заявки за услуги на трети страни. Проектът е асинхронен и преди да дойда, имаше прост механизъм за задачи за стартиране на cron: цикъл, проверяващ текущото време и стартиращ групи от съпрограмми чрез gather - този подход се оказа приемлив, докато не се появиха десетки и стотици такива съпрограми , обаче, когато броят им надхвърли две хиляди, трябваше да помисля за организиране на нормална опашка със задачи с брокер, няколко работници и т.н.
Първо реших да пробвам Целина, която използвах преди. Поради асинхронния характер на проекта се потопих във въпроса и видях
Ще кажа това, проектът е много интересен и работи доста успешно в други приложения на нашия екип, а самият автор казва, че е успял да го внедри в производство с помощта на асинхронен пул. Но, за съжаление, не ми подхождаше, както се оказа
В тази връзка започнах да търся алтернативи и го намери! Създателите на целина, по-специално, както разбирам
Освен това можете да погледнете
И какво ще правим?
И така, в кратка поредица от статии ще ви покажа как да събирате данни от фонови задачи с помощта на Faust. Източникът за нашия примерен проект ще бъде, както подсказва името,
PS Съдейки по увереността, с която е написана точката за мониторинга, мисля, че читателят в края на последната статия ще изглежда така:
Изисквания към проекта
Поради факта, че вече обещах, нека направим малък списък на това, което услугата трябва да може да прави:
- Качване на ценни книжа и преглед на тях (включително печалби и загуби, баланс, паричен поток - за последната година) - редовно
- Качете исторически данни (за всяка търговска година, намерете екстремни стойности на цената на затваряне на търговията) - редовно
- Качвайте най-новите данни за търговия - редовно
- Качвайте персонализиран списък с индикатори за всяка ценна книга - редовно
Както се очакваше, ние избираме име за проекта от нулата: Хортън
Подготвяме инфраструктурата
Заглавието определено е силно, но всичко, което трябва да направите, е да напишете малка конфигурация за docker-compose с kafka (и zookeeper - в един контейнер), kafdrop (ако искаме да гледаме съобщенията в темите), mongodb. Получаваме [docker-compose.yml](
version: '3'
services:
db:
container_name: horton-mongodb-local
image: mongo:4.2-bionic
command: mongod --port 20017
restart: always
ports:
- 20017:20017
environment:
- MONGO_INITDB_DATABASE=horton
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin_password
kafka-service:
container_name: horton-kafka-local
image: obsidiandynamics/kafka
restart: always
ports:
- "2181:2181"
- "9092:9092"
environment:
KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-service:29092,EXTERNAL://localhost:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
KAFKA_RESTART_ATTEMPTS: "10"
KAFKA_RESTART_DELAY: "5"
ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"
kafdrop:
container_name: horton-kafdrop-local
image: 'obsidiandynamics/kafdrop:latest'
restart: always
ports:
- '9000:9000'
environment:
KAFKA_BROKERCONNECT: kafka-service:29092
depends_on:
- kafka-service
Тук изобщо няма нищо сложно. Два слушателя бяха декларирани за kafka: един (вътрешен) за използване вътре в композитната мрежа, а вторият (външен) за заявки отвън, така че те го препратиха навън. 2181 — пристанище за пазачи в зоологическата градина. Останалото, мисля, е ясно.
Изготвяне на скелета на проекта
В основната версия структурата на нашия проект трябва да изглежда така:
horton
├── docker-compose.yml
└── horton
├── agents.py *
├── alphavantage.py *
├── app.py *
├── config.py
├── database
│ ├── connect.py
│ ├── cruds
│ │ ├── base.py
│ │ ├── __init__.py
│ │ └── security.py *
│ └── __init__.py
├── __init__.py
├── records.py *
└── tasks.py *
*Всичко, което отбелязах Все още не го докосваме, просто създаваме празни файлове.**
Създадохме структура. Сега нека добавим необходимите зависимости, да напишем конфигурацията и да се свържем с mongodb. Няма да предоставя пълния текст на файловете в статията, за да не я забавя, но ще дам връзки към необходимите версии.
Нека започнем със зависимости и мета за проекта -
След това започваме да инсталираме зависимости и да създаваме virtualenv (или можете сами да създадете папката venv и да активирате средата):
pip3 install poetry (если ещё не установлено)
poetry install
Сега да творим
Когато се свързвате с Mongo, всичко е доста просто. обяви
Какво ще стане след това?
Статията не е много дълга, тъй като тук говоря само за мотивация и подготовка, така че не ме винете - обещавам, че следващата част ще има екшън и графики.
И така, в тази съвсем следваща част ние:
- Нека напишем малък клиент за alphavantage на aiohttp със заявки за крайните точки, от които се нуждаем.
- Нека създадем агент, който ще събира данни за ценни книжа и исторически цени за тях.
Източник: www.habr.com