Како сам дошао да овако живим?
Не тако давно сам морао да радим на бацкенд-у веома оптерећеног пројекта, у којем је било потребно организовати редовно извршавање великог броја позадинских задатака са сложеним прорачунима и захтевима за услуге трећих страна. Пројекат је асинхрони и пре него што сам дошао, имао је једноставан механизам за задатке покретања црон-а: петљу која проверава тренутно време и покреће групе корутина преко прикупљања – овај приступ се показао прихватљивим све док није било десетина и стотина таквих корутина , међутим, када је њихов број прешао две хиљаде, морао сам да размишљам о организовању нормалног реда задатака са брокером, неколико радника и тако даље.
Прво сам одлучио да испробам целер, који сам раније користио. Због асинхроне природе пројекта, заронио сам у питање и видео
Рећи ћу ово, пројекат је веома интересантан и прилично успешно функционише у другим апликацијама нашег тима, а сам аутор каже да је успео да га уведе у продукцију коришћењем асинхроног пула. Али, нажалост, то ми, како се испоставило, није баш одговарало
С тим у вези, почео сам да тражим алтернативе и нашао га! Креатори целера, конкретно, како ја разумем
Такође, можете погледати
Шта да радимо?
Дакле, у краткој серији чланака, показаћу вам како да прикупите податке из позадинских задатака користећи Фауст. Извор за наш пример пројекта биће, као што име каже,
ПС Судећи по самопоуздању са којим је написана тачка о мониторингу, мислим да ће читалац на крају последњег чланка ипак изгледати отприлике овако:
Захтеви пројекта
Због чињенице да сам већ обећао, хајде да направимо малу листу онога што би услуга требало да може да уради:
- Учитајте хартије од вредности и њихов преглед (укључујући добитке и губитке, биланс стања, ток готовине - за прошлу годину) - редовно
- Отпремите историјске податке (за сваку годину трговања пронађите екстремне вредности цене затварања трговања) - редовно
- Учитајте најновије податке о трговању - редовно
- Учитајте прилагођену листу индикатора за сваку хартију - редовно
Као што се и очекивало, бирамо име за пројекат од нуле: хортон
Припремамо инфраструктуру
Наслов је свакако јак, међутим, све што треба да урадите је да напишете малу конфигурацију за доцкер-цомпосе са кафка (и зоокеепер - у једном контејнеру), кафдроп (ако желимо да погледамо поруке у темама), монгодб. Добијамо [доцкер-цомпосе.имл](
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
Овде уопште нема ништа компликовано. За кафку су декларисана два слушаоца: један (интерни) за коришћење унутар композитне мреже, а други (спољни) за захтеве споља, па су га проследили споља. 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 *
*Све што сам приметио Још га не дирамо, само креирамо празне датотеке.**
Направили смо структуру. Сада додајмо потребне зависности, напишемо конфигурацију и повежемо се са монгодб. Нећу давати цео текст фајлова у чланку, да не бих одлагао, али ћу дати линкове до потребних верзија.
Почнимо са зависностима и мета о пројекту -
Затим почињемо да инсталирамо зависности и креирамо виртуаленв (или можете сами да креирате фасциклу венв и активирате окружење):
pip3 install poetry (если ещё не установлено)
poetry install
Сада кренимо
Када се повежете на Монго, све је прилично једноставно. најавио
Шта ће се даље дешавати?
Чланак није много дугачак, јер овде говорим само о мотивацији и припреми, тако да не замерите - обећавам да ће следећи део имати акцију и графику.
Дакле, у овом следећем делу ми:
- Хајде да напишемо мали клијент за алпхавантаге на аиохттп са захтевима за крајње тачке које су нам потребне.
- Хајде да направимо агента који ће прикупљати податке о хартијама од вредности и историјским ценама за њих.
Извор: ввв.хабр.цом