- Parte I: IntroducciĂłn
- Parte II: Agentes y equipos
¿Cómo llegué a esta vida?
No hace mucho, tuve que trabajar en el backend de un proyecto muy cargado, en el que necesitaba organizar la ejecuciĂłn regular de una gran cantidad de tareas en segundo plano con cálculos complejos y solicitudes de servicios de terceros. El proyecto es asincrĂłnico y antes de que yo llegara a Ă©l, tenĂa un mecanismo simple para lanzar tareas en una corona: un bucle con la verificaciĂłn de la hora actual y el lanzamiento de grupos de corrutinas a travĂ©s de recopilaciĂłn; este enfoque resultĂł ser aceptable hasta que hubo docenas y cientos de tales corrutinas, sin embargo, cuando su nĂşmero excedĂa los dos mil, tuve que pensar en organizar una cola de tareas normal con un corredor, varios trabajadores y asĂ sucesivamente.
, , , , . , , , (. group). issue , , . , , … , . , 2-3 http- , 4 tcp , 2 — … . - aiohttp .
, ! celery, , Ask Solem, Faust, robinhood. Faust Kafka Streams Kafka , rocksdb, — , .
, celery faust : , , . , , faust — .
?
, , Faust. - , , alphavantage.co. , (sink, , ), (cron) , cli- faust ( click), , datadog ( ) , - . mongodb motor .
P.S. , , , - , - :
, , , :
- overview ( .. , , cash flow — ) —
- ( ) —
- —
- —
, : horton
, , — docker-compose kafka ( zookeeper — ), kafdrop ( ), mongodb. [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/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
. kafka listener': (internal) , (external) , . 2181 — zookeeper'. , , .
:
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 *
, , .
. , mongodb. , , .
— pyproject.toml
, virtualenv (, venv ):
pip3 install poetry ( )
poetry install
config.yml — . alphavantage. config.py — . , , — sitri.
?
, , — , .
, :
- alphavantage aiohttp .
- , .