Background nga Buluhaton sa Faust, Bahin I: Pasiuna

Background nga Buluhaton sa Faust, Bahin I: Pasiuna

Giunsa nako pagkinabuhi nga ingon niini?

Dili pa lang dugay kinahanglan kong magtrabaho sa backend sa usa ka puno kaayo nga proyekto, diin gikinahanglan ang pag-organisar sa regular nga pagpatuman sa daghang mga buluhaton sa background nga adunay komplikado nga mga kalkulasyon ug mga hangyo alang sa mga serbisyo sa ikatulo nga partido. Ang proyekto asynchronous ug sa wala pa ako moabut, kini adunay usa ka yano nga mekanismo alang sa mga buluhaton sa paglansad sa cron: usa ka loop nga nagsusi sa karon nga oras ug paglansad sa mga grupo sa mga coroutine pinaagi sa pagpundok - kini nga pamaagi nahimo nga madawat hangtod adunay mga dosena ug gatusan nga mga coroutine. , Apan, sa diha nga ang ilang gidaghanon milapas sa duha ka libo, ako kinahanglan nga maghunahuna mahitungod sa pag-organisar sa usa ka normal nga buluhaton pila uban sa usa ka broker, daghang mga trabahante, ug uban pa.

Una nakahukom ko nga sulayan ang Celery, nga akong gigamit kaniadto. Tungod sa asynchronous nga kinaiya sa proyekto, akong gisusi ang pangutana ug nakita usa ka artikulo, ug ang proyekto, gihimo sa tagsulat sa artikulo.

Isulti ko kini, ang proyekto makapainteres kaayo ug malampuson nga nagtrabaho sa ubang mga aplikasyon sa among team, ug ang tagsulat mismo nag-ingon nga nahimo niya kini nga gi-roll out sa produksiyon pinaagi sa paggamit sa usa ka asynchronous pool. Apan, sa kasubo, dili gyud kini angay kanako, ingon nga kini nahimo ang problema uban ang paglunsad sa grupo sa mga buluhaton (tan-awa. grupo). Sa panahon sa pagsulat isyu sirado na, apan, ang trabaho nagpadayon sulod sa usa ka bulan. Sa bisan unsa nga kaso, maayong swerte sa tagsulat ug sa tanan nga labing maayo, tungod kay aduna nay nagtrabaho nga mga butang sa lib ... sa kinatibuk-an, ang punto anaa kanako ug ang himan nahimong damp alang kanako. Dugang pa, ang pipila nga mga buluhaton adunay 2-3 nga mga hangyo sa http sa lainlaing mga serbisyo, mao nga bisan kung ang pag-optimize sa mga buluhaton, naghimo kami og 4 ka libo nga koneksyon sa TCP, gibana-bana sa matag 2 ka oras - dili kaayo maayo ... Gusto ko nga maghimo usa ka sesyon alang sa usa ka matang sa buluhaton sa pagsugod sa mga trabahante. Usa ka gamay nga dugang mahitungod sa dako nga gidaghanon sa mga hangyo pinaagi sa aiohttp dinhi.

Niining bahina, nagsugod ako sa pagpangita mga alternatibo ug nakit-an kini! Ang mga tiglalang sa celery, ilabi na, sa akong pagsabot niini Pangutan-a si Solem, nahimo Faust, orihinal alang sa proyekto pagkababaye. Ang Faust giinspirar sa Kafka Streams ug nagtrabaho kauban ang Kafka isip usa ka broker, ang rocksdb gigamit usab sa pagtipig sa mga resulta gikan sa trabaho sa mga ahente, ug ang labing importante nga butang mao nga ang librarya kay asynchronous.

Usab, mahimo nimong tan-awon dali nga pagtandi celery ug faust gikan sa mga tiglalang sa ulahi: ang ilang mga kalainan, mga kalainan tali sa mga brokers, pagpatuman sa usa ka elementarya nga buluhaton. Ang tanan yano ra, bisan pa, ang usa ka nindot nga bahin sa faust nakadani sa atensyon - gi-type nga datos alang sa pagpadala sa hilisgutan.

Unsay atong buhaton?

Mao nga, sa usa ka mubo nga serye sa mga artikulo, ipakita ko kanimo kung giunsa ang pagkolekta sa datos gikan sa mga buluhaton sa background gamit ang Faust. Ang tinubdan alang sa among panig-ingnan nga proyekto mao ang, ingon sa gisugyot sa ngalan, alphavantage.co. Akong ipakita kung giunsa pagsulat ang mga ahente (sink, mga hilisgutan, mga partisyon), kung giunsa ang paghimo sa regular (cron) nga pagpatuman, ang labing kombenyente nga faust cli nga mga mando (usa ka wrapper over click), yano nga clustering, ug sa katapusan mag-attach kami og datadog ( pagtrabaho sa gawas sa kahon) ug pagsulay sa usa ka butang nga makita. Aron matipigan ang mga nakolekta nga datos atong gamiton ang mongodb ug motor para sa koneksyon.

PS Sa paghukom sa pagsalig nga gisulat ang punto bahin sa pag-monitor, sa akong hunahuna ang magbabasa sa katapusan sa katapusan nga artikulo motan-aw gihapon sama niini:

Background nga Buluhaton sa Faust, Bahin I: Pasiuna

Mga kinahanglanon sa proyekto

Tungod sa kamatuoran nga nakasaad na ako, maghimo kita og gamay nga lista kung unsa ang mahimo sa serbisyo:

  1. Pag-upload sa mga securities ug usa ka kinatibuk-ang pagtan-aw niini (lakip ang kita ug pagkawala, balanse, cash flow - sa miaging tuig) - kanunay
  2. Pag-upload sa makasaysayan nga datos (alang sa matag tuig sa pamatigayon, pangitaa ang grabe nga mga kantidad sa panapos nga presyo sa pamatigayon) - kanunay
  3. Pag-upload sa pinakabag-o nga datos sa pamatigayon - kanunay
  4. Pag-upload og usa ka customized nga listahan sa mga indicators alang sa matag seguridad - kanunay

Sama sa gipaabut, nagpili kami usa ka ngalan alang sa proyekto gikan sa sinugdan: Horton

Nag-andam kami sa imprastraktura

Kusog gyud ang titulo, bisan pa, ang kinahanglan nimong buhaton mao ang pagsulat usa ka gamay nga config para sa docker-compose nga adunay kafka (ug zookeeper - sa usa ka sulud), kafdrop (kung gusto namon tan-awon ang mga mensahe sa mga hilisgutan), mongodb. Atong makuha [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) sa mosunod nga porma:

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

Walay bisan unsa nga komplikado dinhi sa tanan. Duha ka tigpaminaw ang gideklarar alang sa kafka: ang usa (internal) alang sa paggamit sa sulod sa composite network, ug ang ikaduha (external) alang sa mga hangyo gikan sa gawas, mao nga ilang gipasa kini sa gawas. 2181 — pantalan sa zookeeper. Ang uban, sa akong hunahuna, klaro.

Pag-andam sa kalabera sa proyekto

Sa sukaranan nga bersyon, ang istruktura sa among proyekto kinahanglan nga ingon niini:

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 *

*Tanan nga akong namatikdan Wala pa namo kini hilabti, nagmugna lang kami og mga walay sulod nga mga file.**

Naghimo kami usa ka istruktura. Karon atong idugang ang gikinahanglan nga mga dependency, isulat ang config ug ikonektar sa mongodb. Dili nako ihatag ang tibuuk nga teksto sa mga file sa artikulo, aron dili kini malangan, apan maghatag ako mga link sa kinahanglan nga mga bersyon.

Magsugod kita sa mga dependency ug meta bahin sa proyekto - pyproject.toml

Sunod, magsugod kami sa pag-install sa mga dependency ug paghimo og virtualenv (o mahimo nimong buhaton ang venv folder sa imong kaugalingon ug i-aktibo ang palibot):

pip3 install poetry (если ещё не установлено)
poetry install

Karon maghimo kita config.yml - Mga kredensyal ug asa manuktok. Mahimo nimo dayon ibutang ang datos alang sa alphavantage didto. Aw, magpadayon kita sa config.py - pagkuha sa datos alang sa aplikasyon gikan sa among config. Oo, gisugid ko, gigamit nako ang akong lib - sitri.

Kung nagkonektar sa Mongo, ang tanan yano ra. gipahibalo klase sa kliyente sa pagkonektar ug base nga klase para sa cruds, aron mas sayon ​​ang paghimo og mga pangutana sa mga koleksyon.

Unsay sunod nga mahitabo?

Ang artikulo dili kaayo taas, tungod kay dinhi ako naghisgot lamang bahin sa pagdasig ug pagpangandam, busa ayaw ako pagbasol - Gisaad ko nga ang sunod nga bahin adunay aksyon ug mga graphic.

Busa, niining sunod nga bahin atong:

  1. Atong isulat ang usa ka gamay nga kliyente alang sa alphavantage sa aiohttp nga adunay mga hangyo alang sa mga endpoint nga atong gikinahanglan.
  2. Maghimo kita usa ka ahente nga mangolekta mga datos sa mga securities ug mga presyo sa kasaysayan alang kanila.

Kodigo sa proyekto

Kodigo alang niini nga bahin

Source: www.habr.com

Idugang sa usa ka comment