Faustoari buruzko aurrekariak, I. zatia: sarrera

Faustoari buruzko aurrekariak, I. zatia: sarrera

Nola heldu nintzen horrela bizitzera?

Duela ez asko karga handiko proiektu baten backend-ean lan egin behar izan nuen, eta bertan beharrezkoa zen atzeko planoko zeregin ugariren exekuzio erregularra antolatzea kalkulu konplexuekin eta hirugarrenen zerbitzuen eskaerarekin. Proiektua asinkronoa da eta ni etorri baino lehen, cron-abiarazte-zereginetarako mekanismo sinple bat zeukan: uneko ordua egiaztatzen zuen begizta bat eta gather-en bidez koroutina-taldeak abiarazten zituen - hurbilketa hau onargarria izan zen, hala nola, dozenaka eta ehunka koroutina egon ziren arte. , ordea, haien kopurua bi milatik gorakoa zenean, artekari batekin, hainbat langilerekin eta abarrekin zeregin-ilara normal bat antolatzea pentsatu behar izan nuen.

Lehenik eta behin, aurretik erabiltzen nuen Apioa probatzea erabaki nuen. Proiektuaren izaera asinkronoa zela eta, galderan murgildu eta ikusi nuen artikulu bat, Baita proiektua, artikuluaren egileak sortua.

Hau esango dut, proiektua oso interesgarria dela eta nahiko arrakastatsu funtzionatzen du gure taldeko beste aplikazio batzuetan, eta egileak berak dio ekoizpenera heltzeko gai izan zela pool asinkrono bat erabiliz. Baina, zoritxarrez, ez zitzaidan oso ondo etorri, ondorioztatu zenez arazo bat atazak taldean abiarazteko (ikus. taldea). Idazteko unean alea dagoeneko itxita dago, ordea, hilabete bat daramate lanak. Edonola ere, zorte on egileari eta zorionak, jadanik liburuan lan egiten ari direnez... orokorrean, kontua nire baitan dago eta tresna hezea iruditu zait. Gainera, ataza batzuek zerbitzu ezberdinetarako 2-3 http eskaera zituzten, eta, beraz, zereginak optimizatzean ere, 4 mila TCP konexio sortzen ditugu, gutxi gorabehera 2 orduz behin - ez oso ona... Saio bat sortu nahiko nuke mota baterako. zeregina langileak hastean. Pixka bat gehiago aiohttp bidez egindako eskaera kopuru handiari buruz Hemen.

Alde horretatik, bilatzen hasi nintzen alternatibak eta aurkitu! Apioaren sortzaileak, zehazki, nik ulertzen dudan moduan Galdetu Solemi, sortu zen Faust, jatorriz proiekturako robinhood. Faust Kafka Streams-en inspiratuta dago eta Kafkarekin lan egiten du broker gisa, rocksdb eragileen lanaren emaitzak gordetzeko ere erabiltzen da, eta garrantzitsuena liburutegia asinkronoa dela da.

Gainera, begiratu dezakezu konparazio azkarra apioa eta faust azken hauen sortzaileetatik: haien desberdintasunak, artekarien arteko desberdintasunak, oinarrizko zeregina ezartzea. Dena nahiko sinplea da, hala ere, faust-en eginbide polit batek arreta erakartzen du - gaiari transmititzeko idatzitako datuak.

Zer egiten dugu?

Beraz, artikulu sorta labur batean, Faust erabiliz atzeko zereginetako datuak nola bildu erakutsiko dizut. Gure adibide-proiektuaren iturria izango da, izenak dioen bezala, alphaavantage.co. Agenteak nola idatzi (sink, gaiak, partizioak), exekuzio arrunta (cron) nola egin, faust cli komando erosoenak (bilgarri bat klikaren gainean), clustering sinplea eta amaieran datadog bat erantsiko dugu ( kaxatik lan egiten) eta saiatu zerbait ikusten. Bildutako datuak gordetzeko mongodb eta motor erabiliko ditugu konexiorako.

PS Jarraipenari buruzko puntua idatzi den konfiantza ikusita, azken artikuluaren amaierako irakurleak honelako itxura izango duela uste dut:

Faustoari buruzko aurrekariak, I. zatia: sarrera

Proiektuaren baldintzak

Dagoeneko hitzeman dudanez, egin dezagun zerrenda txiki bat zer egin behar duen zerbitzuak:

  1. Kargatu baloreak eta horien ikuspegi orokorra (irabaziak eta galerak, balantzea, diru-fluxua - azken urtekoa barne) - aldizka
  2. Kargatu datu historikoak (merkataritza-urte bakoitzeko, aurkitu merkataritzaren itxiera-prezioaren muturreko balioak) - aldizka
  3. Kargatu azken merkataritza-datuak - aldizka
  4. Kargatu segurtasun bakoitzerako adierazleen zerrenda pertsonalizatua, aldizka

Espero bezala, proiektuaren izen bat aukeratzen dugu hutsetik: Horton

Azpiegiturak prestatzen ari gara

Izenburua, zalantzarik gabe, sendoa da, hala ere, egin behar duzun guztia docker-compose-rako konfigurazio txiki bat idaztea da kafka (eta zookeeper - edukiontzi batean), kafdrop (gaietan mezuak aztertu nahi baditugu), mongodb. Lortzen dugu [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) forma honetakoa:

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

Hemen ez dago ezer konplikaturik. Bi entzule deklaratu ziren kafkarako: bata (barnekoa) sare konposatuaren barruan erabiltzeko, eta bigarrena (kanpokoa) kanpotik egindako eskaeretarako, beraz, kanpora helarazi zuten. 2181 - zoozainen portua. Gainerakoa, nire ustez, argi dago.

Proiektuaren hezurdura prestatzen

Oinarrizko bertsioan, gure proiektuaren egiturak honelakoa izan beharko luke:

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 *

*Apuntatu nuen guztia Oraindik ez dugu ukitzen, fitxategi hutsak sortzen ditugu.**

Egitura bat sortu dugu. Orain gehitu ditzagun beharrezko mendekotasunak, idatzi konfigurazioa eta konektatu mongodb-era. Ez dut artikuluko artxiboen testu osoa emango, ez atzeratzeko, baina beharrezko bertsioetarako estekak emango ditut.

Has gaitezen proiektuaren menpekotasunekin eta metarekin - pyproject.toml

Ondoren, mendekotasunak instalatzen eta virtualenv bat sortzen hasiko gara (edo zuk zeuk sortu dezakezu venv karpeta eta ingurunea aktibatu):

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

Orain sortu dezagun konfig.yml - Kredentzialak eta non jo. Berehala ipini ahal izango dituzu alfabetoa lortzeko datuak. Tira, goazen konfig.py — atera aplikaziorako datuak gure konfiguraziotik. Bai, aitortzen dut, nire liburua erabili nuen - sitri.

Mongo-ra konektatzean, dena nahiko erraza da. iragarri bezero klasea konektatzeko eta oinarrizko klasea gordinetarako, bildumei buruzko kontsultak errazteko.

Zer gertatuko da gero?

Artikulua ez da oso luzea, hemen motibazioari eta prestaketari buruz bakarrik hitz egiten ari naizelako, beraz, ez nazazu errua bota - hurrengo zatiak ekintza eta grafikoak izango dituela agintzen dut.

Beraz, hurrengo zati honetan hauxe dugu:

  1. Idatzi dezagun bezero txiki bat aiohttp-n alphaavantagerako, behar ditugun amaierako puntuen eskaerarekin.
  2. Sor dezagun agente bat, baloreei eta prezio historikoei buruzko datuak bilduko dituena.

Proiektuaren kodea

Zati honen kodea

Iturria: www.habr.com

Gehitu iruzkin berria