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ë
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
Në këtë drejtim, fillova të kërkoj alternativat dhe e gjeti! Krijuesit e selinos, konkretisht, siç e kuptoj unë
Gjithashtu, mund të shikoni
Ç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,
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:
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ë:
- 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
- Ngarkoni të dhëna historike (për çdo vit tregtimi, gjeni vlerat ekstreme të çmimit të mbylljes së tregtimit) - rregullisht
- Ngarkoni të dhënat më të fundit të tregtimit - rregullisht
- 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](
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 -
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ë
Kur lidheni me Mongo, gjithçka është mjaft e thjeshtë. i shpallur
Ç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:
- Le të shkruajmë një klient të vogël për alphavantage në aiohttp me kërkesa për pikat fundore që na duhen.
- Le të krijojmë një agjent që do të mbledhë të dhëna për letrat me vlerë dhe çmimet historike për to.
Burimi: www.habr.com