Osnovni zadaci o Faustu, dio I: Uvod

Osnovni zadaci o Faustu, dio I: Uvod

Kako sam došao da živim ovako?

Nedavno sam morao da radim na backend-u jednog veoma opterećenog projekta, u kojem je bilo potrebno organizovati redovno izvršavanje velikog broja pozadinskih zadataka sa složenim proračunima i zahtevima za usluge treće strane. Projekat je asinhroni i prije nego što sam došao, imao je jednostavan mehanizam za zadatke pokretanja cron-a: petlju koja provjerava trenutno vrijeme i pokreće grupe korutina putem prikupljanja - ovaj pristup se pokazao prihvatljivim sve dok nije bilo desetina i stotina takvih korutina , međutim, kada je njihov broj premašio dvije hiljade, morao sam razmišljati o organiziranju normalnog reda zadataka s brokerom, nekoliko radnika i tako dalje.

Prvo sam odlučila da isprobam celer, koji sam ranije koristila. Zbog asinhrone prirode projekta, zaronio sam u pitanje i vidio članak, kao i nacrt, kreiran od strane autora članka.

Reći ću ovo, projekat je veoma interesantan i dosta uspešno radi u drugim aplikacijama našeg tima, a sam autor kaže da je uspeo da ga uvede u produkciju korišćenjem asinhronog bazena. Ali, nažalost, nije mi baš odgovaralo, kako se ispostavilo problem sa grupnim pokretanjem zadataka (vidi. grupa). U vrijeme pisanja problem je već zatvoren, međutim, radovi traju već mjesec dana. U svakom slucaju, sretno autoru i sve najbolje, posto na lib-u vec rade stvari... generalno, poenta je u meni i alat mi je ispao vlažan. Osim toga, neki zadaci su imali 2-3 http zahtjeva prema različitim servisima, pa čak i pri optimizaciji zadataka kreiramo 4 hiljade TCP konekcija, otprilike svaka 2 sata - nije baš dobro... Želio bih napraviti sesiju za jednu vrstu zadatak pri započinjanju radnika. Još malo o velikom broju zahtjeva putem aiohttp ovdje.

S tim u vezi, počeo sam da tražim alternative i pronašao ga! Kreatori celera, konkretno, kako ja razumem Pitaj Solema, je napravljeno Faust, izvorno za projekat Robin Hood. Faust je inspirisan Kafka Streams-om i radi sa Kafkom kao brokerom, rocksdb se takođe koristi za skladištenje rezultata rada agenata, a najvažnije je da je biblioteka asinhrona.

Takođe, možete pogledati brzo poređenje celer i faust od tvoraca potonjeg: njihove razlike, razlike među brokerima, implementacija elementarnog zadatka. Sve je prilično jednostavno, međutim, zgodna karakteristika u Faustu privlači pažnju - ukucani podaci za prijenos na temu.

Šta da radimo?

Dakle, u kratkoj seriji članaka, pokazat ću vam kako prikupiti podatke iz pozadinskih zadataka koristeći Faust. Izvor za naš primjer projekta bit će, kao što ime sugerira, alphavantage.co. Pokazat ću kako pisati agente (sink, teme, particije), kako raditi redovno (cron) izvršavanje, najpogodnije faust cli komande (omotač preko klika), jednostavno grupisanje, a na kraju ćemo priložiti datadog ( radeći iz kutije) i pokušajte nešto vidjeti. Za pohranjivanje prikupljenih podataka koristit ćemo mongodb i motor za povezivanje.

PS Sudeći po samopouzdanju sa kojim je napisana poenta o monitoringu, mislim da će čitalac na kraju prošlog članka ipak izgledati otprilike ovako:

Osnovni zadaci o Faustu, dio I: Uvod

Zahtjevi projekta

S obzirom na to da sam već obećao, napravimo malu listu onoga što servis treba da može da uradi:

  1. Učitajte vrijednosne papire i pregled istih (uključujući dobitke i gubitke, bilans stanja, novčani tok - za prošlu godinu) - redovno
  2. Prenesite istorijske podatke (za svaku godinu trgovanja pronađite ekstremne vrijednosti zaključne cijene trgovanja) - redovno
  3. Učitajte najnovije podatke o trgovanju - redovno
  4. Učitajte prilagođenu listu indikatora za svaku hartiju - redovno

Kao što se i očekivalo, biramo naziv za projekat od nule: Horton

Pripremamo infrastrukturu

Naslov je svakako jak, međutim, sve što treba da uradite je da napišete malu konfiguraciju za docker-compose sa kafka (i zookeeper - u jednom kontejneru), kafdrop (ako želimo da pogledamo poruke u temama), mongodb. Dobijamo [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) sljedećeg oblika:

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

Ovdje uopće nema ništa komplikovano. Za kafku su deklarisana dva slušaoca: jedan (interni) za upotrebu unutar kompozitne mreže, a drugi (spoljni) za zahteve izvana, pa su ga prosleđivali van. 2181 — luka čuvara zoološkog vrta. Ostalo je, mislim, jasno.

Priprema skeleta projekta

U osnovnoj verziji, struktura našeg projekta bi trebala izgledati ovako:

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 *

*Sve što sam primetio Još ga ne diramo, samo kreiramo prazne fajlove.**

Napravili smo strukturu. Sada dodajmo potrebne zavisnosti, napišemo konfiguraciju i povežemo se na mongodb. Neću dati puni tekst datoteka u članku, kako ne bih odlagao, ali ću dati veze do potrebnih verzija.

Počnimo sa zavisnostima i meta o projektu - pyproject.toml

Zatim počinjemo instalirati ovisnosti i kreirati virtualenv (ili možete sami kreirati venv folder i aktivirati okruženje):

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

Sada krenimo config.yml - Akreditacije i gde da kucam. Tamo možete odmah postaviti podatke za alphavantage. Pa, idemo dalje config.py — izdvojiti podatke za aplikaciju iz naše konfiguracije. Da, priznajem, koristio sam svoju biblioteku - sitri.

Kada se povežete na Mongo, sve je prilično jednostavno. najavio klijent klasa za povezivanje i bazna klasa za cruds, kako bi se olakšalo postavljanje upita o zbirkama.

Šta će biti dalje?

Članak nije jako dugačak, jer ovdje govorim samo o motivaciji i pripremi, pa nemojte mi zamjeriti - obećavam da će sljedeći dio imati akciju i grafiku.

Dakle, u ovom sledećem delu mi:

  1. Hajde da napišemo mali klijent za alphavantage na aiohttp sa zahtevima za krajnje tačke koje su nam potrebne.
  2. Hajde da napravimo agenta koji će prikupljati podatke o hartijama od vrednosti i istorijskim cenama za njih.

Šifra projekta

Šifra za ovaj dio

izvor: www.habr.com

Dodajte komentar