Ako som prišiel k takémuto životu?
Nie je to tak dávno, čo som musel pracovať na backende vysoko zaťaženého projektu, v ktorom bolo potrebné organizovať pravidelné vykonávanie veľkého množstva úloh na pozadí so zložitými výpočtami a požiadavkami na služby tretích strán. Projekt je asynchrónny a predtým, ako som prišiel, mal jednoduchý mechanizmus na spúšťanie úloh: slučku kontrolujúcu aktuálny čas a spúšťanie skupín korutínov prostredníctvom zberu – tento prístup sa ukázal ako prijateľný, kým takýchto korutínov neboli desiatky a stovky. , no keď ich počet presiahol dvetisíc, musel som rozmýšľať nad zorganizovaním normálneho poradia úloh s maklérom, niekoľkými pracovníkmi a pod.
Najprv som sa rozhodla vyskúšať zeler, ktorý som predtým používala. Vzhľadom na asynchrónny charakter projektu som sa ponoril do otázky a videl
Poviem to tak, že projekt je veľmi zaujímavý a celkom úspešne funguje aj v iných aplikáciách nášho tímu a sám autor hovorí, že ho dokázal rozvinúť do produkcie pomocou asynchrónneho poolu. Ale, žiaľ, mi to veľmi nevyhovovalo, ako sa ukázalo
V tomto smere som začal hľadať alternatívy a našiel to! Tvorcovia zeleru, konkrétne, ako to chápem ja
Môžete sa tiež pozrieť
Čo urobíme?
V krátkej sérii článkov vám teda ukážem, ako zbierať dáta z úloh na pozadí pomocou Fausta. Zdrojom pre náš vzorový projekt bude, ako už názov napovedá,
PS Súdiac podľa sebadôvery, s akou bol bod o monitorovaní napísaný, si myslím, že čitateľ na konci minulého článku bude stále vyzerať asi takto:
Požiadavky projektu
Vzhľadom na to, že som už sľúbil, urobme si malý zoznam toho, čo by služba mala vedieť:
- Nahrávajte cenné papiere a ich prehľad (vrátane ziskov a strát, súvahy, cash flow - za posledný rok) - pravidelne
- Nahrávajte historické údaje (pre každý obchodný rok nájdite extrémne hodnoty uzatváracej ceny obchodovania) - pravidelne
- Nahrávajte najnovšie obchodné údaje – pravidelne
- Nahrajte prispôsobený zoznam indikátorov pre každé zabezpečenie – pravidelne
Ako sa očakávalo, vyberáme názov projektu od začiatku: Horton
Pripravujeme infraštruktúru
Názov je určite silný, stačí však napísať malú konfiguráciu pre docker-compose s kafka (a zookeeper - v jednom kontajneri), kafdrop (ak sa chceme pozrieť na správy v témach), mongodb. Dostaneme [docker-compose.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
Nie je tu vôbec nič zložité. Pre kafku boli deklarovaní dvaja poslucháči: jeden (interný) na použitie vo vnútri zloženej siete a druhý (externý) na požiadavky zvonku, takže to preposlali von. 2181 — prístav pre strážcov zoologickej záhrady. Ostatné je myslím jasné.
Príprava kostry projektu
V základnej verzii by štruktúra nášho projektu mala vyzerať takto:
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 *
*Všetko, čo som si všimol Zatiaľ sa ho nedotýkame, iba vytvárame prázdne súbory.**
Vytvorili sme štruktúru. Teraz pridáme potrebné závislosti, napíšeme konfiguráciu a pripojíme sa k mongodb. Úplné znenie súborov v článku neuvediem, aby som to nezdržiaval, ale poskytnem odkazy na potrebné verzie.
Začnime so závislosťami a meta o projekte -
Ďalej začneme inštalovať závislosti a vytvárať virtualenv (alebo si môžete sami vytvoriť priečinok venv a aktivovať prostredie):
pip3 install poetry (если ещё не установлено)
poetry install
Teraz poďme tvoriť
Pri pripojení k Mongo je všetko celkom jednoduché. oznámil
čo bude ďalej?
Článok nie je príliš dlhý, keďže tu hovorím len o motivácii a príprave, takže mi to nevyčítajte - sľubujem, že ďalšia časť bude mať akciu a grafiku.
Takže v tejto ďalšej časti:
- Napíšme malého klienta pre alphavantage na aiohttp s požiadavkami na koncové body, ktoré potrebujeme.
- Vytvorme si agenta, ktorý za ne bude zbierať údaje o cenných papieroch a historických cenách.
Zdroj: hab.com