Kako sam došao da živim ovako?
Nedavno sam morao da radim na backend-u jednog veoma opterećenog projekta, u kojem je bilo potrebno organizovati redovno izvršavanje velikog broja pozadinskih zadataka sa složenim proračunima i zahtevima za usluge treće strane. Projekat je asinhroni i prije nego što sam došao, imao je jednostavan mehanizam za zadatke pokretanja cron-a: petlju koja provjerava trenutno vrijeme i pokreće grupe korutina putem prikupljanja - ovaj pristup se pokazao prihvatljivim sve dok nije bilo desetina i stotina takvih korutina , međutim, kada je njihov broj premašio dvije hiljade, morao sam razmišljati o organiziranju normalnog reda zadataka s brokerom, nekoliko radnika i tako dalje.
Prvo sam odlučila da isprobam celer, koji sam ranije koristila. Zbog asinhrone prirode projekta, zaronio sam u pitanje i vidio
Reći ću ovo, projekat je veoma interesantan i dosta uspešno radi u drugim aplikacijama našeg tima, a sam autor kaže da je uspeo da ga uvede u produkciju korišćenjem asinhronog bazena. Ali, nažalost, nije mi baš odgovaralo, kako se ispostavilo
S tim u vezi, počeo sam da tražim alternative i pronašao ga! Kreatori celera, konkretno, kako ja razumem
Takođe, možete pogledati
Šta da radimo?
Dakle, u kratkoj seriji članaka, pokazat ću vam kako prikupiti podatke iz pozadinskih zadataka koristeći Faust. Izvor za naš primjer projekta bit će, kao što ime sugerira,
PS Sudeći po samopouzdanju sa kojim je napisana poenta o monitoringu, mislim da će čitalac na kraju prošlog članka ipak izgledati otprilike ovako:
Zahtjevi projekta
S obzirom na to da sam već obećao, napravimo malu listu onoga što servis treba da može da uradi:
- Učitajte vrijednosne papire i pregled istih (uključujući dobitke i gubitke, bilans stanja, novčani tok - za prošlu godinu) - redovno
- Prenesite istorijske podatke (za svaku godinu trgovanja pronađite ekstremne vrijednosti zaključne cijene trgovanja) - redovno
- Učitajte najnovije podatke o trgovanju - redovno
- Učitajte prilagođenu listu indikatora za svaku hartiju - redovno
Kao što se i očekivalo, biramo naziv za projekat od nule: Horton
Pripremamo infrastrukturu
Naslov je svakako jak, međutim, sve što treba da uradite je da napišete malu konfiguraciju za docker-compose sa kafka (i zookeeper - u jednom kontejneru), kafdrop (ako želimo da pogledamo poruke u temama), mongodb. Dobijamo [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
Ovdje uopće nema ništa komplikovano. Za kafku su deklarisana dva slušaoca: jedan (interni) za upotrebu unutar kompozitne mreže, a drugi (spoljni) za zahteve izvana, pa su ga prosleđivali van. 2181 — luka čuvara zoološkog vrta. Ostalo je, mislim, jasno.
Priprema skeleta projekta
U osnovnoj verziji, struktura našeg projekta bi trebala izgledati ovako:
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 *
*Sve što sam primetio Još ga ne diramo, samo kreiramo prazne fajlove.**
Napravili smo strukturu. Sada dodajmo potrebne zavisnosti, napišemo konfiguraciju i povežemo se na mongodb. Neću dati puni tekst datoteka u članku, kako ne bih odlagao, ali ću dati veze do potrebnih verzija.
Počnimo sa zavisnostima i meta o projektu -
Zatim počinjemo instalirati ovisnosti i kreirati virtualenv (ili možete sami kreirati venv folder i aktivirati okruženje):
pip3 install poetry (если ещё не установлено)
poetry install
Sada krenimo
Kada se povežete na Mongo, sve je prilično jednostavno. najavio
Šta će biti dalje?
Članak nije jako dugačak, jer ovdje govorim samo o motivaciji i pripremi, pa nemojte mi zamjeriti - obećavam da će sljedeći dio imati akciju i grafiku.
Dakle, u ovom sledećem delu mi:
- Hajde da napišemo mali klijent za alphavantage na aiohttp sa zahtevima za krajnje tačke koje su nam potrebne.
- Hajde da napravimo agenta koji će prikupljati podatke o hartijama od vrednosti i istorijskim cenama za njih.
izvor: www.habr.com