Základné úlohy o Faustovi, I. časť: Úvod

Základné úlohy o Faustovi, I. časť: Úvod

Ako som prišiel k takémuto životu?

Nie je to tak dávno, čo som musel pracovať na backende vysoko zaťaženého projektu, v ktorom bolo potrebné organizovať pravidelné vykonávanie veľkého množstva úloh na pozadí so zložitými výpočtami a požiadavkami na služby tretích strán. Projekt je asynchrónny a predtým, ako som prišiel, mal jednoduchý mechanizmus na spúšťanie úloh: slučku kontrolujúcu aktuálny čas a spúšťanie skupín korutínov prostredníctvom zberu – tento prístup sa ukázal ako prijateľný, kým takýchto korutínov neboli desiatky a stovky. , no keď ich počet presiahol dvetisíc, musel som rozmýšľať nad zorganizovaním normálneho poradia úloh s maklérom, niekoľkými pracovníkmi a pod.

Najprv som sa rozhodla vyskúšať zeler, ktorý som predtým používala. Vzhľadom na asynchrónny charakter projektu som sa ponoril do otázky a videl статьюRovnako ako projekt, ktorú vytvoril autor článku.

Poviem to tak, že projekt je veľmi zaujímavý a celkom úspešne funguje aj v iných aplikáciách nášho tímu a sám autor hovorí, že ho dokázal rozvinúť do produkcie pomocou asynchrónneho poolu. Ale, žiaľ, mi to veľmi nevyhovovalo, ako sa ukázalo problém so skupinovým spúšťaním úloh (viď. skupina). V čase písania otázka je už zatvorená, pracuje sa však už mesiac. V kazdom pripade autorovi vela stastia a vsetko dobre, kedze na lib uz funguju veci... vo vseobecnosti je pointa vo mne a nastroj sa mi ukazal ako vlhky. Niektoré úlohy mali navyše 2-3 http požiadavky na rôzne služby, takže aj pri optimalizácii úloh vytvoríme 4 tisíc TCP spojení, približne každé 2 hodiny - nie veľmi dobré... Chcel by som vytvoriť reláciu pre jeden typ úlohu pri nástupe pracovníkov. Trochu viac o veľkom počte žiadostí cez aiohttp tu.

V tomto smere som začal hľadať alternatívy a našiel to! Tvorcovia zeleru, konkrétne, ako to chápem ja Opýtajte sa Solema, bol vytvorený Faust, pôvodne pre projekt Robin Hood. Faust je inšpirovaný Kafka Streams a spolupracuje s Kafkom ako brokerom, rocksdb slúži aj na ukladanie výsledkov z práce agentov a najdôležitejšie je, že knižnica je asynchrónna.

Môžete sa tiež pozrieť rýchle porovnanie zeler a faust od ich tvorcov: ich rozdiely, rozdiely medzi maklérmi, realizácia elementárnej úlohy. Všetko je celkom jednoduché, pozornosť však priťahuje príjemná funkcia vo fauste - typizované údaje na prenos k téme.

Čo urobíme?

V krátkej sérii článkov vám teda ukážem, ako zbierať dáta z úloh na pozadí pomocou Fausta. Zdrojom pre náš vzorový projekt bude, ako už názov napovedá, alphavantage.co. Ukážem ako písať agentov (sink, témy, partície), ako robiť bežné (cron) spúšťanie, najpohodlnejšie faust cli príkazy (wrap over click), jednoduché klastrovanie a na záver pripojíme datadog ( po vybalení z krabice) a pokúsiť sa niečo vidieť. Na ukladanie zozbieraných údajov použijeme mongodb a motor na pripojenie.

PS Súdiac podľa sebadôvery, s akou bol bod o monitorovaní napísaný, si myslím, že čitateľ na konci minulého článku bude stále vyzerať asi takto:

Základné úlohy o Faustovi, I. časť: Úvod

Požiadavky projektu

Vzhľadom na to, že som už sľúbil, urobme si malý zoznam toho, čo by služba mala vedieť:

  1. Nahrávajte cenné papiere a ich prehľad (vrátane ziskov a strát, súvahy, cash flow - za posledný rok) - pravidelne
  2. Nahrávajte historické údaje (pre každý obchodný rok nájdite extrémne hodnoty uzatváracej ceny obchodovania) - pravidelne
  3. Nahrávajte najnovšie obchodné údaje – pravidelne
  4. Nahrajte prispôsobený zoznam indikátorov pre každé zabezpečenie – pravidelne

Ako sa očakávalo, vyberáme názov projektu od začiatku: Horton

Pripravujeme infraštruktúru

Názov je určite silný, stačí však napísať malú konfiguráciu pre docker-compose s kafka (a zookeeper - v jednom kontajneri), kafdrop (ak sa chceme pozrieť na správy v témach), mongodb. Dostaneme [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) v nasledujúcom formulári:

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

Nie je tu vôbec nič zložité. Pre kafku boli deklarovaní dvaja poslucháči: jeden (interný) na použitie vo vnútri zloženej siete a druhý (externý) na požiadavky zvonku, takže to preposlali von. 2181 — prístav pre strážcov zoologickej záhrady. Ostatné je myslím jasné.

Príprava kostry projektu

V základnej verzii by štruktúra nášho projektu mala vyzerať takto:

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 *

*Všetko, čo som si všimol Zatiaľ sa ho nedotýkame, iba vytvárame prázdne súbory.**

Vytvorili sme štruktúru. Teraz pridáme potrebné závislosti, napíšeme konfiguráciu a pripojíme sa k mongodb. Úplné znenie súborov v článku neuvediem, aby som to nezdržiaval, ale poskytnem odkazy na potrebné verzie.

Začnime so závislosťami a meta o projekte - pyproject.toml

Ďalej začneme inštalovať závislosti a vytvárať virtualenv (alebo si môžete sami vytvoriť priečinok venv a aktivovať prostredie):

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

Teraz poďme tvoriť config.yml - Poverenia a kde zaklopať. Môžete tam okamžite umiestniť údaje pre alphavantage. No poďme ďalej config.py — extrahujte údaje pre aplikáciu z našej konfigurácie. Áno, priznávam, použil som svoju slobodu - Sitra.

Pri pripojení k Mongo je všetko celkom jednoduché. oznámil trieda klientov pripojiť a základná trieda pre crud, aby sa uľahčilo zadávanie dotazov na zbierky.

čo bude ďalej?

Článok nie je príliš dlhý, keďže tu hovorím len o motivácii a príprave, takže mi to nevyčítajte - sľubujem, že ďalšia časť bude mať akciu a grafiku.

Takže v tejto ďalšej časti:

  1. Napíšme malého klienta pre alphavantage na aiohttp s požiadavkami na koncové body, ktoré potrebujeme.
  2. Vytvorme si agenta, ktorý za ne bude zbierať údaje o cenných papieroch a historických cenách.

Kód projektu

Kód pre túto časť

Zdroj: hab.com

Pridať komentár