Majukumu ya Usuli kuhusu Faust, Sehemu ya I: Utangulizi

Majukumu ya Usuli kuhusu Faust, Sehemu ya I: Utangulizi

Nilikujaje kuishi hivi?

Sio muda mrefu uliopita nilipaswa kufanya kazi kwenye backend ya mradi uliojaa sana, ambayo ilikuwa ni lazima kuandaa utekelezaji wa mara kwa mara wa idadi kubwa ya kazi za nyuma na mahesabu magumu na maombi ya huduma za tatu. Mradi huo ni sawa na kabla sijaja, ulikuwa na utaratibu rahisi wa kazi za uzinduzi wa cron: kitanzi kinachoangalia wakati wa sasa na kuzindua vikundi vya coroutines kupitia mkusanyiko - njia hii ilikubalika hadi kulikuwa na kadhaa na mamia ya coroutines kama hizo. , hata hivyo, wakati idadi yao ilizidi elfu mbili, nilipaswa kufikiri juu ya kuandaa foleni ya kazi ya kawaida na broker, wafanyakazi kadhaa, na kadhalika.

Kwanza niliamua kujaribu Celery, ambayo nilikuwa nimeitumia hapo awali. Kwa sababu ya hali isiyo ya kawaida ya mradi, nilijiingiza kwenye swali na nikaona nakalaKama vile mradi, iliyoundwa na mwandishi wa makala.

Nitasema hivi, mradi huo ni wa kufurahisha sana na unafanya kazi kwa mafanikio katika matumizi mengine ya timu yetu, na mwandishi mwenyewe anasema kwamba aliweza kuisambaza kwa uzalishaji kwa kutumia dimbwi la asynchronous. Lakini, kwa bahati mbaya, haikufaa kwangu, kama ilivyotokea shida na uzinduzi wa kazi za kikundi (tazama. kundi) Wakati wa kuandika suala tayari imefungwa, hata hivyo, kazi imekuwa ikiendelea kwa mwezi mmoja. Kwa hali yoyote, bahati nzuri kwa mwandishi na yote bora, kwa kuwa tayari kuna mambo ya kufanya kazi kwenye lib ... kwa ujumla, uhakika ni ndani yangu na chombo kiligeuka kuwa unyevu kwangu. Kwa kuongezea, kazi zingine zilikuwa na maombi 2-3 ya http kwa huduma tofauti, kwa hivyo hata wakati wa kuboresha kazi, tunaunda viunganisho elfu 4 vya TCP, takriban kila masaa 2 - sio nzuri sana ... ningependa kuunda kikao cha aina moja ya kazi wakati wa kuanza wafanyikazi. Zaidi kidogo juu ya idadi kubwa ya maombi kupitia aiohttp hapa.

Katika suala hili, nilianza kuangalia njia mbadala na kuipata! Waundaji wa celery, haswa, kama ninavyoelewa Muulize Solem, ilitengenezwa Faust, awali kwa mradi huo wizi. Faust amehamasishwa na Mipasho ya Kafka na anafanya kazi na Kafka kama wakala, rocksdb pia hutumiwa kuhifadhi matokeo kutoka kwa kazi ya mawakala, na jambo la muhimu zaidi ni kwamba maktaba haina usawa.

Pia, unaweza kuangalia kulinganisha haraka celery na faust kutoka kwa waundaji wa mwisho: tofauti zao, tofauti kati ya madalali, utekelezaji wa kazi ya msingi. Kila kitu ni rahisi sana, hata hivyo, kipengele kizuri katika faust huvutia tahadhari - data iliyochapishwa kwa ajili ya uhamisho kwa mada.

Tunafanya nini?

Kwa hiyo, katika mfululizo mfupi wa makala, nitakuonyesha jinsi ya kukusanya data kutoka kwa kazi za nyuma kwa kutumia Faust. Chanzo cha mradi wetu wa mfano kitakuwa, kama jina linavyopendekeza, alphavantage.co. Nitaonyesha jinsi ya kuandika mawakala (kuzama, mada, kizigeu), jinsi ya kufanya utekelezaji wa kawaida (cron), amri rahisi zaidi za faust (kifuniko juu ya kubofya), nguzo rahisi, na mwisho tutaambatisha datadog ( kufanya kazi nje ya boksi) na jaribu kitu cha kuona. Ili kuhifadhi data iliyokusanywa tutatumia mongodb na motor kwa unganisho.

PS Kwa kuzingatia imani ambayo hoja ya ufuatiliaji iliandikwa, nadhani msomaji mwishoni mwa kifungu kilichopita bado ataonekana kama hii:

Majukumu ya Usuli kuhusu Faust, Sehemu ya I: Utangulizi

Mahitaji ya mradi

Kwa sababu ya ukweli kwamba tayari nimeahidi, wacha tufanye orodha ndogo ya kile huduma inapaswa kuwa na uwezo wa kufanya:

  1. Pakia dhamana na muhtasari wao (pamoja na faida na hasara, karatasi ya usawa, mtiririko wa pesa - kwa mwaka jana) - mara kwa mara
  2. Pakia data ya kihistoria (kwa kila mwaka wa biashara, pata maadili yaliyokithiri ya bei ya kufunga ya biashara) - mara kwa mara
  3. Pakia data ya hivi punde ya biashara - mara kwa mara
  4. Pakia orodha iliyobinafsishwa ya viashiria kwa kila usalama - mara kwa mara

Kama inavyotarajiwa, tunachagua jina la mradi kutoka mwanzo: Horton

Tunatayarisha miundombinu

Kichwa hakika kina nguvu, hata hivyo, unachohitaji kufanya ni kuandika usanidi mdogo wa docker-compose na kafka (na zookeeper - kwenye chombo kimoja), kafdrop (ikiwa tunataka kuangalia ujumbe katika mada), mongodb. Tunapata [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) ya fomu ifuatayo:

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

Hakuna kitu ngumu hapa hata kidogo. Wasikilizaji wawili walitangazwa kwa kafka: moja (ya ndani) kwa matumizi ndani ya mtandao wa watunzi, na ya pili (ya nje) kwa maombi kutoka nje, kwa hivyo waliisambaza nje. 2181 - bandari ya zookeeper. Wengine, nadhani, ni wazi.

Kuandaa mifupa ya mradi

Katika toleo la msingi, muundo wa mradi wetu unapaswa kuonekana kama hii:

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 *

*Kila kitu nilichobainisha Bado hatuigusi, tunaunda faili tupu.**

Tumeunda muundo. Sasa hebu tuongeze utegemezi muhimu, andika usanidi na uunganishe kwa mongodb. Sitatoa maandishi kamili ya faili kwenye kifungu, ili usichelewesha, lakini nitatoa viungo kwa matoleo muhimu.

Wacha tuanze na utegemezi na meta juu ya mradi - pyproject.toml

Ifuatayo, tunaanza kusanikisha utegemezi na kuunda virtualenv (au unaweza kuunda folda ya venv mwenyewe na kuamsha mazingira):

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

Sasa tuunde config.yml - Sifa na wapi pa kubisha. Unaweza mara moja kuweka data kwa alfavantage huko. Naam, wacha tuendelee config.py - toa data ya programu kutoka kwa usanidi wetu. Ndio, nakiri, nilitumia lib yangu - sitri.

Wakati wa kuunganisha kwa Mongo, kila kitu ni rahisi sana. alitangaza darasa la mteja kuunganisha na darasa la msingi kwa cruds, ili kurahisisha kuuliza maswali kwenye mikusanyiko.

Je, nini kitafuata?

Nakala hiyo sio ndefu sana, kwani hapa ninazungumza tu juu ya motisha na maandalizi, kwa hivyo usinilaumu - ninaahidi kuwa sehemu inayofuata itakuwa na hatua na michoro.

Kwa hivyo, katika sehemu hii inayofuata sisi:

  1. Wacha tuandike mteja mdogo kwa alfavantage kwenye aiohttp na maombi ya miisho tunayohitaji.
  2. Hebu tuunde wakala ambaye atakusanya data juu ya dhamana na bei za kihistoria kwa ajili yake.

Msimbo wa mradi

Kanuni ya sehemu hii

Chanzo: mapenzi.com

Kuongeza maoni