Detyrat sfondore në Faust, Pjesa I: Hyrje

Detyrat sfondore në Faust, Pjesa I: Hyrje

Si unë arrita deri te kjo jetë?

Pak kohĂ« mĂ« parĂ«, mĂ« duhej tĂ« punoja nĂ« backend-in e njĂ« projekti me ngarkesĂ« tĂ« lartĂ«, ku duhej tĂ« organizoja ekzekutimin e rregullt tĂ« njĂ« numri tĂ« madh tĂ« detyrave nĂ« sfond me llogaritje komplekse dhe kĂ«rkesa pĂ«r shĂ«rbime tĂ« jashtme. Projekti Ă«shtĂ« asinkron dhe para se tĂ« arrija, aty kishte njĂ« mekanizĂ«m tĂ« thjeshtĂ« tĂ« ekzekutimit tĂ« detyrave me cron: njĂ« cikĂ«l me kontrollimin e kohĂ«s aktuale dhe ekzekutimin e grupeve tĂ« korutinave pĂ«rmes gather — ky qasje ishte e pranueshme deri nĂ« momentin kur numri i korutinave e kaloi dy mijĂ«, kĂ«shtu qĂ« duhej tĂ« mendonim pĂ«r organizimin e njĂ« radhe tĂ« rregullt tĂ« detyrave me njĂ« broker, disa punĂ«torĂ« dhe tĂ« tjera.

Fillimisht vendosa të provoj Celery-n, të cilin e kisha përdorur më parë. Në lidhje me asinkroninë e projektit, u futa në problem dhe pashë artikull, si dhe projekt, e krijuar nga autori i artikullit.

TĂ« them tĂ« drejtĂ«n, projekti Ă«shtĂ« shumĂ« interesant dhe funksionon mjaft mirĂ« nĂ« aplikacione tĂ« tjera tĂ« ekipit tonĂ«, edhe vetĂ« autori thotĂ« se arriti ta nxjerrĂ« nĂ« prodhim, duke pĂ«rdorur njĂ« pool asinkron. Por, fatkeqĂ«sisht, pĂ«r mua kjo nuk ishte shumĂ« e pĂ«rshtatshme, sepse u zbulua problemi me ekzekutimin grupor tĂ« detyrave (shiko grup). NĂ« momentin e shkruarjes sĂ« artikullit issue isha mbyllur, megjithatĂ«, puna u realizua pĂ«r njĂ« muaj. NĂ« çdo rast, autorit i uroj fat dhe tĂ« gjitha tĂ« mirat, pasi ka funksione funksionale nĂ« bibliotekĂ«n
 nĂ« pĂ«rgjithĂ«si, Ă«shtĂ« çështje e natyrĂ«s sime dhe pĂ«r mua doli se instrumenti ishte akoma i papjekur. PĂ«r mĂ« tepĂ«r, nĂ« disa detyra kishte nga 2-3 kĂ«rkesa http pĂ«r shĂ«rbime tĂ« ndryshme, kĂ«shtu qĂ« edhe me optimizimin e detyrave krijojmĂ« 4,000 lidhje tcp, gjithashtu çdo 2 orĂ« — jo shumĂ« e mirë  Do tĂ« doja tĂ« krijoja njĂ« sesion pĂ«r njĂ« lloj detyre si fillim kur tĂ« nisin punĂ«torĂ«t. Pak mĂ« shumĂ« rreth numrit tĂ« madh tĂ« kĂ«rkesave pĂ«rmes aiohttp kĂ«tu.

PĂ«r shkak tĂ« kĂ«saj, fillova tĂ« kĂ«rkoj alternativa dhe gjeta! Krijuesit e celeryl, tĂ« paktĂ«n siç e kuptova Ask Solem, krijuan Faust, fillimisht pĂ«r projektin robinhood. Faust Ă«shtĂ« shkruar nĂ«n ndikimin e Kafka Streams dhe punon me Kafka si broker, gjithashtu pĂ«r ruajtjen e rezultateve nga puna e agentĂ«ve pĂ«rdoret rocksdb, dhe e rĂ«ndĂ«sishmja — Ă«shtĂ« qĂ« biblioteka Ă«shtĂ« asinkrone.

Gjithashtu, mund tĂ« shihni njĂ« krahasim tĂ« shkurtĂ«r celery dhe faust nga krijuesit e fundit: ndryshimet e tyre, dallimet e brokerĂ«ve, realizimi i detyrĂ«s elementare. GjĂ«rat janĂ« shumĂ« tĂ« thjeshta, megjithatĂ«, faust tĂ«rheq vĂ«mendjen me njĂ« veçori tĂ« kĂ«ndshme — tĂ« dhĂ«na tĂ« tipizuara pĂ«r t'u dĂ«rguar nĂ« temĂ«.

ÇfarĂ« do tĂ« bĂ«jmĂ«?

Pra, në një seri të vogël artikujsh do të tregoj se si të mbledhim të dhëna në detyra sfondore duke përdorur Faust. Burimi për projektin tonë të shembullit do të jetë, siç thuhet në titull, alphavantage.co. Do të demonstroj se si të shkruaj agjentë (sink, tema, parti), si të bëj ekzekutime të rregullta (cron), komandat më të lehta të cli të faust (mbështetje mbi click), grumbullim të thjeshtë, dhe në fund do të lidhim datadog (që funksionon nga kafazi) dhe do të përpiqemi të shohim diçka. Për ruajtjen e të dhënave të mbledhura do të përdorim mongodb dhe motor për lidhjen.

P.S. Duke parë sigurinë me të cilën është shkruar pika rreth monitorimit, mendoj se lexuesi në fund të artikullit të fundit do të duket, siç duket kështu:

Detyrat sfondore në Faust, Pjesa I: Hyrje

Kërkesat për projektin

Në lidhje me atë që kam premtuar tashmë, do të përgatisim një listë të vogël se çfarë duhet të dijë shërbimi:

  1. TĂ« nxjerrĂ« tituj tĂ« çmimeve dhe overview pĂ«r to (pĂ«rfshirĂ« fitimet dhe humbjet, bilancin, cash flow — pĂ«r vitin e fundit) — rregullisht
  2. TĂ« nxjerrĂ« tĂ« dhĂ«na historike (tĂ« gjej ekstremet e çmimit tĂ« mbylljes sĂ« tregtisĂ« pĂ«r çdo vit tregtar) — rregullisht
  3. TĂ« nxjerrĂ« tĂ« dhĂ«nat e fundit tĂ« tregtisĂ« — rregullisht
  4. TĂ« nxjerrĂ« njĂ« listĂ« tĂ« konfigurueshme tĂ« treguesve pĂ«r çdo titull çmimi — rregullisht

Siç është e nevojshme, zgjedhim një emër për projektin nga tavanit: horton

Përgatitja e infrastrukturës

Titulli sigurisht qĂ« Ă«shtĂ« i fortĂ«, megjithatĂ«, gjithçka qĂ« duhet tĂ« bĂ«jmĂ« Ă«shtĂ« tĂ« shkruajmĂ« njĂ« konfigurim tĂ« vogĂ«l pĂ«r docker-compose me kafka (dhe zookeeper — nĂ« njĂ« kontejner), kafdrop (nĂ«se duam tĂ« shohim mesazhet nĂ« tema), mongodb. Marrim [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) tĂ« dukshme si:

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. Për kafka, janë shpallur dy listener-a: një (internal) për përdorim brenda rrjetit të kompozimit, dhe tjetri (external) për kërkesat nga jashtë, kështu që e kaluam atë jashtë. 2181 është porta e zookeeper-it. Mendoj se për të tjerat është e qartë.

Po përgatisim skeletin e projektit

Në variantin bazë, struktura e projektit tonë duhet të duket kështu:

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ë kam shënuar nuk e prekim për momentin, thjesht krijojmë skedarë bosh. **

Krijuam strukturën. Tani do të shtojmë varësitë e nevojshme, do të shkruajmë konfigurimin dhe lidhjen me mongodb. Nuk do të jap tekstin e plotë të skedarëve në artikull për të mos u zgjatur, por do të bëj lidhje për versionet e nevojshme.

Le tĂ« fillojmĂ« me varĂ«sitĂ« dhe metat e projektit — pyproject.toml

Pastaj, fillojmë instalimin e varësive dhe krijimin e virtualenv (ose, mund ta krijoni vetë dosjen venv dhe të aktivizoni mjedisin):

pip3 install poetry (nëse nuk është instaluar ende)
poetry install

Tani tĂ« krijojmĂ« config.yml — kredencialet dhe ku tĂ« lidhemi. MenjĂ«herĂ« aty mund tĂ« vendosim edhe tĂ« dhĂ«nat pĂ«r alphavantage. Tani, kalojmĂ« te config.py — nxjerrim tĂ« dhĂ«nat pĂ«r aplikacionin nga konfigurimi ynĂ«. Po, po e pranoj, kam pĂ«rdorur bibliotekĂ«n time — sitri.

PĂ«r lidhjen me mongo — Ă«shtĂ« shumĂ« e thjeshtĂ«. Kemi shpallur klasĂ«n e klientit pĂ«r lidhjen dhe klasĂ«n bazĂ« pĂ«r CRUD-et, nĂ« mĂ«nyrĂ« qĂ« tĂ« bĂ«het mĂ« e lehtĂ« pĂ«r tĂ« bĂ«rĂ« kĂ«rkesa nĂ« koleksione.

ÇfarĂ« do tĂ« ndodhĂ« mĂ« pas?

Artikulli nuk doli shumë i gjatë, pasi këtu flas vetëm për motivimin dhe përgatitjen, kështu që mos u shqetësoni - premtoj se në pjesën tjetër do të ketë aksion dhe grafikë.

Pra, në këtë pjesën e ardhshme ne:

  1. Do të shkruajmë një klient të vogël për alphavantage me aiohttp me kërkesa në endpointet që na duhen.
  2. Do të bëjmë një agjent që do të mbledhë të dhëna mbi aksionet dhe çmimet historike për to.

Kodi i projektit

Kodi i kësaj pjese

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster