Osnovne naloge o Faustu, I. del: Uvod

Osnovne naloge o Faustu, I. del: Uvod

Kako sem tako živel?

Nedolgo nazaj sem moral delati na zaledju zelo obremenjenega projekta, v katerem je bilo treba organizirati redno izvajanje velikega števila opravil v ozadju z zapletenimi izračuni in zahtevami po storitvah tretjih oseb. Projekt je asinhron in preden sem prišel, je imel preprost mehanizem za opravila zagona crona: zanka, ki preverja trenutni čas in zaganja skupine korutin prek gathera - ta pristop se je izkazal za sprejemljivega, dokler ni bilo na desetine in stotine takšnih korutin , ko pa je njihovo število preseglo dva tisoč, sem moral razmišljati o organizaciji običajne čakalne vrste opravil s posrednikom, več delavci itd.

Najprej sem se odločil preizkusiti zeleno, ki sem jo že uporabljal. Zaradi asinhrone narave projekta sem se poglobil v vprašanje in videl статью, Ne Projekt, ki ga je ustvaril avtor članka.

Rekel bom, da je projekt zelo zanimiv in precej uspešno deluje v drugih aplikacijah naše ekipe, avtor sam pa pravi, da mu ga je uspelo prenesti v produkcijo z uporabo asinhronega bazena. A na žalost mi ni prav ustrezalo, kot se je izkazalo problem s skupinskim zagonom nalog (glej. skupina). V času pisanja vprašanje je že zaprta, dela pa potekajo že en mesec. Vsekakor pa vso srečo avtorju in vse dobro, saj so na libu že delujoče stvari... v glavnem, bistvo je v meni in orodje se mi je izkazalo za mokro. Poleg tega so nekatere naloge imele 2-3 http zahteve do različnih storitev, tako da tudi pri optimizaciji nalog ustvarimo 4 tisoč TCP povezav, približno vsaki 2 uri - ni zelo dobro ... Rad bi ustvaril sejo za eno vrsto opravilo ob začetku delavcev. Še malo o velikem številu povpraševanj preko aiohttp tukaj.

V zvezi s tem sem začel iskati alternative in našel! Ustvarjalci zelene, posebej, kot razumem Vprašaj Solema, je bil ustvarjen Faust, prvotno za projekt Robin Hood. Faust se zgleduje po Kafka Streams in s Kafko sodeluje kot broker, rocksdb se uporablja tudi za shranjevanje rezultatov dela agentov, najpomembnejše pa je, da je knjižnica asinhrona.

Prav tako lahko pogledate hitra primerjava celer in faust od ustvarjalcev slednjega: njihove razlike, razlike med posredniki, izvedba elementarne naloge. Vse je precej preprosto, vendar pozornost pritegne lepa funkcija v faustu - vneseni podatki za prenos na temo.

Kaj počnemo?

Torej, v kratkem nizu člankov vam bom pokazal, kako zbirati podatke iz opravil v ozadju s Faustom. Vir za naš primer projekta bo, kot že ime pove, alphavantage.co. Predstavil bom pisanje agentov (ponor, teme, particije), kako narediti redno (cron) izvajanje, najbolj priročne ukaze faust cli (ovitek nad klikom), preprosto združevanje v gruče in na koncu bomo pripeli datadog ( delo izven škatle) in poskusite nekaj videti. Za shranjevanje zbranih podatkov bomo uporabili mongodb in motor za povezavo.

PS Sodeč po samozavesti, s katero je bila napisana točka o monitoringu, mislim, da bo bralec na koncu zadnjega članka vseeno videti nekako takole:

Osnovne naloge o Faustu, I. del: Uvod

Projektne zahteve

Glede na dejstvo, da sem že obljubil, naredimo majhen seznam tega, kar bi morala storiti:

  1. Nalaganje vrednostnih papirjev in pregled le-teh (vključno z dobički in izgubami, bilanca stanja, denarni tok - za zadnje leto) - redno
  2. Naložite zgodovinske podatke (za vsako trgovalno leto poiščite ekstremne vrednosti zaključne cene trgovanja) - redno
  3. Nalagajte najnovejše podatke o trgovanju – redno
  4. Redno nalagajte prilagojen seznam indikatorjev za vsak vrednostni papir

Po pričakovanjih izberemo ime za projekt iz nič: horton

Pripravljamo infrastrukturo

Naslov je vsekakor močan, a vse kar morate storiti je, da napišete majhno konfiguracijo za docker-compose s kafko (in zookeeper - v enem vsebniku), kafdrop (če želimo gledati sporočila v temah), mongodb. Dobimo [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) v naslednji obliki:

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

Tukaj sploh ni nič zapletenega. Za kafko sta bila prijavljena dva poslušalca: eden (notranji) za uporabo znotraj kompozitnega omrežja in drugi (zunanji) za zahteve od zunaj, zato so ga posredovali ven. 2181 — pristanišče za oskrbnika živalskega vrta. Ostalo je, mislim, jasno.

Priprava okostja projekta

V osnovni različici naj bi struktura našega projekta izgledala takole:

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 *

*Vse, kar sem opazil Tega se še ne dotikamo, samo ustvarjamo prazne datoteke.**

Ustvarili smo strukturo. Zdaj pa dodamo potrebne odvisnosti, napišemo konfiguracijo in se povežemo z mongodb. V članku ne bom navedel celotnega besedila datotek, da ne bi zavlačeval, vendar bom navedel povezave do potrebnih različic.

Začnimo z odvisnostmi in meta o projektu - pyproject.toml

Nato začnemo nameščati odvisnosti in ustvarjati virtualenv (lahko pa sami ustvarite mapo venv in aktivirate okolje):

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

Zdaj pa ustvarjajmo config.yml - Poverilnice in kje potrkati. Tja lahko takoj postavite podatke za alphavantage. No, pojdimo naprej config.py — ekstrahirajte podatke za aplikacijo iz naše konfiguracije. Da, priznam, uporabil sem svoj lib - sitri.

Pri povezovanju z Mongo je vse precej preprosto. napovedal razred strank za povezavo in osnovni razred za cruds, da olajšate poizvedovanje po zbirkah.

Kaj bo potem?

Članek ni zelo dolg, saj tukaj govorim samo o motivaciji in pripravi, zato mi ne zamerite - obljubim, da bo naslednji del vseboval akcijo in grafiko.

Torej, v tem naslednjem delu bomo:

  1. Napišimo majhen odjemalec za alphavantage na aiohttp z zahtevami za končne točke, ki jih potrebujemo.
  2. Ustvarimo agenta, ki bo zbiral podatke o vrednostnih papirjih in zgodovinskih tečajih zanje.

Koda projekta

Koda za ta del

Vir: www.habr.com

Dodaj komentar