Фауст бойынша негізгі тапсырмалар, I бөлім: Кіріспе

Фауст бойынша негізгі тапсырмалар, I бөлім: Кіріспе

Мен бұлай өмір сүруге қалай келдім?

Жақында маған күрделі есептеулер мен үшінші тарап қызметтеріне сұраныстары бар көптеген фондық тапсырмаларды жүйелі түрде орындауды ұйымдастыру қажет болатын жоғары жүктелген жобаның бэкендінде жұмыс істеуге тура келді. Жоба асинхронды және мен келгенге дейін оның тапсырмаларды орындаудың қарапайым механизмі болды: ағымдағы уақытты тексеретін цикл және жинау арқылы корутиндер топтарын іске қосу - бұл тәсіл ондаған және жүздеген осындай корутиндер болғанша қолайлы болып шықты. , алайда, олардың саны екі мыңнан асқанда, мен брокермен, бірнеше жұмысшымен және т.б. бар қалыпты тапсырма кезегін ұйымдастыру туралы ойлауға тура келді.

Алдымен бұрын қолданып жүрген балдыркөкті сынап көрейін деп шештім. Жобаның асинхронды сипатына байланысты мен сұраққа сүңгіп, көрдім мақала, және де жоба, мақала авторы жасаған.

Мен мұны айтайын, жоба өте қызықты және біздің команданың басқа қолданбаларында сәтті жұмыс істейді, автордың өзі оны асинхронды пулды пайдалану арқылы өндіріске шығара алғанын айтады. Бірақ, өкінішке орай, бұл маған сәйкес келмеді, белгілі болды мәселе тапсырмаларды топтық іске қосу арқылы (қараңыз. топ). Жазу кезінде іс жабылды, дегенмен жұмыс бір айдан бері жүріп жатыр. Қалай болғанда да, авторға сәттілік және барлық жақсылықтар, өйткені lib-де жұмыс істейтін нәрселер бар ... жалпы, мәселе менде және құрал мен үшін дымқыл болып шықты. Сонымен қатар, кейбір тапсырмаларда әртүрлі қызметтерге 2-3 http сұраулары болды, сондықтан тапсырмаларды оңтайландыру кезінде біз 4 мың TCP қосылымын жасаймыз, шамамен әрбір 2 сағат сайын - өте жақсы емес... Мен бір түрге арналған сеанс жасағым келеді. жұмысшыларды бастаған кездегі тапсырма. aiohttp арқылы сұраулардың көптігі туралы аздап осында.

Осыған байланысты іздей бастадым баламалар және оны тапты! Балдыркөкті жасаушылар, атап айтқанда, мен түсінемін Солемнен сұра, құрылды Фауст, бастапқыда жоба үшін RobinHood. Фауст Кафка ағындарынан шабыттандырады және Кафкамен брокер ретінде жұмыс істейді, rocksdb агенттер жұмысының нәтижелерін сақтау үшін де қолданылады, ең бастысы кітапхана асинхронды.

Сондай-ақ, қарауға болады жылдам салыстыру балдыркөк пен фаусты соңғы жасаушылардан: олардың айырмашылығы, брокерлер арасындағы айырмашылықтар, қарапайым тапсырманы орындау. Барлығы өте қарапайым, дегенмен, фауста жақсы мүмкіндік назар аударады - тақырыпқа жіберу үшін терілген деректер.

Не істейміз?

Сонымен, қысқаша мақалалар топтамасында мен Faust көмегімен фондық тапсырмалардан деректерді қалай жинау керектігін көрсетемін. Біздің мысал жобамыздың көзі, аты айтып тұрғандай, alphavantage.co. Мен агенттерді (раковина, тақырыптар, бөлімдер) қалай жазу керектігін, тұрақты (cron) орындауды, ең ыңғайлы faust cli командаларын (басу арқылы орау), қарапайым кластерлеуді көрсетемін және соңында біз datadog қосамыз ( қораптан тыс жұмыс) және бір нәрсені көруге тырысыңыз. Жиналған деректерді сақтау үшін қосылу үшін mongodb және моторды қолданамыз.

PS. Мониторинг туралы ойдың жазылғанына сенетін болсақ, соңғы мақаланың соңындағы оқырман әлі де келесідей көрінеді деп ойлаймын:

Фауст бойынша негізгі тапсырмалар, I бөлім: Кіріспе

Жобаға қойылатын талаптар

Мен қазірдің өзінде уәде бергендіктен, қызмет не істей алатыны туралы шағын тізім жасайық:

  1. Бағалы қағаздарды және оларға шолуды жүктеп салу (соның ішінде пайда мен шығын, баланс, ақша қозғалысы – соңғы жыл үшін) – жүйелі түрде
  2. Тарихи деректерді жүктеп салыңыз (әрбір сауда жылы үшін сауданың жабылу бағасының экстремалды мәндерін табыңыз) - жүйелі түрде
  3. Соңғы сауда деректерін жүктеп салыңыз - үнемі
  4. Әр қауіпсіздік үшін индикаторлардың теңшелген тізімін жүктеп салыңыз - жүйелі түрде

Күтілгендей, біз жобаның атауын нөлден таңдаймыз: Хортон

Біз инфрақұрылымды дайындап жатырмыз

Тақырып әрине күшті, дегенмен сізге тек kafka (және зоопаркшы - бір контейнерде), kafdrop (тақырыптардағы хабарларды қарағымыз келсе), mongodb көмегімен docker-compose үшін шағын конфигурация жазу жеткілікті. Біз алып жатырмыз [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

Мұнда мүлде күрделі ештеңе жоқ. Кафка үшін екі тыңдаушы жарияланды: бірі (ішкі) композиттік желі ішінде пайдалану үшін, екіншісі (сыртқы) сыртқы сұраулар үшін, сондықтан олар оны сыртқа жіберді. 2181 — зоопарк. Қалғаны, менің ойымша, түсінікті.

Жобаның қаңқасын дайындау

Негізгі нұсқада жобамыздың құрылымы келесідей болуы керек:

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 - Тіркелгі деректері және қайда соғу керек. Мұнда альфавант үшін деректерді дереу орналастыруға болады. Ал, келесіге көшейік config.py — біздің конфигурациядан қолданба үшін деректерді шығарып алыңыз. Иә, мен мойындаймын, мен өзімді қолдандым - ситри.

Mongo-ға қосылу кезінде бәрі өте қарапайым. жариялады клиент сыныбы қосу және базалық класс жинақтар бойынша сұрауларды жасауды жеңілдету үшін.

Келесіде не болады?

Мақала өте ұзақ емес, өйткені мен мұнда тек мотивация мен дайындық туралы айтып отырмын, сондықтан мені айыптамаңыз - келесі бөлімде әрекет пен графика болады деп уәде беремін.

Сонымен, келесі бөлімде біз:

  1. Бізге қажетті соңғы нүктелерге сұраныстармен aiohttp-те alphavantage үшін шағын клиентті жазайық.
  2. Бағалы қағаздар мен олардың тарихи бағалары туралы деректерді жинайтын агент құрайық.

Жоба коды

Осы бөлікке арналған код

Ақпарат көзі: www.habr.com

пікір қалдыру