Taustatehtävät Faustista, osa I: Johdanto

Taustatehtävät Faustista, osa I: Johdanto

Miten päädyin elämään tuollaista?

Jouduin vähän aikaa sitten työskentelemään erittäin kuormitetun projektin taustalla, jossa oli tarpeen järjestää useiden taustatehtävien säännöllinen suorittaminen monimutkaisilla laskelmilla ja kolmannen osapuolen palvelupyynnöillä. Projekti on asynkroninen ja ennen tuloani siinä oli yksinkertainen mekanismi cron-käynnistystehtäviin: silmukka, joka tarkastaa kellonajan ja käynnistää korutiiniryhmiä kerän kautta - tämä lähestymistapa osoittautui hyväksyttäväksi, kunnes tällaisia ​​​​korutiineja oli kymmeniä ja satoja , kun niiden määrä kuitenkin ylitti kaksituhatta, jouduin miettimään normaalin tehtäväjonon järjestämistä välittäjän, useiden työntekijöiden ja niin edelleen.

Ensin päätin kokeilla Seleria, jota olin käyttänyt aiemmin. Projektin asynkronisen luonteen vuoksi sukelsin kysymykseen ja näin ArtikkeliSekä hanke, jonka on luonut artikkelin kirjoittaja.

Sanon tämän, että projekti on erittäin mielenkiintoinen ja toimii melko menestyksekkäästi muissa tiimimme sovelluksissa, ja kirjoittaja itse kertoo pystyneensä viemään sen tuotantoon asynkronisen poolin avulla. Mutta valitettavasti se ei todellakaan sopinut minulle, kuten kävi ilmi ongelma tehtävien ryhmäkäynnistyksellä (katso. ryhmä). Kirjoitushetkellä kysymys on jo suljettu, mutta työ on jatkunut kuukauden. Joka tapauksessa onnea kirjoittajalle ja kaikkea hyvää, sillä libillä on jo työntäyteisiä asioita...yleensä pointti on minussa ja työkalu osoittautui minulle kosteaksi. Lisäksi joissain tehtävissä oli 2-3 http-pyyntöä eri palveluihin, joten tehtäviä optimoitaessakin luodaan 4 tuhatta TCP-yhteyttä, noin 2 tunnin välein - ei kovin hyvä... Haluaisin luoda istunnon yhdelle tyypille tehtäviä aloittaessaan työntekijöitä. Hieman lisää aiohttp:n kautta tehtyjen pyyntöjen suuresta määrästä täällä.

Tältä osin aloin etsimään vaihtoehtoja ja löytyi! Nimenomaan sellerin luojat, kuten minä sen ymmärrän Kysy Solemilta, luotiin Faust, alun perin projektia varten Robin Hood. Faust on Kafka Streamsin inspiroima ja toimii Kafkan kanssa välittäjänä, rocksdb:tä käytetään myös agenttien työn tulosten tallentamiseen, ja tärkeintä on, että kirjasto on asynkroninen.

Voit myös katsoa nopea vertailu selleri ja faust jälkimmäisen tekijöiltä: niiden erot, välittäjien väliset erot, alkeellisen tehtävän toteutus. Kaikki on melko yksinkertaista, mutta mukava ominaisuus Faustissa kiinnittää huomiota - kirjoitetut tiedot lähetettäväksi aiheeseen.

Mitä me teemme?

Joten lyhyessä artikkelisarjassa näytän sinulle, kuinka voit kerätä tietoja taustatehtävistä Faustin avulla. Esimerkkiprojektimme lähde on, kuten nimestä voi päätellä, alphavantage.co. Näytän agenttien kirjoittamisen (sink, aiheet, osiot), säännöllisen (cron) suorituksen, kätevimmät faust cli -komennot (wrapper over click), yksinkertaisen klusteroinnin ja lopuksi liitämme datakoiran ( työskentely valmiina) ja yritä nähdä jotain. Kerättyjen tietojen tallentamiseen käytämme mongodb:tä ja moottoria yhteyden muodostamiseen.

PS Tarkasteltaessa sitä luottamusta, jolla tarkkailua koskeva kohta kirjoitettiin, uskon, että lukija viimeisen artikkelin lopussa näyttää edelleen suunnilleen tältä:

Taustatehtävät Faustista, osa I: Johdanto

Hankkeen vaatimukset

Koska olen jo luvannut, tehdään pieni lista siitä, mitä palvelun pitäisi pystyä:

  1. Lataa arvopapereita ja yleiskatsaus niistä (mukaan lukien voitot ja tappiot, tase, kassavirta - viimeiseltä vuodelta) - säännöllisesti
  2. Lataa historialliset tiedot (jokaiselle kaupankäyntivuodelle, etsi kaupankäynnin päätöshinnan ääriarvot) - säännöllisesti
  3. Lataa uusimmat kaupankäyntitiedot - säännöllisesti
  4. Lataa mukautettu luettelo kunkin tietoturvan indikaattoreista - säännöllisesti

Kuten odotettiin, valitsemme projektille nimen tyhjästä: Horton

Valmistelemme infrastruktuuria

Otsikko on varmasti vahva, mutta sinun tarvitsee vain kirjoittaa pieni konfiguraatio docker-composelle kafka (ja zookeeper - yhdessä säiliössä), kafdrop (jos haluamme katsoa viestejä aiheissa), mongodb. Saamme [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) seuraavassa muodossa:

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

Tässä ei ole ollenkaan mitään monimutkaista. Kafkalle ilmoitettiin kaksi kuuntelijaa: yksi (sisäinen) käytettäväksi yhdistelmäverkon sisällä ja toinen (ulkoinen) ulkopuolelta tulevia pyyntöjä varten, joten he välittivät sen eteenpäin. 2181 - eläintarhanhoitajan satama. Loput on mielestäni selvää.

Projektin rungon valmistelu

Perusversiossa projektimme rakenteen pitäisi näyttää tältä:

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 *

*Kaikki mitä huomautin Emme koske siihen vielä, luomme vain tyhjiä tiedostoja.**

Loimme rakenteen. Lisätään nyt tarvittavat riippuvuudet, kirjoitetaan konfiguraatio ja yhdistetään mongodb. En anna artikkelissa olevien tiedostojen koko tekstiä, jotta se ei viivästyisi, mutta annan linkit tarvittaviin versioihin.

Aloitetaan riippuvuuksista ja metasta projektista - pyproject.toml

Seuraavaksi aloitamme riippuvuuksien asentamisen ja virtualenv:n luomisen (tai voit luoda venv-kansion itse ja aktivoida ympäristön):

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

Nyt luodaan config.yml - Valtuustiedot ja minne koputtaa. Sinne voi heti sijoittaa tiedot alfaetulle. No, siirrytään asiaan config.py - poimi sovelluksen tiedot konfiguraatiostamme. Kyllä, myönnän, käytin lib - sitri.

Kun muodostat yhteyden Mongoon, kaikki on melko yksinkertaista. ilmoitti asiakasluokka yhdistämään ja perusluokka crudsille, jotta kokoelmista olisi helpompi tehdä kyselyitä.

Mitä seuraavaksi tapahtuu?

Artikkeli ei ole kovin pitkä, koska tässä puhun vain motivaatiosta ja valmistautumisesta, joten älä syytä minua - lupaan, että seuraavassa osassa on toimintaa ja grafiikkaa.

Joten, tässä aivan seuraavassa osassa:

  1. Kirjoitetaan pieni asiakas alfavantagelle aiohttp:lle, jossa pyydetään tarvitsemiamme päätepisteitä.
  2. Luodaan agentti, joka kerää tietoja arvopapereista ja niiden historiallisista hinnoista.

Projektikoodi

Koodi tälle osalle

Lähde: will.com

Lisää kommentti