Tasgau Cefndir ar Faust, Rhan I: Cyflwyniad

Tasgau Cefndir ar Faust, Rhan I: Cyflwyniad

Sut wnes i ddod i fyw fel hyn?

Ddim yn bell yn ôl bu'n rhaid i mi weithio ar gefn prosiect llawn llwyth, lle roedd angen trefnu cyflawni nifer fawr o dasgau cefndir yn rheolaidd gyda chyfrifiadau cymhleth a cheisiadau am wasanaethau trydydd parti. Mae'r prosiect yn anghydamserol a chyn i mi ddod, roedd ganddo fecanwaith syml ar gyfer tasgau lansio cron: dolen yn gwirio'r amser presennol a lansio grwpiau o goroutines trwy ymgynnull - trodd y dull hwn yn dderbyniol nes bod dwsinau a channoedd o goroutines o'r fath , fodd bynnag, pan oedd eu nifer yn fwy na dwy fil, roedd yn rhaid i mi feddwl am drefnu ciw tasg arferol gyda brocer, nifer o weithwyr, ac ati.

Yn gyntaf penderfynais roi cynnig ar Seleri, yr oeddwn wedi'i ddefnyddio o'r blaen. Oherwydd natur asyncronig y prosiect, blymiais i'r cwestiwn a gweld erthyglyn ogystal â y prosiect, a grëwyd gan awdur yr erthygl.

Fe ddywedaf hyn, mae'r prosiect yn ddiddorol iawn ac yn gweithio'n eithaf llwyddiannus mewn cymwysiadau eraill o'n tîm, ac mae'r awdur ei hun yn dweud ei fod wedi gallu ei gyflwyno i gynhyrchu trwy ddefnyddio pwll asyncronaidd. Ond, yn anffodus, nid oedd yn fy siwtio i mewn gwirionedd, fel y digwyddodd y broblem gyda lansiad grŵp o dasgau (gweler. grŵp). Ar adeg ysgrifennu mater eisoes ar gau, fodd bynnag, mae gwaith wedi bod yn mynd rhagddo ers mis. Beth bynnag, pob lwc i'r awdur a phob dymuniad da, gan fod pethau'n gweithio ar y lib yn barod... yn gyffredinol, mae'r pwynt ynof fi ac fe drodd y teclyn yn llaith i mi. Yn ogystal, roedd gan rai tasgau 2-3 chais http i wahanol wasanaethau, felly hyd yn oed wrth wneud y gorau o dasgau, rydym yn creu 4 mil o gysylltiadau TCP, tua bob 2 awr - ddim yn dda iawn... hoffwn greu sesiwn ar gyfer un math o dasg wrth gychwyn gweithwyr. Ychydig mwy am y nifer fawr o geisiadau trwy aiohttp yma.

Yn hyn o beth, dechreuais edrych dewisiadau amgen a dod o hyd iddo! Crewyr seleri, yn benodol, yn ôl yr hyn a ddeallaf Gofyn Solem, ei greu Faust, yn wreiddiol ar gyfer y prosiect robinhood. Mae Faust wedi'i ysbrydoli gan Kafka Streams ac yn gweithio gyda Kafka fel brocer, defnyddir rocksdb hefyd i storio canlyniadau o waith asiantau, a'r peth pwysicaf yw bod y llyfrgell yn asyncronaidd.

Hefyd, gallwch edrych cymhariaeth gyflym seleri a faust gan grewyr yr olaf: eu gwahaniaethau, gwahaniaethau rhwng broceriaid, gweithredu tasg elfennol. Mae popeth yn eithaf syml, fodd bynnag, mae nodwedd braf yn faust yn denu sylw - data wedi'i deipio i'w drosglwyddo i'r pwnc.

Beth ydyn ni'n ei wneud?

Felly, mewn cyfres fer o erthyglau, byddaf yn dangos i chi sut i gasglu data o dasgau cefndir gan ddefnyddio Faust. Y ffynhonnell ar gyfer ein prosiect enghreifftiol fydd, fel y mae'r enw'n awgrymu, alffavantage.co. Byddaf yn dangos sut i ysgrifennu asiantau (sinc, pynciau, rhaniadau), sut i gyflawni (cron) yn rheolaidd, y gorchmynion faust cli mwyaf cyfleus (lapiwr dros glicio), clystyru syml, ac ar y diwedd byddwn yn atodi ci data ( gweithio allan o'r bocs) a cheisio rhywbeth i'w weld. I storio'r data a gasglwyd byddwn yn defnyddio mongodb a modur ar gyfer cysylltu.

PS A barnu yn ôl yr hyder yr ysgrifennwyd y pwynt am fonitro ag ef, credaf y bydd y darllenydd ar ddiwedd yr erthygl ddiwethaf yn dal i edrych rhywbeth fel hyn:

Tasgau Cefndir ar Faust, Rhan I: Cyflwyniad

Gofynion y prosiect

Oherwydd fy mod eisoes wedi addo, gadewch i ni wneud rhestr fach o'r hyn y dylai'r gwasanaeth allu ei wneud:

  1. Lanlwythwch warantau a throsolwg ohonynt (gan gynnwys elw a cholledion, mantolen, llif arian - ar gyfer y flwyddyn ddiwethaf) - yn rheolaidd
  2. Llwythwch i fyny data hanesyddol (ar gyfer pob blwyddyn fasnachu, darganfyddwch werthoedd eithafol y pris cau masnachu) - yn rheolaidd
  3. Llwythwch i fyny'r data masnachu diweddaraf - yn rheolaidd
  4. Llwythwch i fyny restr wedi'i haddasu o ddangosyddion ar gyfer pob diogelwch - yn rheolaidd

Yn ôl y disgwyl, rydym yn dewis enw ar gyfer y prosiect o'r dechrau: Horton

Rydym yn paratoi’r seilwaith

Mae'r teitl yn sicr yn gryf, fodd bynnag, y cyfan sydd angen i chi ei wneud yw ysgrifennu cyfluniad bach ar gyfer cyfansoddi docwr gyda kafka (a zookeeper - mewn un cynhwysydd), kafdrop (os ydym am edrych ar negeseuon mewn pynciau), mongodb. Cawn [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) o'r ffurf ganlynol:

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

Nid oes dim byd cymhleth yma o gwbl. Datganwyd dau wrandäwr ar gyfer kafka: un (mewnol) i'w ddefnyddio y tu mewn i'r rhwydwaith cyfansawdd, a'r ail (allanol) ar gyfer ceisiadau o'r tu allan, felly fe wnaethant ei anfon ymlaen y tu allan. 2181 - porthladd sw. Mae'r gweddill, rwy'n meddwl, yn glir.

Paratoi sgerbwd y prosiect

Yn y fersiwn sylfaenol, dylai strwythur ein prosiect edrych fel hyn:

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 *

*Popeth a nodais Nid ydym yn ei gyffwrdd eto, rydym yn creu ffeiliau gwag.**

Fe wnaethon ni greu strwythur. Nawr, gadewch i ni ychwanegu'r dibyniaethau angenrheidiol, ysgrifennwch y ffurfwedd a chysylltu â mongodb. Ni fyddaf yn darparu testun llawn y ffeiliau yn yr erthygl, er mwyn peidio ag oedi, ond byddaf yn darparu dolenni i'r fersiynau angenrheidiol.

Gadewch i ni ddechrau gyda dibyniaethau a meta am y prosiect - pyprosiect.toml

Nesaf, rydyn ni'n dechrau gosod dibyniaethau a chreu virtualenv (neu gallwch chi greu'r ffolder venv eich hun ac actifadu'r amgylchedd):

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

Nawr gadewch i ni greu config.yml - Manylion a lle i guro. Gallwch chi osod data ar gyfer alphavantage yno ar unwaith. Wel, gadewch i ni symud ymlaen i config.py - tynnu data ar gyfer y rhaglen o'n ffurfwedd. Ydw, dwi'n cyfaddef, defnyddiais fy lib - sitri.

Wrth gysylltu â Mongo, mae popeth yn eithaf syml. cyhoeddi dosbarth cleient i gysylltu a dosbarth sylfaen ar gyfer cruds, i'w gwneud yn haws i wneud ymholiadau am gasgliadau.

Beth fydd yn digwydd nesaf?

Nid yw'r erthygl yn hir iawn, oherwydd yma dim ond am gymhelliant a pharatoi yr wyf yn siarad, felly peidiwch â'm beio - rwy'n addo y bydd gan y rhan nesaf gamau a graffeg.

Felly, yn y rhan nesaf un hon rydym yn:

  1. Gadewch i ni ysgrifennu cleient bach ar gyfer alphavantage ar aiohttp gyda cheisiadau am y pwyntiau terfyn sydd eu hangen arnom.
  2. Gadewch i ni greu asiant a fydd yn casglu data ar warantau a phrisiau hanesyddol ar eu cyfer.

Cod y Prosiect

Cod ar gyfer y rhan hon

Ffynhonnell: hab.com

Ychwanegu sylw