Основни задаци о Фаусту, И део: Увод

Основни задаци о Фаусту, И део: Увод

Како сам дошао да овако живим?

Не тако давно сам морао да радим на бацкенд-у веома оптерећеног пројекта, у којем је било потребно организовати редовно извршавање великог броја позадинских задатака са сложеним прорачунима и захтевима за услуге трећих страна. Пројекат је асинхрони и пре него што сам дошао, имао је једноставан механизам за задатке покретања црон-а: петљу која проверава тренутно време и покреће групе корутина преко прикупљања – овај приступ се показао прихватљивим све док није било десетина и стотина таквих корутина , међутим, када је њихов број прешао две хиљаде, морао сам да размишљам о организовању нормалног реда задатака са брокером, неколико радника и тако даље.

Прво сам одлучио да испробам целер, који сам раније користио. Због асинхроне природе пројекта, заронио сам у питање и видео статьюкао и пројекат, коју је креирао аутор чланка.

Рећи ћу ово, пројекат је веома интересантан и прилично успешно функционише у другим апликацијама нашег тима, а сам аутор каже да је успео да га уведе у продукцију коришћењем асинхроног пула. Али, нажалост, то ми, како се испоставило, није баш одговарало проблем са групним покретањем задатака (види. група). У време писања емисија је већ затворен, међутим, радови трају већ месец дана. У сваком случају, сретно аутору и све најбоље, пошто на либ-у већ раде ствари... генерално, поента је у мени и алат ми је испао влажан. Поред тога, неки задаци су имали 2-3 хттп захтева према различитим сервисима, па чак и када оптимизујемо задатке, креирамо 4 хиљаде ТЦП веза, отприлике свака 2 сата - није баш добро... Желео бих да направим сесију за једну врсту задатак при покретању радника. Још мало о великом броју захтева преко аиохттп овде.

С тим у вези, почео сам да тражим алтернативе и нашао га! Креатори целера, конкретно, како ја разумем Питај Солема, је створен Фауст, првобитно за пројекат Робин Худ. Фауст је инспирисан Кафка стримовима и ради са Кафком као брокером, роцксдб се такође користи за чување резултата из рада агената, а најважније је да је библиотека асинхрона.

Такође, можете погледати кратко поређење целер и фауст од твораца потоњег: њихове разлике, разлике међу брокерима, имплементација елементарног задатка. Све је прилично једноставно, међутим, пажњу привлачи лепа особина у Фаусту - откуцани подаци за пренос на тему.

Шта да радимо?

Дакле, у краткој серији чланака, показаћу вам како да прикупите податке из позадинских задатака користећи Фауст. Извор за наш пример пројекта биће, као што име каже, алпхавантаге.цо. Показаћу како да напишем агенте (синк, теме, партиције), како да урадим редовно (црон) извршавање, најпогодније фауст цли команде (замотавање преко клика), једноставно груписање, а на крају ћемо приложити датадог ( радећи из кутије) и покушајте да нешто видите. За складиштење прикупљених података користићемо монгодб и мотор за повезивање.

ПС Судећи по самопоуздању са којим је написана тачка о мониторингу, мислим да ће читалац на крају последњег чланка ипак изгледати отприлике овако:

Основни задаци о Фаусту, И део: Увод

Захтеви пројекта

Због чињенице да сам већ обећао, хајде да направимо малу листу онога што би услуга требало да може да уради:

  1. Учитајте хартије од вредности и њихов преглед (укључујући добитке и губитке, биланс стања, ток готовине - за прошлу годину) - редовно
  2. Отпремите историјске податке (за сваку годину трговања пронађите екстремне вредности цене затварања трговања) - редовно
  3. Учитајте најновије податке о трговању - редовно
  4. Учитајте прилагођену листу индикатора за сваку хартију - редовно

Као што се и очекивало, бирамо име за пројекат од нуле: хортон

Припремамо инфраструктуру

Наслов је свакако јак, међутим, све што треба да урадите је да напишете малу конфигурацију за доцкер-цомпосе са кафка (и зоокеепер - у једном контејнеру), кафдроп (ако желимо да погледамо поруке у темама), монгодб. Добијамо [доцкер-цомпосе.имл](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 *

*Све што сам приметио Још га не дирамо, само креирамо празне датотеке.**

Направили смо структуру. Сада додајмо потребне зависности, напишемо конфигурацију и повежемо се са монгодб. Нећу давати цео текст фајлова у чланку, да не бих одлагао, али ћу дати линкове до потребних верзија.

Почнимо са зависностима и мета о пројекту - пипројецт.томл

Затим почињемо да инсталирамо зависности и креирамо виртуаленв (или можете сами да креирате фасциклу венв и активирате окружење):

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

Сада кренимо цонфиг.имл - Акредитације и где да куцам. Тамо можете одмах поставити податке за алпхавантаге. Па, идемо даље цонфиг.пи — извуците податке за апликацију из наше конфигурације. Да, признајем, користио сам своју библиотеку - ситри.

Када се повежете на Монго, све је прилично једноставно. најавио клијент класа за повезивање и базна класа за црудс, да би се олакшало постављање упита за колекције.

Шта ће се даље дешавати?

Чланак није много дугачак, јер овде говорим само о мотивацији и припреми, тако да не замерите - обећавам да ће следећи део имати акцију и графику.

Дакле, у овом следећем делу ми:

  1. Хајде да напишемо мали клијент за алпхавантаге на аиохттп са захтевима за крајње тачке које су нам потребне.
  2. Хајде да направимо агента који ће прикупљати податке о хартијама од вредности и историјским ценама за њих.

Шифра пројекта

Шифра за овај део

Извор: ввв.хабр.цом

Додај коментар