
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ë , si dhe , 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 me ekzekutimin grupor tĂ« detyrave (shiko ). NĂ« momentin e shkruarjes sĂ« artikullit 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 .
PĂ«r shkak tĂ« kĂ«saj, fillova tĂ« kĂ«rkoj alternativa dhe gjeta! Krijuesit e celeryl, tĂ« paktĂ«n siç e kuptova , krijuan , fillimisht pĂ«r projektin . 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 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, . 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:

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:
- TĂ« nxjerrĂ« tituj tĂ« çmimeve dhe overview pĂ«r to (pĂ«rfshirĂ« fitimet dhe humbjet, bilancin, cash flow â pĂ«r vitin e fundit) â rregullisht
- TĂ« nxjerrĂ« tĂ« dhĂ«na historike (tĂ« gjej ekstremet e çmimit tĂ« mbylljes sĂ« tregtisĂ« pĂ«r çdo vit tregtar) â rregullisht
- TĂ« nxjerrĂ« tĂ« dhĂ«nat e fundit tĂ« tregtisĂ« â rregullisht
- 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]() 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-serviceKë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 â
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 installTani tĂ« krijojmĂ« â kredencialet dhe ku tĂ« lidhemi. MenjĂ«herĂ« aty mund tĂ« vendosim edhe tĂ« dhĂ«nat pĂ«r alphavantage. Tani, kalojmĂ« te â nxjerrim tĂ« dhĂ«nat pĂ«r aplikacionin nga konfigurimi ynĂ«. Po, po e pranoj, kam pĂ«rdorur bibliotekĂ«n time â .
PĂ«r lidhjen me mongo â Ă«shtĂ« shumĂ« e thjeshtĂ«. Kemi shpallur pĂ«r lidhjen dhe 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:
- Do të shkruajmë një klient të vogël për alphavantage me aiohttp me kërkesa në endpointet që na duhen.
- Do të bëjmë një agjent që do të mbledhë të dhëna mbi aksionet dhe çmimet historike për to.
Burimi: habr.com
