
Kuidas ma sellesse elusse jÔudsin?
Hiljuti pidin töötama kĂ”rgelt koormatud projekti backend'i kallal, kus tuli korraldada regulaarne suurte arvutuste ja kolmandate osapoolte teenustele tehtud pĂ€ringutega taustatööde tĂ€itmine. Projekt on asĂŒnkroonne ja enne minu saabumist oli seal lihtne cron'i mehhanism ĂŒlesannete kĂ€ivitamiseks: tsĂŒkkel, mis kontrollis praegust aega ja kĂ€ivitas gruppide kaupa korutineid gather kaudu â selline lĂ€henemine osutus vastuvĂ”etavaks kuni hetkeni, mil korutineid oli kĂŒmneid ja sadu, kuid kui nende arv ĂŒletas kahe tuhande, tuli mĂ”elda normaalsete ĂŒlesannete jĂ€rjekorra korraldamisele koos vahendajaga, mitme töökatkestaja ja muu vajalikuga.
Alguses otsustasin proovida Celery't, mida olin varem kasutanud. Seoses projekti asĂŒnkroonsusega, sukeldusin kĂŒsimusele ja nĂ€gin , samuti , mille lĂ”i artikli autor.
Nii et, projekt on vĂ€ga huvitav ja töötab ĂŒsna edukalt meie meeskonna teistes rakendustes, ja autor ĂŒtleb ise, et suudab selle tootmisse viia, kasutades asĂŒnkroonset puli. Kuid kahjuks ei sobinud see mulle vĂ€ga, kuna ilmus vĂ€lja ĂŒlesannete grupi kĂ€ivitamine (vt. ). Artikli kirjutamise hetkeks oli juba suletud, kuid töö kĂ€idi kuu jooksul. Igal juhul, autorile edu ja kĂ”ike head, sest töötavad asjad sellel teekeerates on juba olemas... KokkuvĂ”ttes, probleem oli minus ja see tööriist tundus mulle veidi toores. Lisaks oli mĂ”nedes ĂŒlesannetes 2-3 http-pĂ€ringut erinevatele teenustele, seega isegi ĂŒlesannete optimeerimisel loome 4000 tcpĂŒhendust ligikaudu iga kahe tunni tagant â ei midagi head... Sooviksin luua sessiooni ĂŒhe tĂŒĂŒpi ĂŒlesannete kĂ€ivitamisel töökatkestajate jaoks. Veidi rohkem suurest hulgast pĂ€ringutest aiohttp kaudu .
SeetĂ”ttu hakkasin otsima alternatiive ja leidsin! Celery looja poolt, kuidas ma aru sain , loodi , esialgu projekti jaoks . Faust on kirjutatud Kafka Streams'i muljetel ja töötab Kafka vahendajana, samuti kasutatakse rocksdb tulemuste salvestamiseks, ja mis kĂ”ige tĂ€htsam â see teek on asĂŒnkroon.
Samuti, vĂ”ite vaadata Celery ja Faust viimasest loojatest: nende erinevused, erinevused vahendite vahel, elementaarse ĂŒlesande rakendamine. KĂ”ik on ĂŒsna lihtne, kuid Faustis tĂ”mbab pilku meeldiv omadus â tĂŒĂŒbistatud andmed teema edastamiseks.
Mida me teeme?
Nii et vĂ€ikese artiklite seeria jooksul nĂ€itan, kuidas koguda andmeid taust ĂŒlesannetes, kasutades Fausti. Meie nĂ€idisprojekti allikaks on, nagu nimigi ĂŒtleb, . NĂ€itan, kuidas kirjutada agente (sink, teemad, jaotised), kuidas teha regulaarselt (cron) tĂ€itmist, mugavaid fausti CLI-kĂ€ske (wrapper click'i kohal), lihtsat klastreerimist ning lĂ”puks ĂŒhendame Datadogi (karbis töötav) ja proovime midagi nĂ€ha. Kogutud andmete salvestamiseks kasutame MongoDB-d ja Motori ĂŒhendamiseks.
P.S. Kohaselt seda jÀlgimise punkti kirjutamise enesekindluse pÔhjal arvan, et lugeja nÀeb viimasest artiklist lÔpuks vÀlja umbes nii:

ProjektinÔuded
Kuna olen juba mÔningaid lubadusi andnud, koostame vÀikese nimekirja sellest, mida teenus peaks suutma:
- VĂ€ljastama vÀÀrtpaberid ja ĂŒlevaate nende kohta (sh kasum ja kahjum, bilanss, rahavoog â viimase aasta jooksul) â regulaarselt
- VĂ€ljastama ajaloolisi andmeid (iga kaubandusaasta jaoks leidma sulgemishinna ÀÀrmused) â regulaarselt
- VĂ€ljastama viimaseid kauplemisandmeid â regulaarselt
- VĂ€ljastama kohandatud nimekirja indikaatoritest igale vÀÀrtpaberile â regulaarselt
Nagu ikka, valime projekti nime suvaliselt: horton
Valmistame infrastruktuuri ette
Pealkiri on muidugi tugev, kuid kĂ”ik, mida peame tegema, on kirjutada vĂ€ike konfiguraatsioon docker-compose'i jaoks koos Kafka (ja Zookeeperiga â ĂŒhes konteineris), Kafdrop (kui tahame vaadata sĂ”numeid teemades), MongoDB. Saame [docker-compose.yml]() jĂ€rgmise vĂ€ljanĂ€gemisega:
versioon: '3'
teenused:
db:
konteineri_nimi: horton-mongodb-local
pilt: mongo:4.2-bionic
kÀsud: mongod --port 20017
taaskÀivita: alati
sadamad:
- 20017:20017
keskkond:
- MONGO_INITDB_DATABASE=horton
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin_password
kafka-service:
konteineri_nimi: horton-kafka-local
pilt: obsidiandynamics/kafka
taaskÀivita: alati
sadamad:
- "2181:2181"
- "9092:9092"
keskkond:
KAFKA_LISTENERS: "INTERNAAL://:29092,VĂLINE://:9092"
KAFKA_ADVERTISED_LISTENERS: "INTERNAAL://kafka-service:29092,VĂLINE://localhost:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAAL:PLAINTEXT,VĂLINE:PLAINTEXT"
KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAAL"
KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
KAFKA_RESTART_ATTEMPTS: "10"
KAFKA_RESTART_DELAY: "5"
ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"
kafdrop:
konteineri_nimi: horton-kafdrop-local
pilt: 'obsidiandynamics/kafdrop:latest'
taaskÀivita: alati
sadamad:
- '9000:9000'
keskkond:
KAFKA_BROKERCONNECT: kafka-service:29092
sÔltub:
- kafka-serviceSiin pole midagi keerulist. Kafka jaoks on mÀÀratud kaks kuulajat: ĂŒks (sisemine) komposiitvĂ”rgus kasutamiseks, teine (vĂ€line) vĂ€ljastpoolt pĂ€ringute jaoks, seega suunati see vĂ€ljapoole. 2181 on zookeeperi port. Muus osas on ilmselt kĂ”ik selge.
Valmistame projekti raamistikku
Baasi variandi puhul peaks meie projekti struktuur vÀlja nÀgema nii:
horton
âââ docker-compose.yml
âââ horton
âââ agents.py *
âââ alphavantage.py *
âââ app.py *
âââ config.py
âââ andmebaas
â  âââ connect.py
â  âââ cruds
â  â  âââ base.py
â  â  âââ __init__.py
â  â  âââ security.py *
â  âââ __init__.py
âââ __init__.py
âââ records.py *
âââ tasks.py **KĂ”ik, mida ma mĂ€rkisin me ei puutu praegu, vaid loome lihtsalt tĂŒhjad failid.**
Struktuur on loodud. NĂŒĂŒd lisame vajalikud sĂ”ltuvused, kirjutame konfi ja ĂŒhendame mongodb-ga. TĂ€ielikku faili sisu artiklis ei too, et mitte liiga pikaks venida, vaid lisan lingid vajalikele versioonidele.
Alustame sĂ”ltuvustest ja projekti metaandmetest â
SeejÀrel kÀivitame sÔltuvuste installimise ja virtualenv loomise (vÔi saate ise luua kausta venv ja aktiveerida keskkonna):
pip3 install poetry (kui veel ei ole paigaldatud)
poetry installNĂŒĂŒd loome â autentimisandmed ja kuhu ĂŒhenduda. Kohe saab sinna paigutada ka andmed alphavantage'i jaoks. NĂŒĂŒd liigume edasi â ekstraktsime rakenduse andmed meie konfiguratsioonist. Jah, kahetsen, aga kasutasin oma teeki â .
Mongo ĂŒhenduse osas on kĂ”ik tĂ”esti lihtne. Oleme mÀÀranud ĂŒhendamiseks ja CRUD-de jaoks, et teha kollektiivide tĂ€itmine lihtsamaks.
Mis hakkab edasi juhtuma?
Artikkel sai mitte vĂ€ga suur, kuna rÀÀgin siin ainult motiveerimisest ja ettevalmistusest, seega Ă€rge pahandage â luban, et jĂ€rgmises osas on tegevust ja graafikat.
Nii et jÀrgmises osas teeme jÀrgmist:
- Kirjutame vÀikese kliendi alphavantage jaoks aiohttp'ga ning teeme pÀringud vajalikele otsingupunktidele.
- Loome agendi, mis kogub andmeid vÀÀrtpaberite kohta ja nende ajaloolisi hindu.
Allikas: habr.com
