Detyrat e prapaskenës në Faust, Pjesa I: Hyrje

Detyrat e prapaskenës në Faust, Pjesa I: Hyrje

Si arrita në këtë jetë?

MĂ« herĂ«t, mĂ« duhej tĂ« punoja mbi backendin e njĂ« projekti me ngarkesĂ« tĂ« lartĂ«, ku ishte e nevojshme tĂ« organizohej njĂ« ekzekutim periodik i njĂ« numri tĂ« madh tĂ« detyrave prapaskenĂ« me llogaritje komplekse dhe kĂ«rkesa nĂ« shĂ«rbime tĂ« jashtme. Projekti Ă«shtĂ« asinkron dhe para se tĂ« arrija unĂ«, kishte njĂ« mekanizĂ«m tĂ« thjeshtĂ« pĂ«r tĂ« ekzekutuar detyrat: njĂ« cikĂ«l qĂ« kontrollonte kohĂ«n aktuale dhe aktivizonte grupe korutinash pĂ«rmes gather — ky qasje ndikonte deri nĂ« momentin qĂ« numri i korutinave arriti nĂ« dhjetĂ«ra e qindra, megjithatĂ«, kur numri i tyre kaloi dy mijĂ«, duhej tĂ« mendohesha pĂ«r organizimin e njĂ« rrethi normal tĂ« detyrave me njĂ« broker, disa punĂ«torĂ« dhe tĂ« tjera.

Fillimisht, vendosa të provoj Celery, të cilin e kisha përdorur më parë. Duke pasur parasysh asinkroninë e projektit, u zhytëm në këtë çështje dhe pashë artikullin, si dhe projektin, të krijuar nga autori i artikullit.

MundĂ«si tĂ« tilla, projekti Ă«shtĂ« shumĂ« interesant dhe funksionon me sukses nĂ« aplikacione tĂ« tjera tĂ« ekipit tonĂ«, dhe vetĂ« autori thotĂ« se arriti ta nxjerrĂ« nĂ« prodhim duke pĂ«rdorur njĂ« grup asinkron. MegjithatĂ«, fatkeqĂ«sisht, kjo nuk mĂ« pĂ«rshtatet shumĂ«, pasi u zbulua problemi me nisjen grupore tĂ« detyrave (shih grup). NĂ« momentin qĂ« po shkruhej artikulli çështja ishte mbyllur tashmĂ«, megjithatĂ«, puna vazhdoi pĂ«r njĂ« muaj. NĂ« çdo rast, urime autorit dhe çdo tĂ« mirĂ«, pasi tashmĂ« kanĂ« funksionalitete nĂ« libĂ«r
 nĂ« pĂ«rgjithĂ«si, problemi Ă«shtĂ« te unĂ« dhe pĂ«r mua instrumenti doli disi i papjekur. Po ashtu, nĂ« disa detyra kishte 2-3 kĂ«rkesa http pĂ«r shĂ«rbime tĂ« ndryshme, kĂ«shtu qĂ« edhe me optimizimin e detyrave krijojmĂ« 4 mijĂ« lidhje tcp, pĂ«rafĂ«rsisht çdo 2 orĂ« — nuk Ă«shtĂ« shumë  Do tĂ« dĂ«shiroja tĂ« krijoja njĂ« sesion pĂ«r njĂ« lloj detyre gjatĂ« nisjes sĂ« punĂ«torĂ«ve. Pak mĂ« shumĂ« nĂ« lidhje me numrin e madh tĂ« kĂ«rkesave pĂ«rmes aiohttp kĂ«tu.

PĂ«r kĂ«tĂ« arsye, fillova tĂ« kĂ«rkoja alternativa dhe gjeta! Krijuesit e celery, dhe konkretisht, siç e kuptova Ask Solem, kanĂ« krijuar 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 mĂ« e rĂ«ndĂ«sishmja — Ă«shtĂ« se biblioteka Ă«shtĂ« asinkrone.

Po ashtu, mund tĂ« shikoni krahasimin e shkurtĂ«r midis celery dhe faust nga krijuesit e fundit: ndryshimet e tyre, ndryshimet e brokerĂ«ve, realizimi i njĂ« detyre elementare. Gjithçka Ă«shtĂ« mjaft e thjeshtĂ«, megjithatĂ«, nĂ« faust tĂ«rheq vĂ«mendjen njĂ« veçori e kĂ«ndshme — tĂ« dhĂ«nat e tipizuara pĂ«r t'u transferuar nĂ« temĂ«.

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

Pra, në një seri të vogël artikujsh do të tregoj se si të mbledhësh të dhëna në detyra prapa skenave me Faust. Burimi për projektin tonë të shembujve do të jetë, siç sugjerohet nga emri, alphavantage.co. Do të demonstroj se si të shkruaj agjentë (sink, tema, parti), si të bëj ekzekutim të rregullt (cron), komandat e reja CLI të faust (mbështjellje mbi click), klasterizimin e thjeshtë, dhe në fund do të lidhim datadog (që funksionon nga kuti) dhe do të përpiqemi të shohim diçka. Për ruajtjen e të dhënave të mbledhura do të përdorim mongodb dhe motorin për lidhjen.

P.S. Duke besoj se siguria me të cilën është shkruar pika për monitorimin, e bën lexuesin në fund të artikullit të fundit të duket pak a shumë kështu:

Detyrat e prapaskenës në Faust, Pjesa I: Hyrje

Kërkesat për projektin

Duke pasur parasysh se tashmë kam premtuar disa gjëra, le të përgatitim një listë të vogël për atë që duhet të dijë shërbimi:

  1. TĂ« nxjerrĂ« dokumentet financiare dhe pĂ«rmbledhjen mbi to (pĂ«rfshirĂ« fitimet dhe humbjet, bilancin, cash flow – pĂ«r vitin e fundit) – rregullisht
  2. TĂ« nxjerrĂ« tĂ« dhĂ«na historike (pĂ«r çdo vit tregtar tĂ« gjejĂ« ekstremet e çmimeve tĂ« mbylljes) – rregullisht
  3. TĂ« nxjerrĂ« tĂ« dhĂ«nat e fundit tregtare – rregullisht
  4. TĂ« nxjerrĂ« listĂ«n e pĂ«rcaktuar tĂ« indikatoreve pĂ«r çdo dokument financiar – rregullisht

Siç është rregulli, zgjedhim emrin e projektit nga majat: horton

Përgatitshëm infrastrukturën

Titulli Ă«shtĂ« padyshim i fuqishĂ«m, megjithatĂ«, e gjithĂ« çfarĂ« duhet tĂ« bĂ«sh Ă«shtĂ« tĂ« shkruash njĂ« konfigurim tĂ« vogĂ«l pĂ«r docker-compose me kafka (dhe zookeeper – nĂ« njĂ« kontejner), kafdrop (nĂ«se duam tĂ« shohim mesazhet nĂ« temat), mongodb. Ne marrim [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) tĂ« kĂ«tij lloji:

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

Nuk ka asgjë të ndërlikuar këtu. Për kafka kemi shpallur dy listener-a: një (internal) për përdorim brenda rrjetit kompozitor, dhe tjetrin (external) për kërkesa nga jashtë, ndaj e kemi hapur atë. 2181 është porta e zookeeper-it. Për pjesën tjetër, mendoj se ë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 *

*Çdo gjĂ« qĂ« kam shĂ«nuar ne nuk e prekim pĂ«r momentin, thjesht krijojmĂ« skedat boshe.**

Kemi krijuar 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 e zgjatur, por do të bëj lidhje me versionet e nevojshme.

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

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

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

Tani krijojmĂ« config.yml — kredencialet dhe ku do tĂ« lidhemi. Atje mund tĂ« vendosim dhe tĂ« dhĂ«nat pĂ«r alphavantage. Tani kalojmĂ« te config.py — nxjerrim tĂ« dhĂ«nat pĂ«r aplikacionin nga konfigurimi ynĂ«. Po, kĂ«rkoj ndjesĂ«, kam pĂ«rdorur librarinĂ« time — sitri.

PĂ«r lidhjen me mongo — gjithçka Ă«shtĂ« shumĂ« e thjeshtĂ«. Kemi shpallur klasĂ«n e klientit pĂ«r lidhjen dhe klasĂ«n bazĂ« pĂ«r krudat, pĂ«r tĂ« lehtĂ«suar kĂ«rkesat pĂ«r koleksione.

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

Artikulli i doli jo shumĂ« i gjatĂ«, pasi kĂ«tu flas vetĂ«m pĂ«r motivimin dhe pĂ«rgatitjen, prandaj mos u shqetĂ«soni — premtoj se nĂ« pjesĂ«n tjetĂ«r do tĂ« ketĂ« aksion dhe grafikĂ«.

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

  1. Do të shkruajmë një klient të vogël për alphavantage në aiohttp me kërkesat për endpointet që na duhen.
  2. Do të krijojmë një agjent që do të mbledhë të dhëna për titujt e vlefshëm dhe çmimet historike për to.

Kodi i projektit

Kodi i kësaj pjese

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster