Նախապատմական առաջադրանքներ Ֆաուստի վերաբերյալ, Մաս I. Ներածություն

Նախապատմական առաջադրանքներ Ֆաուստի վերաբերյալ, Մաս I. Ներածություն

Ինչպե՞ս եմ ես եկել այսպես ապրել:

Ոչ վաղ անցյալում ես ստիպված էի աշխատել բարձր բեռնված նախագծի հետին պլանում, որտեղ անհրաժեշտ էր կազմակերպել մեծ թվով ֆոնային առաջադրանքների կանոնավոր կատարումը բարդ հաշվարկներով և երրորդ կողմի ծառայությունների հարցումներով: Նախագիծը ասինխրոն է, և մինչ իմ գալը, այն ուներ cron-launch-ի առաջադրանքների պարզ մեխանիզմ՝ ընթացիկ ժամանակը ստուգող օղակ և հավաքի միջոցով գործարկվող գործողություններ. այս մոտեցումը ընդունելի էր, քանի դեռ կային տասնյակ և հարյուրավոր նման քայլեր , սակայն, երբ նրանց թիվը գերազանցեց երկու հազարը, ես ստիպված էի մտածել բրոքերի, մի քանի բանվորների հետ նորմալ առաջադրանքների հերթ կազմակերպելու մասին և այլն։

Սկզբում որոշեցի փորձել Celery-ը, որը նախկինում օգտագործել էի: Նախագծի ասինխրոն լինելու պատճառով ես սուզվեցի հարցի մեջ և տեսա статьюԻնչպես նաեւ նախագիծ, ստեղծվել է հոդվածի հեղինակի կողմից։

Ես սա կասեմ, նախագիծը շատ հետաքրքիր է և բավականին հաջող է աշխատում մեր թիմի այլ հավելվածներում, և հեղինակն ինքն է ասում, որ կարողացել է այն դուրս բերել արտադրության մեջ՝ օգտագործելով ասինխրոն լողավազան: Բայց, ցավոք, դա ինձ այնքան էլ չէր սազում, ինչպես պարզվեց խնդիրը առաջադրանքների խմբային մեկնարկով (տես. խումբ) Գրելու պահին թողարկում արդեն փակ է, սակայն աշխատանքները շարունակվում են արդեն մեկ ամիս։ Համենայնդեպս, հաջողություն հեղինակին ու ամենայն բարիք, քանի որ լիբի վրա արդեն աշխատող բաներ կան... ընդհանրապես իմաստը իմ մեջ է ու գործիքը ինձ համար խոնավ է ստացվել։ Բացի այդ, որոշ առաջադրանքներ ունեին 2-3 http հարցումներ տարբեր ծառայությունների համար, այնպես որ նույնիսկ առաջադրանքները օպտիմալացնելիս մենք ստեղծում ենք 4 հազար TCP կապ, մոտավորապես 2 ժամը մեկ՝ ոչ այնքան լավ... Ես կցանկանայի ստեղծել նիստ մեկ տեսակի համար: առաջադրանքը աշխատողներին սկսելու ժամանակ: Մի փոքր ավելին aiohttp-ի միջոցով մեծ թվով հարցումների մասին այստեղ.

Այս առումով ես սկսեցի փնտրել այլընտրանքներ և գտա՜ Կոնկրետ նեխուր ստեղծողները, ինչպես ես եմ հասկանում Հարցրեք Սոլեմին, ստեղծվել է Ֆաուստն, սկզբնապես նախագծի համար թալանչիություն. Ֆաուստը ոգեշնչված է Kafka Streams-ից և աշխատում է Կաֆկայի հետ որպես բրոքեր, rocksdb-ն օգտագործվում է նաև գործակալների աշխատանքի արդյունքները պահելու համար, և ամենակարևորն այն է, որ գրադարանը ասինխրոն է։

Բացի այդ, դուք կարող եք նայել արագ համեմատություն նեխուր և ֆաուստ՝ վերջիններիս ստեղծողներից՝ դրանց տարբերությունները, բրոքերների միջև տարբերությունները, տարրական առաջադրանքի իրականացումը։ Ամեն ինչ բավականին պարզ է, սակայն ուշադրություն է գրավում faust-ի մի գեղեցիկ հատկանիշ՝ մուտքագրված տվյալներ թեմային փոխանցելու համար:

Ի՞նչ ենք մենք անում։

Այսպիսով, կարճ հոդվածների շարքում ես ձեզ ցույց կտամ, թե ինչպես կարելի է տվյալներ հավաքել ֆոնային առաջադրանքներից՝ օգտագործելով Faust-ը: Մեր օրինակի նախագծի աղբյուրը կլինի, ինչպես անունն է հուշում. alphavantage.co. Ես կցուցադրեմ, թե ինչպես գրել գործակալներ (լվացարան, թեմաներ, միջնորմներ), ինչպես կատարել կանոնավոր (cron) կատարում, ամենահարմար faust cli հրամանները (փաթաթան կտտոցով), պարզ կլաստերավորում, իսկ վերջում մենք կկցենք տվյալների շան ( աշխատելով տուփից դուրս) և փորձիր ինչ-որ բան տեսնել: Հավաքված տվյալները պահելու համար մենք կօգտագործենք mongodb-ը և շարժիչը միացման համար:

Հ.Գ. Դատելով այն վստահությունից, որով գրվել է մոնիտորինգի մասին կետը, կարծում եմ, որ վերջին հոդվածի վերջում ընթերցողը դեռ այսպիսի տեսք կունենա.

Նախապատմական առաջադրանքներ Ֆաուստի վերաբերյալ, Մաս I. Ներածություն

Ծրագրի պահանջները

Հաշվի առնելով այն հանգամանքը, որ ես արդեն խոստացել եմ, եկեք մի փոքր ցուցակ կազմենք, թե ինչ պետք է կարողանա անել ծառայությունը.

  1. Պարբերաբար վերբեռնեք արժեթղթերը և դրանց ակնարկը (ներառյալ շահույթն ու վնասը, հաշվեկշիռը, դրամական հոսքերը՝ վերջին տարվա համար)
  2. Վերբեռնեք պատմական տվյալներ (յուրաքանչյուր առևտրային տարվա համար գտեք առևտրի փակման գնի ծայրահեղ արժեքները) - պարբերաբար
  3. Պարբերաբար վերբեռնեք առևտրի վերջին տվյալները
  4. Պարբերաբար վերբեռնեք յուրաքանչյուր անվտանգության համար ցուցիչների հարմարեցված ցանկ

Ինչպես և սպասվում էր, մենք նախագծի համար անվանում ենք զրոյից. հորտոն

Պատրաստում ենք ենթակառուցվածքները

Վերնագիրն, անշուշտ, ուժեղ է, այնուամենայնիվ, այն ամենը, ինչ ձեզ հարկավոր է, գրել է մի փոքրիկ կոնֆիգուրգ docker-compose-ի համար՝ kafka-ով (և zookeeper՝ մեկ կոնտեյներով), kafdrop (եթե ուզում ենք հաղորդագրությունները դիտել թեմաներում), mongodb-ով: Մենք ստանում ենք [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 - Հավատարմագրեր և որտեղ թակել: Դուք կարող եք անմիջապես այնտեղ տեղադրել alphavantage-ի տվյալները: Դե ինչ, անցնենք config.py — հանեք տվյալներ հավելվածի համար մեր կազմաձևից: Այո, ես խոստովանում եմ, ես օգտագործել եմ իմ lib-ը. sitri.

Mongo-ին միանալիս ամեն ինչ բավականին պարզ է։ հայտարարեց հաճախորդի դաս միացնել և բազային դաս cruds-ի համար, որպեսզի ավելի դյուրին լինի հավաքածուների վերաբերյալ հարցումներ կատարելը:

Ինչ է լինելու հաջորդը.

Հոդվածն այնքան էլ երկար չէ, քանի որ այստեղ ես խոսում եմ միայն մոտիվացիայի և պատրաստության մասին, այնպես որ ինձ մի մեղադրեք, խոստանում եմ, որ հաջորդ մասը կունենա գործողություն և գրաֆիկա:

Այսպիսով, հենց այս հաջորդ մասում մենք.

  1. Եկեք գրենք փոքր հաճախորդ alphavantage-ի համար aiohttp-ում՝ մեզ անհրաժեշտ վերջնակետերի հարցումներով:
  2. Եկեք ստեղծենք գործակալ, ով կհավաքի տվյալներ արժեթղթերի և պատմական գների վերաբերյալ նրանց համար:

Ծրագրի կոդը

Կոդ այս մասի համար

Source: www.habr.com

Добавить комментарий