Fona uzdevumi par Faustu, I daļa: Ievads

Fona uzdevumi par Faustu, I daļa: Ievads

Kā es nonācu līdz Ŕādai dzīvei?

Pirms neilga laika man bija jāstrādā pie ļoti noslogota projekta aizmugures, kurā bija jāorganizē regulāra liela skaita fona uzdevumu izpilde ar sarežģītiem aprēķiniem un treÅ”o puÅ”u pakalpojumu pieprasÄ«jumiem. Projekts ir asinhrons, un pirms es atnācu, tam bija vienkārÅ”s mehānisms cron palaiÅ”anas uzdevumiem: cilpa, kas pārbauda paÅ”reizējo laiku un palaist korutÄ«nu grupas, izmantojot apkopoÅ”anu - Ŕī pieeja izrādÄ«jās pieņemama, kamēr nebija desmitiem un simtiem Ŕādu korutÄ«nu. , tomēr, kad to skaits pārsniedza divus tÅ«kstoÅ”us, nācās domāt par parastu uzdevumu rindas organizÄ“Å”anu ar brokeri, vairākiem strādniekiem utt.

Vispirms nolēmu izmēģināt Selerijas, ko izmantoju iepriekÅ”. Projekta asinhronā rakstura dēļ es iedziļinājos jautājumā un redzēju rakstsKā arÄ« projekts, ko veidojusi raksta autore.

TeikÅ”u tā, projekts ir ļoti interesants un diezgan veiksmÄ«gi darbojas arÄ« citās mÅ«su komandas lietojumprogrammās, un pats autors stāsta, ka viņŔ to spējis izrullēt ražoÅ”anā, izmantojot asinhrono pÅ«lu. Bet diemžēl tas man Ä«sti nederēja, kā izrādÄ«jās problēma ar grupu uzdevumu palaiÅ”anu (sk. grupa). RakstÄ«Å”anas laikā izdot ir jau slēgts, tomēr darbs norit jau mēnesi. Katrā ziņā veiksmi autoram un visu to labāko, jo uz lib jau ir darba lietas...vispār jau punkts ir manÄ« un instruments man izrādÄ«jās mitrs. Turklāt dažiem uzdevumiem bija 2-3 http pieprasÄ«jumi dažādiem servisiem, tāpēc pat optimizējot uzdevumus, mēs izveidojam 4 tÅ«kstoÅ”us TCP savienojumu, apmēram ik pēc 2 stundām - ne pārāk labi... Vēlos izveidot sesiju viena veida uzdevums, uzsākot darbiniekus. Nedaudz vairāk par lielo pieprasÄ«jumu skaitu, izmantojot aiohttp Å”eit.

Å ajā sakarā es sāku meklēt alternatÄ«vas un atrada! Seleriju radÄ«tāji, konkrēti, kā es saprotu Jautājiet Solem, tika izveidots Fausts, sākotnēji projektam robinhood. Fausts ir iedvesmots no Kafka Streams un strādā ar Kafku kā brokeri, rocksdb tiek izmantots arÄ« aÄ£entu darba rezultātu glabāŔanai, un vissvarÄ«gākais ir tas, ka bibliotēka ir asinhrona.

Turklāt jÅ«s varat skatÄ«ties ātrs salÄ«dzinājums selerijas un fausts no pēdējo radÄ«tājiem: to atŔķirÄ«bas, atŔķirÄ«bas starp brokeriem, elementāra uzdevuma izpilde. Viss ir pavisam vienkārÅ”i, tomēr uzmanÄ«bu piesaista jauka Ä«paŔība faustā - drukāti dati pārraidei uz tēmu.

Ko mēs darām?

Tāpēc Ä«sā rakstu sērijā es jums parādÄ«Å”u, kā iegÅ«t datus no fona uzdevumiem, izmantojot Faust. MÅ«su paraugprojekta avots bÅ«s, kā norāda nosaukums, alphavantage.co. ParādÄ«Å”u, kā rakstÄ«t aÄ£entus (sink, tēmas, nodalÄ«jumus), kā veikt regulāru (cron) izpildi, ērtākās faust cli komandas (a wrapper over click), vienkārÅ”u klasterÄ“Å”anu un beigās pievienosim datadog ( strādā ārpus kastes) un mēģiniet kaut ko redzēt. Lai saglabātu savāktos datus, savienojumam izmantosim mongodb un motoru.

PS Spriežot pēc pārliecÄ«bas, ar kādu tika uzrakstÄ«ts punkts par monitoringu, domāju, ka lasÄ«tājs pēdējā raksta beigās tomēr izskatÄ«sies apmēram Ŕādi:

Fona uzdevumi par Faustu, I daļa: Ievads

Projekta prasības

Sakarā ar to, ka esmu jau apsolījis, izveidosim nelielu sarakstu ar to, kas pakalpojumam būtu jāspēj:

  1. AugÅ”upielādējiet vērtspapÄ«rus un pārskatu par tiem (ieskaitot peļņu un zaudējumus, bilanci, naudas plÅ«smu - par pēdējo gadu) - regulāri
  2. AugÅ”upielādējiet vēsturiskos datus (katram tirdzniecÄ«bas gadam atrodiet tirdzniecÄ«bas slēgÅ”anas cenas galējās vērtÄ«bas) - regulāri
  3. AugÅ”upielādējiet jaunākos tirdzniecÄ«bas datus - regulāri
  4. Regulāri augÅ”upielādējiet pielāgotu indikatoru sarakstu katrai droŔībai

Kā paredzēts, mēs izvēlamies projekta nosaukumu no jauna: Horton

Mēs gatavojam infrastruktūru

Virsraksts noteikti ir spēcÄ«gs, tomēr atliek tikai uzrakstÄ«t nelielu konfigurāciju docker-compose ar kafka (un zookeeper - vienā konteinerā), kafdrop (ja gribam skatÄ«t ziņas tēmās), mongodb. Mēs saņemam [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) Ŕādā formā:

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

Å eit vispār nav nekā sarežģīta. Kafka tika deklarēti divi klausÄ«tāji: viens (iekŔējais) lietoÅ”anai saliktajā tÄ«klā un otrs (ārējais) pieprasÄ«jumiem no ārpuses, tāpēc viņi to pārsÅ«tÄ«ja uz āru. 2181 ā€” zoodārza osta. Pārējais, manuprāt, ir skaidrs.

Projekta skeleta sagatavoŔana

Pamata versijā mÅ«su projekta struktÅ«rai vajadzētu izskatÄ«ties Ŕādi:

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 *

*Viss, ko atzÄ«mēju Mēs tam vēl nepieskaramies, mēs tikai izveidojam tukÅ”us failus.**

Mēs izveidojām struktÅ«ru. Tagad pievienosim nepiecieÅ”amās atkarÄ«bas, uzrakstÄ«sim konfigurāciju un izveidosim savienojumu ar mongodb. Rakstā nesniegÅ”u pilnu failu tekstu, lai tas neaizkavētos, bet sniegÅ”u saites uz nepiecieÅ”amajām versijām.

Sāksim ar atkarībām un meta par projektu - pyproject.toml

Tālāk mēs sākam instalēt atkarības un izveidot virtualenv (vai arī varat pats izveidot venv mapi un aktivizēt vidi):

pip3 install poetry (ŠµŃŠ»Šø ŠµŃ‰Ń‘ Š½Šµ устŠ°Š½Š¾Š²Š»ŠµŠ½Š¾)
poetry install

Tagad veidosim config.yml - Akreditācijas dati un kur pieklauvēt. Tur varat nekavējoties ievietot alfavantage datus. Nu, pāriesim pie config.py ā€” izņemiet datus lietojumprogrammai no mÅ«su konfigurācijas. Jā, es atzÄ«stos, es izmantoju savu lib - sitri.

Pieslēdzoties Mongo, viss ir pavisam vienkārÅ”i. paziņoja klientu klase savienot un bāzes klase cruds, lai atvieglotu kolekciju vaicājumu veikÅ”anu.

Kas notiks tālāk?

Raksts nav Ä«paÅ”i garÅ”, jo Å”eit es runāju tikai par motivāciju un sagatavoÅ”anos, tāpēc nepārmetiet mani - apsolu, ka nākamajā daļā bÅ«s darbÄ«ba un grafika.

Tātad, Å”ajā paŔā nākamajā daļā mēs:

  1. Uzrakstīsim nelielu klientu alfavantage vietnei aiohttp ar pieprasījumiem par mums nepiecieŔamajiem galapunktiem.
  2. Izveidosim aģentu, kas apkopos datus par vērtspapīriem un to vēsturiskajām cenām.

Projekta kods

Šīs daļas kods

Avots: www.habr.com

Pievieno komentāru