Hannergrond Aufgaben op Faust, Deel I: Eng Aféierung

Hannergrond Aufgaben op Faust, Deel I: Eng Aféierung

Wéi sinn ech komm fir esou ze liewen?

Net viru laanger Zäit hunn ech um Backend vun engem héichbelaaschte Projet ze schaffen, an deem et néideg war, déi regelméisseg Ausféierung vun enger grousser Unzuel vun Hannergrondaufgaben mat komplexe Berechnungen an Ufroe fir Drëtt-Partei-Servicer ze organiséieren. De Projet ass asynchron a ier ech komm sinn, hat et en einfache Mechanismus fir Cron-Start Aufgaben: eng Loop déi aktuell Zäit iwwerpréift a Gruppe vu Coroutines iwwer Sammelen lancéiert - dës Approche huet sech als akzeptabel erausgestallt bis et Dosende an Honnerte vu sou Coroutine goufen , Wéi och ëmmer, wann hir Zuel zweedausend iwwerschratt ass, hunn ech missen nodenken, eng normal Taskschlaang mat engem Broker, e puer Aarbechter, a sou weider ze organiséieren.

Als éischt hunn ech decidéiert Sellerie auszeprobéieren, déi ech virdru benotzt hunn. Wéinst der asynchroner Natur vum Projet hunn ech an d'Fro gedaucht a gesinn Artikelwéi och Projet, erstallt vum Auteur vum Artikel.

Ech wäert dat soen, de Projet ass ganz interessant a funktionnéiert ganz erfollegräich an aneren Applikatiounen vun eisem Team, an den Auteur selwer seet datt hien et an d'Produktioun konnt ausrollen andeems en asynchrone Pool benotzt. Awer leider huet et mir net wierklech gepasst, wéi et sech erausstellt ee Problem mat Gruppstart vun Aufgaben (kuckt. Grupp). Zu der Zäit vum Schreiwen Fro ass schonn zou, et gëtt awer säit engem Mount geschafft. Op jidde Fall, dem Auteur vill Gléck an alles Guddes, well et gëtt schonn Aarbechten um Lib ... am Allgemengen, de Punkt ass an mech an d'Tool huet sech fir mech fiicht. Zousätzlech haten e puer Aufgaben 2-3 http Ufroe fir verschidde Servicer, also och wann Dir Aufgaben optiméiert, kreéiere mir 4 dausend TCP Verbindungen, ongeféier all 2 Stonnen - net ganz gutt ... Ech wéilt eng Sessioun fir eng Zort vun Aufgab beim Start vun Aarbechter. E bësse méi iwwert déi grouss Zuel vun Demanden via aiohttp hei.

An dëser Hisiicht hunn ech ugefaang ze sichen Alternativen an et fonnt! D'Creatoren vun Sellerie, speziell, wéi ech et verstinn Frot Solem, geschaf gouf FAUST, ursprénglech fir de Projet robinhood. Faust ass inspiréiert vu Kafka Streams a schafft mam Kafka als Broker, rocksdb gëtt och benotzt fir Resultater aus der Aarbecht vun Agenten ze späicheren, an dat Wichtegst ass datt d'Bibliothéik asynchron ass.

Och kënnt Dir kucken séiere Verglach Sellerie a Faust vun de Schëpfer vun der leschter: hir Differenzen, Differenzen tëscht Broker, Ëmsetzung vun enger elementarer Aufgab. Alles ass ganz einfach, awer eng flott Feature am Faust zitt Opmierksamkeet - getippten Daten fir d'Iwwerdroung zum Thema.

Wat maache mir?

Also, an enger kuerzer Serie vun Artikelen, wäert ech Iech weisen wéi Dir Daten aus Hannergrond Aufgaben sammelt mat Faust. D'Quell fir eise Beispillprojet wäert sinn, wéi den Numm et scho seet, alphavantage.co. Ech weisen wéi een Agenten schreift (Sink, Themen, Partitionen), wéi een regelméisseg (Cron) Ausféierung mécht, déi bequemste Faust Cli Kommandoen (e Wrapper iwwer Klick), einfache Clustering, an um Enn befestegt mir en Datadog ( aus der Këscht schaffen) a probéiert eppes ze gesinn. Fir déi gesammelten Donnéeën ze späicheren benotze mir mongodb a Motor fir Verbindung.

PS Beuerteelt no dem Vertrauen mat deem de Punkt iwwer d'Iwwerwaachung geschriwwe gouf, denken ech datt de Lieser um Enn vum leschten Artikel nach ëmmer esou ausgesäit:

Hannergrond Aufgaben op Faust, Deel I: Eng Aféierung

Projet Ufuerderunge

Wéinst der Tatsaach, datt ech scho versprach hunn, loosst eis eng kleng Lëscht maachen wat de Service maache soll:

  1. Eroplueden Wäertpabeieren an en Iwwerbléck vun hinnen (och Gewënn a Verloschter, Bilan, Cash Flow - fir d'lescht Joer) - regelméisseg
  2. Eroplueden historesch Donnéeën (fir all Handelsjoer, fannt extrem Wäerter vum Ofschlosspräis vum Handel) - regelméisseg
  3. Eroplueden lescht Handelsdaten - regelméisseg
  4. Luet eng personaliséiert Lëscht vun Indikatoren fir all Sécherheet erop - regelméisseg

Wéi erwaart, wielt mir en Numm fir de Projet vun Null: Horton

Mir preparéieren d'Infrastruktur

Den Titel ass sécherlech staark, awer alles wat Dir maache musst ass eng kleng Configuratioun fir Docker-Compose mat Kafka (an Zookeeper - an engem Container), kafdrop (wa mir Messagen an Themen kucke wëllen), mongodb schreiwen. Mir kréien [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) vun der folgender 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

Et gëtt näischt komplizéiert hei iwwerhaapt. Zwee Nolauschterer goufen fir Kafka deklaréiert: een (intern) fir am Komposit-Netz ze benotzen, an déi zweet (extern) fir Ufroe vu baussen, sou datt se et dobausse weiderginn. 2181 - Zookeeper Hafen. De Rescht, mengen ech, ass kloer.

Virbereedung vum Skelett vum Projet

An der Basisversioun soll d'Struktur vun eisem Projet esou ausgesinn:

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 *

*Alles wat ech notéiert hunn Mir beréieren et nach net, mir erstellen just eidel Dateien.**

Mir hunn eng Struktur erstallt. Loosst eis elo déi néideg Ofhängegkeeten addéieren, d'Konfiguratioun schreiwen a mat mongodb verbannen. Ech ginn net de ganzen Text vun den Dateien am Artikel, fir et net ze verzögeren, awer ech ginn Linken op déi néideg Versiounen.

Loosst eis mat Ofhängegkeeten a Meta iwwer de Projet ufänken - pyproject.toml

Als nächst fänken mir Ofhängegkeeten z'installéieren an e virtualenv ze kreéieren (oder Dir kënnt de venv Dossier selwer erstellen an d'Ëmfeld aktivéieren):

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

Loosst eis elo erstellen config.yml - Umeldungsinformatiounen a wou ze klappen. Dir kënnt direkt Daten fir Alphavantage do Plaz. Gutt, loosst eis weidergoen config.py - Extrait Daten fir d'Applikatioun aus eiser Configuratioun. Jo, ech zouginn, ech hunn mäi Lib benotzt - Sitri.

Wann Dir mat Mongo verbënnt, ass alles ganz einfach. ugekënnegt Client Klass ze verbannen an Basis Klass fir Cruds, fir et méi einfach ze maachen Ufroen op Sammlungen ze maachen.

Wat wäert dann geschéien?

Den Artikel ass net ganz laang, well ech hei nëmmen iwwer Motivatioun a Virbereedung schwätzen, also schued mech net - ech verspriechen datt den nächsten Deel Handlung a Grafiken huet.

Also, an dësem ganz nächsten Deel mir:

  1. Loosst eis e klenge Client fir Alphavantage op aiohttp schreiwen mat Ufroe fir d'Endpunkte déi mir brauchen.
  2. Loosst eis en Agent erstellen deen Daten iwwer Wäertpabeieren an historesch Präisser fir si sammelt.

Projet Code

Code fir dësen Deel

Source: will.com

Setzt e Commentaire