Ինչպե՞ս եմ ես եկել այսպես ապրել:
Ոչ վաղ անցյալում ես ստիպված էի աշխատել բարձր բեռնված նախագծի հետին պլանում, որտեղ անհրաժեշտ էր կազմակերպել մեծ թվով ֆոնային առաջադրանքների կանոնավոր կատարումը բարդ հաշվարկներով և երրորդ կողմի ծառայությունների հարցումներով: Նախագիծը ասինխրոն է, և մինչ իմ գալը, այն ուներ cron-launch-ի առաջադրանքների պարզ մեխանիզմ՝ ընթացիկ ժամանակը ստուգող օղակ և հավաքի միջոցով գործարկվող գործողություններ. այս մոտեցումը ընդունելի էր, քանի դեռ կային տասնյակ և հարյուրավոր նման քայլեր , սակայն, երբ նրանց թիվը գերազանցեց երկու հազարը, ես ստիպված էի մտածել բրոքերի, մի քանի բանվորների հետ նորմալ առաջադրանքների հերթ կազմակերպելու մասին և այլն։
Սկզբում որոշեցի փորձել Celery-ը, որը նախկինում օգտագործել էի: Նախագծի ասինխրոն լինելու պատճառով ես սուզվեցի հարցի մեջ և տեսա
Ես սա կասեմ, նախագիծը շատ հետաքրքիր է և բավականին հաջող է աշխատում մեր թիմի այլ հավելվածներում, և հեղինակն ինքն է ասում, որ կարողացել է այն դուրս բերել արտադրության մեջ՝ օգտագործելով ասինխրոն լողավազան: Բայց, ցավոք, դա ինձ այնքան էլ չէր սազում, ինչպես պարզվեց
Այս առումով ես սկսեցի փնտրել այլընտրանքներ և գտա՜ Կոնկրետ նեխուր ստեղծողները, ինչպես ես եմ հասկանում
Բացի այդ, դուք կարող եք նայել
Ի՞նչ ենք մենք անում։
Այսպիսով, կարճ հոդվածների շարքում ես ձեզ ցույց կտամ, թե ինչպես կարելի է տվյալներ հավաքել ֆոնային առաջադրանքներից՝ օգտագործելով Faust-ը: Մեր օրինակի նախագծի աղբյուրը կլինի, ինչպես անունն է հուշում.
Հ.Գ. Դատելով այն վստահությունից, որով գրվել է մոնիտորինգի մասին կետը, կարծում եմ, որ վերջին հոդվածի վերջում ընթերցողը դեռ այսպիսի տեսք կունենա.
Ծրագրի պահանջները
Հաշվի առնելով այն հանգամանքը, որ ես արդեն խոստացել եմ, եկեք մի փոքր ցուցակ կազմենք, թե ինչ պետք է կարողանա անել ծառայությունը.
- Պարբերաբար վերբեռնեք արժեթղթերը և դրանց ակնարկը (ներառյալ շահույթն ու վնասը, հաշվեկշիռը, դրամական հոսքերը՝ վերջին տարվա համար)
- Վերբեռնեք պատմական տվյալներ (յուրաքանչյուր առևտրային տարվա համար գտեք առևտրի փակման գնի ծայրահեղ արժեքները) - պարբերաբար
- Պարբերաբար վերբեռնեք առևտրի վերջին տվյալները
- Պարբերաբար վերբեռնեք յուրաքանչյուր անվտանգության համար ցուցիչների հարմարեցված ցանկ
Ինչպես և սպասվում էր, մենք նախագծի համար անվանում ենք զրոյից. հորտոն
Պատրաստում ենք ենթակառուցվածքները
Վերնագիրն, անշուշտ, ուժեղ է, այնուամենայնիվ, այն ամենը, ինչ ձեզ հարկավոր է, գրել է մի փոքրիկ կոնֆիգուրգ docker-compose-ի համար՝ kafka-ով (և zookeeper՝ մեկ կոնտեյներով), kafdrop (եթե ուզում ենք հաղորդագրությունները դիտել թեմաներում), mongodb-ով: Մենք ստանում ենք [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-ին։ Հոդվածում ֆայլերի ամբողջական տեքստը չեմ տրամադրի, որպեսզի չուշացնեմ, բայց կտրամադրեմ անհրաժեշտ տարբերակների հղումները։
Եկեք սկսենք նախագծի վերաբերյալ կախվածություններից և մետաներից.
Այնուհետև մենք սկսում ենք կախվածություններ տեղադրել և ստեղծել virtualenv (կամ կարող եք ինքներդ ստեղծել venv թղթապանակը և ակտիվացնել միջավայրը).
pip3 install poetry (если ещё не установлено)
poetry install
Հիմա եկեք ստեղծենք
Mongo-ին միանալիս ամեն ինչ բավականին պարզ է։ հայտարարեց
Ինչ է լինելու հաջորդը.
Հոդվածն այնքան էլ երկար չէ, քանի որ այստեղ ես խոսում եմ միայն մոտիվացիայի և պատրաստության մասին, այնպես որ ինձ մի մեղադրեք, խոստանում եմ, որ հաջորդ մասը կունենա գործողություն և գրաֆիկա:
Այսպիսով, հենց այս հաջորդ մասում մենք.
- Եկեք գրենք փոքր հաճախորդ alphavantage-ի համար aiohttp-ում՝ մեզ անհրաժեշտ վերջնակետերի հարցումներով:
- Եկեք ստեղծենք գործակալ, ով կհավաքի տվյալներ արժեթղթերի և պատմական գների վերաբերյալ նրանց համար:
Source: www.habr.com