Taustaülesanded Fausti kohta, I osa: Sissejuhatus

Taustaülesanded Fausti kohta, I osa: Sissejuhatus

Kuidas ma niimoodi elama sain?

Mitte kaua aega tagasi pidin töötama ühe väga koormatud projekti taustal, mille puhul oli vaja korraldada suure hulga taustaülesannete regulaarne täitmine koos keerukate arvutuste ja kolmandate osapoolte teenuste taotlustega. Projekt on asünkroonne ja enne minu tulekut oli sellel lihtne mehhanism cron-käivitusülesannete käivitamiseks: silmus, mis kontrollis praegust aega ja käivitas kogumise kaudu korutiinide rühmad - see lähenemine osutus vastuvõetavaks, kuni selliseid korutiine oli kümneid ja sadu. , aga kui nende arv ületas kahe tuhande, pidin mõtlema tavalise tööjärjekorra korraldamisele maakleri, mitme töölisega jne.

Kõigepealt otsustasin proovida sellerit, mida olin varem kasutanud. Projekti asünkroonsuse tõttu sukeldusin küsimusesse ja nägin artiklitSamuti projekt, mille on loonud artikli autor.

Ütlen nii, projekt on väga huvitav ja töötab üsna edukalt ka teistes meie meeskonna rakendustes ning autor ise ütleb, et suutis selle asünkroonse basseini abil tootmisse viia. Kuid kahjuks see mulle eriti ei sobinud, nagu selgus probleem koos ülesannete käivitamisega rühmas (vt. rühm). Kirjutamise ajal probleem on juba suletud, aga töö on kestnud juba kuu aega. Igal juhul edu autorile ja kõike paremat, kuna libis juba töötavad asjad... üldiselt on asi minus ja tööriist osutus minu jaoks niiskeks. Lisaks oli mõnel ülesandel 2-3 http-päringut erinevatele teenustele, nii et isegi ülesandeid optimeerides loome 4 tuhat TCP-ühendust, umbes iga 2 tunni järel - mitte eriti hea... Sooviksin luua seansi ühte tüüpi teenuste jaoks ülesanne töötajate alustamisel. Natuke lähemalt aiohttp kaudu esitatud taotluste suurest arvust siin.

Sellega seoses hakkasin otsima alternatiive ja leidis selle! Selleri loojad konkreetselt, nagu ma aru saan Küsi Solemilt, loodi Faust, algselt projekti jaoks robinhood. Faust on inspireeritud Kafka Streamsist ja töötab Kafkaga maaklerina, rocksdb-d kasutatakse ka agentide töö tulemuste salvestamiseks ning kõige olulisem on, et raamatukogu oleks asünkroonne.

Lisaks saate vaadata kiire võrdlus seller ja faust viimase loojatelt: nende erinevused, maaklerite erinevused, elementaarse ülesande täitmine. Kõik on üsna lihtne, kuid tähelepanu köidab fausti tore funktsioon - trükitud andmed teemasse edastamiseks.

Mida me siis teeme?

Niisiis näitan teile lühikeses artiklite sarjas, kuidas Fausti abil taustaülesannete andmeid koguda. Meie näidisprojekti allikaks on, nagu nimigi ütleb, alphavantage.co. Näitan, kuidas kirjutada agente (sink, teemad, partitsioonid), kuidas teha tavalist (cron) täitmist, mugavaimaid faust cli käske (ümbris üle klõpsa), lihtsat klasterdamist ja lõpuks lisame andmekoera ( kastist välja töötades) ja proovige midagi näha. Kogutud andmete salvestamiseks kasutame ühenduse loomiseks mongodb-d ja mootorit.

PS Otsustades kindlustunde järgi, millega seirepunkt kirjutati, arvan, et lugeja viimase artikli lõpus näeb siiski välja umbes selline:

Taustaülesanded Fausti kohta, I osa: Sissejuhatus

Projekti nõuded

Kuna olen juba lubanud, teeme väikese nimekirja sellest, mida teenus peaks suutma:

  1. Laadige regulaarselt üles väärtpabereid ja ülevaadet neist (sh kasum ja kahjum, bilanss, rahavoog - viimase aasta kohta)
  2. Laadige üles ajaloolised andmed (iga kauplemisaasta kohta leidke kauplemise sulgemishinna äärmuslikud väärtused) - regulaarselt
  3. Laadige regulaarselt üles uusimaid kauplemisandmeid
  4. Laadige iga väärtpaberi jaoks üles kohandatud indikaatorite loend – regulaarselt

Nagu oodatud, valime projektile nullist nime: Horton

Valmistame ette infrastruktuuri

Pealkiri on kindlasti tugev, aga pole vaja teha muud, kui kirjutada väike konfiguratsioon docker-compose jaoks koos kafkaga (ja zookeeper - ühes konteineris), kafdrop (kui tahame sõnumeid teemade kaupa vaadata), mongodb. Saame [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) järgmisel kujul:

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

Siin pole üldse midagi keerulist. Kafka jaoks deklareeriti kaks kuulajat: üks (sisemine) liitvõrgus kasutamiseks ja teine ​​(väline) väljastpoolt tulevate päringute jaoks, nii et nad edastasid selle väljapoole. 2181 — loomaaiapidaja sadam. Ülejäänu on minu arvates selge.

Projekti luustiku ettevalmistamine

Põhiversioonis peaks meie projekti struktuur välja nägema järgmine:

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 *

*Kõik, mis ma märkisin Me ei puuduta seda veel, loome lihtsalt tühjad failid.**

Tegime struktuuri. Nüüd lisame vajalikud sõltuvused, kirjutame konfiguratsiooni ja loome ühenduse mongodb-ga. Ma ei esita artiklis failide täisteksti, et mitte viivitada, kuid annan linke vajalikele versioonidele.

Alustame projekti sõltuvuste ja metaga - pyproject.toml

Järgmisena alustame sõltuvuste installimist ja virtualenv-i loomist (või saate ise luua venv-kausta ja aktiveerida keskkonna):

pip3 install poetry (если ещё не установлено)
poetry install

Nüüd loome config.yml - Mandaat ja kuhu koputada. Sinna saab kohe panna andmed alfavantage jaoks. Noh, liigume edasi config.py - eraldage rakenduse andmed meie konfiguratsioonist. Jah, ma tunnistan, ma kasutasin oma libi - sitri.

Mongoga ühenduse loomisel on kõik üsna lihtne. teatas kliendiklass ühendada ja baasklass cruds jaoks, et hõlbustada kogude kohta päringute tegemist.

Mis saab edasi?

Artikkel pole kuigi pikk, kuna siin räägin ainult motivatsioonist ja ettevalmistusest, nii et ärge mind süüdistage - luban, et järgmises osas on tegevust ja graafikat.

Niisiis, selles järgmises osas me:

  1. Kirjutame aiohttp-le alfavantage väikekliendi koos meile vajalike lõpp-punktide päringutega.
  2. Loome agendi, kes kogub andmeid väärtpaberite ja nende ajalooliste hindade kohta.

Projekti kood

Selle osa kood

Allikas: www.habr.com

Lisa kommentaar