Detyrat e Sfondit mbi Faustin, Pjesa I: Hyrje

Detyrat e Sfondit mbi Faustin, Pjesa I: Hyrje

Si arrita të jetoj kështu?

Jo shumë kohë më parë më duhej të punoja në pjesën e pasme të një projekti shumë të ngarkuar, në të cilin ishte e nevojshme të organizoja ekzekutimin e rregullt të një numri të madh detyrash në sfond me llogaritje komplekse dhe kërkesa për shërbime të palëve të treta. Projekti është asinkron dhe para se të vija unë, ai kishte një mekanizëm të thjeshtë për detyrat e nisjes: një cikli që kontrollonte kohën aktuale dhe niste grupet e korutinave nëpërmjet grumbullimit - kjo qasje doli të ishte e pranueshme derisa kishte dhjetëra e qindra korutina të tilla. , megjithatë, kur numri i tyre i kaloi dy mijë, m'u desh të mendoja për organizimin e një rradhe detyrash normale me një ndërmjetës, disa punëtorë, e kështu me radhë.

Fillimisht vendosa të provoja Selinon, të cilin e kisha përdorur më parë. Për shkak të natyrës asinkrone të projektit, u zhyta në pyetje dhe pashë një artikullpo ashtu projekt, krijuar nga autori i artikullit.

Unë do ta them këtë, projekti është shumë interesant dhe funksionon me mjaft sukses në aplikacione të tjera të ekipit tonë, dhe vetë autori thotë se ai ishte në gjendje ta nxirrte në prodhim duke përdorur një pishinë asinkrone. Por, për fat të keq, nuk më përshtatej vërtet, siç doli problemi me nisjen grupore të detyrave (shih. grup). Në momentin e shkrimit çështje është mbyllur tashmë, por puna ka një muaj që po vazhdon. Sido që të jetë, i urojmë fat autorit dhe gjithë të mirat, pasi tashmë ka punë në lib... në përgjithësi, çështja është tek unë dhe mjeti më doli i lagësht. Përveç kësaj, disa detyra kishin 2-3 kërkesa http për shërbime të ndryshme, kështu që edhe kur optimizojmë detyrat, ne krijojmë 4 mijë lidhje TCP, afërsisht çdo 2 orë - jo shumë mirë... Unë do të doja të krijoja një seancë për një lloj detyrë kur nisin punëtorët. Pak më shumë për numrin e madh të kërkesave përmes aiohttp këtu.

Në këtë drejtim, fillova të kërkoj alternativat dhe e gjeti! Krijuesit e selinos, konkretisht, siç e kuptoj unë Pyete Solemin, ishte krijuar Faust, fillimisht për projektin Robin Hood. Faust është frymëzuar nga Kafka Streams dhe punon me Kafkën si ndërmjetës, rocksdb përdoret gjithashtu për të ruajtur rezultatet nga puna e agjentëve dhe gjëja më e rëndësishme është që biblioteka të jetë asinkrone.

Gjithashtu, mund të shikoni krahasim i shpejtë selino dhe faust nga krijuesit e kësaj të fundit: dallimet e tyre, dallimet midis ndërmjetësve, zbatimi i një detyre elementare. Gjithçka është mjaft e thjeshtë, megjithatë, një veçori e bukur në faust tërheq vëmendjen - të dhënat e shtypura për transmetim në temë.

Çfarë bëjmë ne?

Pra, në një seri të shkurtër artikujsh, unë do t'ju tregoj se si të mbledhni të dhëna nga detyrat në sfond duke përdorur Faust. Burimi për projektin tonë shembullor do të jetë, siç sugjeron emri, alphavantage.co. Unë do të demonstroj se si të shkruajmë agjentë (lavaman, tema, ndarje), si të bëjmë ekzekutimin e rregullt (cron), komandat më të përshtatshme faust cli (një mbështjellës mbi klikim), grupim të thjeshtë, dhe në fund do të bashkojmë një datadog ( duke punuar jashtë kutisë) dhe përpiquni të shihni diçka. Për të ruajtur të dhënat e mbledhura ne do të përdorim mongodb dhe motor për lidhje.

PS Duke gjykuar nga besimi me të cilin u shkrua pika për monitorimin, mendoj se lexuesi në fund të artikullit të fundit do të duket diçka si kjo:

Detyrat e Sfondit mbi Faustin, Pjesa I: Hyrje

Kërkesat e projektit

Për shkak të faktit që unë kam premtuar tashmë, le të bëjmë një listë të vogël të asaj që shërbimi duhet të jetë në gjendje të bëjë:

  1. Ngarko letrat me vlerë dhe një përmbledhje të tyre (përfshirë fitimet dhe humbjet, bilancin, fluksin e parave - për vitin e fundit) - rregullisht
  2. Ngarkoni të dhëna historike (për çdo vit tregtimi, gjeni vlerat ekstreme të çmimit të mbylljes së tregtimit) - rregullisht
  3. Ngarkoni të dhënat më të fundit të tregtimit - rregullisht
  4. Ngarko një listë të personalizuar të treguesve për çdo siguri - rregullisht

Siç pritej, ne zgjedhim një emër për projektin nga e para: Horton

Ne jemi duke përgatitur infrastrukturën

Titulli është sigurisht i fortë, megjithatë, gjithçka që duhet të bëni është të shkruani një konfigurim të vogël për docker-compose me kafka (dhe kujdestarin e kopshtit - në një enë), kafdrop (nëse duam të shohim mesazhet në tema), mongodb. marrim [docker-kompozoj.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) të formës së mëposhtme:

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

Këtu nuk ka asgjë të komplikuar fare. Dy dëgjues u deklaruan për kafka: një (i brendshëm) për përdorim brenda rrjetit të përbërë dhe i dyti (i jashtëm) për kërkesa nga jashtë, kështu që e përcillnin jashtë. 2181 - porti i kujdestarit të kopshtit zoologjik. Pjesa tjetër, mendoj, është e qartë.

Përgatitja e skeletit të projektit

Në versionin bazë, struktura e projektit tonë duhet të duket si kjo:

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 *

*Gjithçka që vura re Nuk e prekim ende, thjesht krijojmë skedarë bosh.**

Ne krijuam një strukturë. Tani le të shtojmë varësitë e nevojshme, të shkruajmë konfigurimin dhe të lidhemi me mongodb. Nuk do të jap tekstin e plotë të skedarëve në artikull, për të mos e vonuar, por do të jap lidhje me versionet e nevojshme.

Le të fillojmë me varësitë dhe meta rreth projektit - pyproject.toml

Më pas, fillojmë të instalojmë varësitë dhe të krijojmë një virtualenv (ose mund të krijoni vetë dosjen venv dhe të aktivizoni mjedisin):

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

Tani le të krijojmë config.yml - Kredencialet dhe ku të trokasin. Ju mund të vendosni menjëherë të dhëna për alphavantage atje. Epo, le të kalojmë te config.py — nxirrni të dhëna për aplikacionin nga konfigurimi ynë. Po, e pranoj, kam përdorur lirinë time - sitri.

Kur lidheni me Mongo, gjithçka është mjaft e thjeshtë. i shpallur klasë klienti për t'u lidhur dhe klasa bazë për cruds, për ta bërë më të lehtë bërjen e pyetjeve në koleksione.

Çfarë do të ndodhë më pas?

Artikulli nuk është shumë i gjatë, pasi këtu po flas vetëm për motivimin dhe përgatitjen, ndaj mos më fajësoni - ju premtoj se pjesa tjetër do të ketë aksion dhe grafikë.

Pra, në këtë pjesë tjetër ne:

  1. Le të shkruajmë një klient të vogël për alphavantage në aiohttp me kërkesa për pikat fundore që na duhen.
  2. Le të krijojmë një agjent që do të mbledhë të dhëna për letrat me vlerë dhe çmimet historike për to.

Kodi i projektit

Kodi për këtë pjesë

Burimi: www.habr.com

Shto një koment