Karên Paşerojê yên li ser Faust, Beş I: Destpêk

Karên Paşerojê yên li ser Faust, Beş I: Destpêk

Ez çawa hatim ku bi vî rengî bijîm?

Demek berê ez neçar bûm ku li ser pişta projeyek pir barkirî bixebitim, ku tê de hewce bû ku bi rêkûpêk pêkanîna hejmareke mezin ji karên paşerojê bi hesabên tevlihev û daxwazên ji bo karûbarên sêyemîn organîze bikim. Proje asynkron e û berî ku ez bêm, mekanîzmayek wê ya hêsan bû ji bo peywirên destpêkirina kronan: xelekek ku dema heyî kontrol dike û komên kortînan bi riya berhevkirinê ve dimeşîne - ev nêzîkatî derket holê ku qebûl bû heya ku bi dehan û bi sedan kortûnên weha hebûn. Lêbelê, gava ku hejmara wan ji du hezarî derbas bû, ez neçar bûm ku li ser organîzekirina rêzek karekî normal bi brokerek, çend karker û hwd re bifikirim.

Pêşî min biryar da ku Celery, ku min berê bikar anîbû biceribînim. Ji ber xwezaya asynkron a projeyê, ez ketim nav pirsê û min dît gotar, û herwisa projeyê, ji hêla nivîskarê gotarê ve hatî afirandin.

Ez ê vê yekê bibêjim, proje pir balkêş e û di serîlêdanên din ên tîmê me de bi rengek serketî dixebite, û nivîskar bixwe jî dibêje ku wî bi karanîna hewzek asynchronous karîbû wê di hilberînê de derxîne. Lê, mixabin, ew bi rastî ji min re ne xweş bû, wekî ku derket pirsgirêkek bi destpêkirina komê ya peywiran re (binêre. kom). Di dema nivîsandinê de pirs Jixwe girtî ye, lê ev mehek e xebat berdewam dikin. Di her rewşê de, serkeftin ji nivîskar re û hemî çêtirîn, ji ber ku jixwe tiştên ku li ser lib-ê dixebitin hene ... bi gelemperî, xal di min de ye û amûr ji bo min şil bû. Wekî din, hin peywiran 2-3 daxwazên http ji karûbarên cihêreng re hebûn, ji ber vê yekê jî dema ku peywiran xweşbîn dikin, em 4 hezar girêdanên TCP-ê çêdikin, hema hema her 2 demjimêran - ne pir baş... Ez dixwazim ji bo yek celebek danişînek biafirînim. peywira dema destpêkirina karkeran. Piçek bêtir di derbarê hejmareke mezin a daxwaznameyên bi rêya aiohttp vir.

Di vî warî de min dest bi lêgerînê kir alternatîf û dît! Afirînerên kerfesê, bi taybetî, wekî ku ez jê fêm dikim Ji Solem bipirsin, hate afirandin Faust, bi eslê xwe ji bo projeyê Robin Hood. Faust ji Kafka Streams îlhama xwe digire û bi Kafka re wekî broker dixebite, rocksdb jî ji bo hilanîna encamên xebata ajanan tê bikar anîn, û ya herî girîng ew e ku pirtûkxane asînkron e.

Her weha, hûn dikarin bibînin berhevdana kurt kerfes û faust ji afirînerên paşîn: cûdahiyên wan, cûdahiyên di navbera brokeran de, pêkanîna karek bingehîn. Her tişt pir hêsan e, lêbelê, taybetmendiyek xweş di faustê de balê dikişîne - daneyên tîpkirî yên ji bo veguheztina mijarê.

Em çi dikin?

Ji ber vê yekê, di rêzek kurt a gotaran de, ez ê nîşanî we bidim ka meriv çawa bi karanîna Faust daneyan ji peywirên paşîn berhev dike. Çavkaniya projeya me ya nimûne dê bibe, wekî ku ji navê xwe diyar dike, alphavantage.co. Ez ê nîşan bidim ka meriv çawa ajanan (navber, mijar, dabeşkirin) dinivîse, meriv çawa birêkûpêk (cron) birêkûpêk dike, fermanên faust cli yên herî rehet (pêçek li ser klîk), komkirina hêsan, û di dawiyê de em ê datadogek pêve bikin ( ji qutikê dixebitin) û hewl bidin ku tiştek bibînin. Ji bo hilanîna daneyên berhevkirî em ê ji bo girêdanê mongodb û motor bikar bînin.

PS Li gorî pêbaweriya ku xala li ser çavdêriyê hatî nivîsandin dadbar dikim, ez difikirim ku xwendevan di dawiya gotara paşîn de dê hîn jî tiştek wusa xuya bike:

Karên Paşerojê yên li ser Faust, Beş I: Destpêk

Pêdiviyên projeyê

Ji ber rastiya ku min berê jî soz daye, bila navnîşek piçûk a ku karûbar divê karibe bike çêbikin:

  1. Ewlekariyê û nerînek li ser wan barkirin (di nav de qezenc û zirar, bîlanço, herikîna drav - ji bo sala borî) - bi rêkûpêk
  2. Daneyên dîrokî barkirin (ji bo her salek bazirganiyê, nirxên giran ên bihayê girtina bazirganiyê bibînin) - bi rêkûpêk
  3. Daneyên bazirganiyê yên herî dawî barkirin - bi rêkûpêk
  4. Ji bo her ewlehiyê navnîşek xwerû ya nîşanan barkirin - bi rêkûpêk

Wekî ku tê hêvî kirin, em ji nû ve navek ji bo projeyê hilbijêrin: Horton

Em binesaziyê amade dikin

Sernav bê guman xurt e, di heman demê de, ya ku divê hûn bikin ev e ku ji bo docker-compose bi kafka (û zookeeper - di yek konteynerê de), kafdrop (heke em dixwazin li peyaman di mijaran de binihêrin), mongodb vesaziyek piçûk binivîsin. Em distînin [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) bi forma jêrîn:

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

Li vir qet tiştek tevlihev tune. Du guhdar ji bo kafka hatin ragihandin: yek (hundirîn) ji bo karanîna di hundurê tora pêkhatî de, û ya duyemîn (derveyî) ji bo daxwazên ji derve, ji ber vê yekê wan ew li derve şandin. 2181 - bendera zookparêz. Ya mayî, ez difikirim, zelal e.

Amadekirina îskeleta projeyê

Di guhertoya bingehîn de, avahiya projeya me divê bi vî rengî xuya bike:

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 *

*Her tiştê ku min destnîşan kir Em hê dest nadin wê, em tenê pelên vala çêdikin.**

Me avahiyek çêkir. Naha em pêwendiyên pêwîst lê zêde bikin, vesazkirinê binivîsin û bi mongodb ve girêbidin. Ez ê di gotarê de nivîsa tevahî pelan peyda nekim, da ku dereng nemînim, lê ez ê girêdanên guhertoyên pêwîst peyda bikim.

Ka em bi girêdan û meta di derbarê projeyê de dest pê bikin - pyproject.toml

Dûv re, em dest bi sazkirina girêdanan dikin û virtualenv diafirînin (an jî hûn dikarin peldanka venv bi xwe biafirînin û jîngehê çalak bikin):

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

Niha em biafirînin config.yml - Bawername û li ku derê xistin. Hûn dikarin tavilê daneyên ji bo alphavantage li wir bicîh bikin. Belê, em herin ser config.py - daneyên ji bo serîlêdanê ji konfigurasyona me derxînin. Erê, ez qebûl dikim, min lib xwe bikar anî - sitri.

Dema ku bi Mongo ve girêdayî ye, her tişt pir hêsan e. ragihand class muwekîlê girêdan û çîna bingehîn ji bo cruds, ji bo hêsantirkirina pirsan li ser berhevokan.

Dê paşê çi bibe?

Gotar ne pir dirêj e, ji ber ku li vir ez tenê behsa motîvasyon û amadekariyê dikim, ji ber vê yekê min sûcdar nekin - ez soz didim ku beşa paşîn dê çalak û grafîk be.

Ji ber vê yekê, di vê beşa paşîn de em:

  1. Ka em ji bo alphavantage xerîdarek piçûk li aiohttp bi daxwazên xalên dawî yên ku em hewce ne binivîsin.
  2. Ka em ajanek biafirînin ku dê ji wan re daneyên li ser ewlekarî û bihayên dîrokî berhev bike.

Koda projeyê

Koda ji bo vê beşê

Source: www.habr.com

Add a comment