Faustoari buruzko aurrekariak, I. zatia: sarrera

Faustoari buruzko aurrekariak, I. zatia: sarrera

Nola iritsi naiz nire bizitzako puntu honetara?

Duela gutxi, karga handiko proiektu baten atzealdean lan egin nuen, eta horrek atzeko planoan zeregin kopuru handia aldizka exekutatu behar zuen, kalkulu konplexuekin eta hirugarrenen zerbitzuei egindako eskaerarekin. Proiektua asinkronoa da, eta sartu aurretik, cron lanen exekuzio mekanismo sinple bat zuen: uneko denbora egiaztatzeko begizta bat eta gather bidez korutina taldeak abiaraztea. Ikuspegi hau onargarria zen dozenaka edo ehunka korutina egon arte, baina haien kopurua bi milatik gorakoa zenean, broker batekin, hainbat langilerekin eta abarrekin zeregin-ilara egoki bat antolatzea pentsatu behar izan nuen.

Lehenik eta behin, lehenago ere erabiltzen nuen Celery probatzea erabaki nuen. Proiektuaren izaera asinkronoa dela eta, arazoa sakondu eta ikusi nuen artikulu bat, Baita proiektua, artikuluaren egileak sortua.

Hau esango dut: proiektua oso interesgarria da eta nahiko arrakastaz funtzionatzen du gure taldeko beste aplikazio batzuetan, eta egileak berak dio ekoizpenera zabaldu ahal izan zuela multzo asinkrono bat erabiliz. Baina, zoritxarrez, ez zuen guztiz funtzionatu niretzat, konturatu nintzen bezala... arazo bat talde-zereginaren abiaraztearekin (ikus taldea). Idazteko unean, alea Itxita dago dagoeneko, baina lana hilabetez daramatza martxan. Nolanahi ere, zorte on eta onena egileari, dagoeneko gauzak martxan daudelako Lib-en... Funtsean, ni naiz, eta tresna apur bat gogorra izan da niretzat. Gainera, zeregin batzuek 2-3 HTTP eskaera zituzten zerbitzu ezberdinetara, beraz, zereginen optimizazioarekin ere, 4 TCP konexio sortzen ari gara, gutxi gorabehera 2 orduro—ez da oso ona... Langileak abiaraztean zeregin mota bakar baterako saio bat sortu nahiko nuke. Xehetasun gehiago aiohttp bidezko eskaera kopuru handiari buruz. Hemen.

Honekin lotuta, bilatzen hasi nintzen alternatibak Eta aurkitu dut! Celery-ren sortzaileek, zehazki, nik ulertzen dudan bezala. Galdetu Solemi, sortu zen Fausthasieran, proiekturako robinhoodFaust Kafka Streams-en inspiratuta dago eta Kafkarekin lan egiten du broker gisa. Rocksdb ere erabiltzen du agenteen emaitzak gordetzeko. Garrantzitsuena, liburutegia asinkronoa da.

Begirada bat ere eman diezaiokezu konparazio laburra Apioa eta Faust azken honen sortzaileengandik: haien desberdintasunak, bitartekarien arteko desberdintasunak eta oinarrizko zeregin baten inplementazioa. Dena nahiko sinplea da, baina Faustek ezaugarri polita du: gai batera pasatzeko idatzitako datuak.

Zer egingo dugu?

Beraz, artikulu sorta labur honetan, Faust erabiliz atzeko planoan egindako zereginetan datuak nola bildu erakutsiko dizuet. Gure adibide proiektuaren iturria, izenak dioen bezala, hau izango da: alphavantage.coAgenteak (hustubideak, gaiak, partizioak) nola idatzi erakutsiko dut, ohiko exekuzioa (cron) nola konfiguratu, faust CLI komando erabilgarriak (klik egiteko modu bat), klusterizazio sinplea, eta azkenik, datadog gehituko dugu (kutxatik aterata funtzionatzen duena) eta zerbait ikusten saiatuko gara. Mongodb erabiliko dugu bildutako datuak gordetzeko eta konexiorako motorra.

P.S. Monitorizazioari buruzko paragrafoa idatzita dagoen konfiantza ikusita, uste dut azken artikuluaren amaieran irakurleak oraindik ere honelako zerbait ikusiko duela:

Faustoari buruzko aurrekariak, I. zatia: sarrera

Proiektuaren eskakizunak

Dagoeneko agindu dudana kontuan hartuta, zerbitzuak egin ahal izan beharko lukeenaren zerrenda labur bat osatuko dugu:

  1. Deskargatu baloreak eta haien ikuspegi orokorra (irabaziak eta galerak, balantzea, azken urteko diru-fluxua barne) aldizka
  2. Deskargatu datu historikoak aldizka (aurkitu merkataritza-urte bakoitzerako itxiera-prezioen muturrak)
  3. Deskargatu azken merkataritza-datuak aldizka
  4. Deskargatu aldizka balore bakoitzerako adierazleen zerrenda pertsonalizatua

Ohi bezala, bat-batean aukeratu dugu proiektuarentzako izen bat: Horton

Azpiegitura prestatzen ari gara

Izenburua sendoa da zalantzarik gabe, hala ere, egin behar duzun guztia docker-compose-rako konfigurazio txiki bat idaztea da, kafka-rekin (eta zookeeper-ekin - edukiontzi bakarrean), kafdrop-ekin (gaietan mezuak ikusi nahi baditugu) eta mongodb-rekin. Lortzen dugu [docker-compose.yml]](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) mota 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

Ez dago ezer konplikaturik hemen. Bi entzule deklaratu genituen Kafkarentzat: bat (barnekoa) sare konposatuaren barruan erabiltzeko, eta bigarrena (kanpokoa) kanpoko eskaeretarako, beraz, kanpora birbidali genuen. 2181 Zookeeper-en portua da. Gainerakoa, uste dut, argi dagoela.

Proiektuaren eskeletoa prestatzea.

Oinarrizko bertsioan, gure proiektuaren egitura honelakoa izan beharko litzateke:

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 *

*Aipatu nuen guztia Ez diogu oraindik ukituko, fitxategi hutsak sortzen ari gara, besterik ez.

Egitura sortu dugu. Orain, gehitu ditzagun beharrezko mendekotasunak, idatzi konfigurazioa eta konektatu gaitezen MongoDB-ra. Artikulu honetan ez dut fitxategien testu osoa emango laburbiltzeko, baina beharrezko bertsioetarako estekak emango ditut.

Has gaitezen proiektuaren mendekotasunekin eta metarekin - pyproject.toml

Ondoren, menpekotasunak instalatzen eta ingurune birtual bat sortzen hasiko gara (edo zuk zeuk sor dezakezu venv karpeta eta ingurunea aktibatu):

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

Orain sortu dezagun konfigurazioa.yml — kredituak eta nora joan. Alphavantage-ren datuak ere bertan argitaratu ditzakezu berehala. Beno, aurrera egin dezagun konfig.py — aplikaziorako datuak gure konfiguraziotik ateratzen ditugu. Bai, aitortzen dut, nire liburutegia erabili dut — sitri.

Mongorekin konektatzeari dagokionez, dena nahiko erraza da. Iragarri zuten bezero klasea konektatzeko eta oinarrizko klasea Crudes-entzat, bildumen artean kontsultak egitea errazteko.

Zer gertatuko da gero?

Artikulu hau ez da oso luzea, motibazioaz eta prestaketaz bakarrik ari naizelako, beraz, izan pazientzia, hurrengo zatian ekintza eta grafikoak egongo direla agintzen dizut.

Beraz, hurrengo zati honetan bertan:

  1. Idatzi dezagun bezero txiki bat aiohttp-n alphaavantagerako, behar ditugun amaierako puntuen eskaerarekin.
  2. Baloreei eta haien prezio historikoei buruzko datuak bilduko dituen agente bat sortuko dugu.

Proiektuaren kodea

Zati honen kodea

Iturria: www.habr.com

Erosi hosting fidagarria DDoS babesa duten guneetarako, VPS VDS zerbitzariak 🔥 Erosi webguneentzako ostatu fidagarria DDoS babesarekin, VPS VDS zerbitzariak | ProHoster