
Nola iritsi naiz nire bizitzako puntu honetara?
Duela gutxi, karga handiko proiektu baten atzealdean lan egin nuen, eta horrek atzeko planoan zeregin kopuru handia aldizka exekutatu behar zuen, kalkulu konplexuekin eta hirugarrenen zerbitzuei egindako eskaerarekin. Proiektua asinkronoa da, eta sartu aurretik, cron lanen exekuzio mekanismo sinple bat zuen: uneko denbora egiaztatzeko begizta bat eta gather bidez korutina taldeak abiaraztea. Ikuspegi hau onargarria zen dozenaka edo ehunka korutina egon arte, baina haien kopurua bi milatik gorakoa zenean, broker batekin, hainbat langilerekin eta abarrekin zeregin-ilara egoki bat antolatzea pentsatu behar izan nuen.
Lehenik eta behin, lehenago ere erabiltzen nuen Celery probatzea erabaki nuen. Proiektuaren izaera asinkronoa dela eta, arazoa sakondu eta ikusi nuen , Baita , artikuluaren egileak sortua.
Hau esango dut: proiektua oso interesgarria da eta nahiko arrakastaz funtzionatzen du gure taldeko beste aplikazio batzuetan, eta egileak berak dio ekoizpenera zabaldu ahal izan zuela multzo asinkrono bat erabiliz. Baina, zoritxarrez, ez zuen guztiz funtzionatu niretzat, konturatu nintzen bezala... talde-zereginaren abiaraztearekin (ikus ). Idazteko unean, Itxita dago dagoeneko, baina lana hilabetez daramatza martxan. Nolanahi ere, zorte on eta onena egileari, dagoeneko gauzak martxan daudelako Lib-en... Funtsean, ni naiz, eta tresna apur bat gogorra izan da niretzat. Gainera, zeregin batzuek 2-3 HTTP eskaera zituzten zerbitzu ezberdinetara, beraz, zereginen optimizazioarekin ere, 4 TCP konexio sortzen ari gara, gutxi gorabehera 2 orduro—ez da oso ona... Langileak abiaraztean zeregin mota bakar baterako saio bat sortu nahiko nuke. Xehetasun gehiago aiohttp bidezko eskaera kopuru handiari buruz. .
Honekin lotuta, bilatzen hasi nintzen alternatibak Eta aurkitu dut! Celery-ren sortzaileek, zehazki, nik ulertzen dudan bezala. , sortu zen hasieran, proiekturako Faust Kafka Streams-en inspiratuta dago eta Kafkarekin lan egiten du broker gisa. Rocksdb ere erabiltzen du agenteen emaitzak gordetzeko. Garrantzitsuena, liburutegia asinkronoa da.
Begirada bat ere eman diezaiokezu Apioa eta Faust azken honen sortzaileengandik: haien desberdintasunak, bitartekarien arteko desberdintasunak eta oinarrizko zeregin baten inplementazioa. Dena nahiko sinplea da, baina Faustek ezaugarri polita du: gai batera pasatzeko idatzitako datuak.
Zer egingo dugu?
Beraz, artikulu sorta labur honetan, Faust erabiliz atzeko planoan egindako zereginetan datuak nola bildu erakutsiko dizuet. Gure adibide proiektuaren iturria, izenak dioen bezala, hau izango da: Agenteak (hustubideak, gaiak, partizioak) nola idatzi erakutsiko dut, ohiko exekuzioa (cron) nola konfiguratu, faust CLI komando erabilgarriak (klik egiteko modu bat), klusterizazio sinplea, eta azkenik, datadog gehituko dugu (kutxatik aterata funtzionatzen duena) eta zerbait ikusten saiatuko gara. Mongodb erabiliko dugu bildutako datuak gordetzeko eta konexiorako motorra.
P.S. Monitorizazioari buruzko paragrafoa idatzita dagoen konfiantza ikusita, uste dut azken artikuluaren amaieran irakurleak oraindik ere honelako zerbait ikusiko duela:

Proiektuaren eskakizunak
Dagoeneko agindu dudana kontuan hartuta, zerbitzuak egin ahal izan beharko lukeenaren zerrenda labur bat osatuko dugu:
- Deskargatu baloreak eta haien ikuspegi orokorra (irabaziak eta galerak, balantzea, azken urteko diru-fluxua barne) aldizka
- Deskargatu datu historikoak aldizka (aurkitu merkataritza-urte bakoitzerako itxiera-prezioen muturrak)
- Deskargatu azken merkataritza-datuak aldizka
- Deskargatu aldizka balore bakoitzerako adierazleen zerrenda pertsonalizatua
Ohi bezala, bat-batean aukeratu dugu proiektuarentzako izen bat: Horton
Azpiegitura prestatzen ari gara
Izenburua sendoa da zalantzarik gabe, hala ere, egin behar duzun guztia docker-compose-rako konfigurazio txiki bat idaztea da, kafka-rekin (eta zookeeper-ekin - edukiontzi bakarrean), kafdrop-ekin (gaietan mezuak ikusi nahi baditugu) eta mongodb-rekin. Lortzen dugu [docker-compose.yml]]() mota honetakoa:
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-serviceEz dago ezer konplikaturik hemen. Bi entzule deklaratu genituen Kafkarentzat: bat (barnekoa) sare konposatuaren barruan erabiltzeko, eta bigarrena (kanpokoa) kanpoko eskaeretarako, beraz, kanpora birbidali genuen. 2181 Zookeeper-en portua da. Gainerakoa, uste dut, argi dagoela.
Proiektuaren eskeletoa prestatzea.
Oinarrizko bertsioan, gure proiektuaren egitura honelakoa izan beharko litzateke:
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 **Aipatu nuen guztia Ez diogu oraindik ukituko, fitxategi hutsak sortzen ari gara, besterik ez.
Egitura sortu dugu. Orain, gehitu ditzagun beharrezko mendekotasunak, idatzi konfigurazioa eta konektatu gaitezen MongoDB-ra. Artikulu honetan ez dut fitxategien testu osoa emango laburbiltzeko, baina beharrezko bertsioetarako estekak emango ditut.
Has gaitezen proiektuaren mendekotasunekin eta metarekin -
Ondoren, menpekotasunak instalatzen eta ingurune birtual bat sortzen hasiko gara (edo zuk zeuk sor dezakezu venv karpeta eta ingurunea aktibatu):
pip3 install poetry (если ещё не установлено)
poetry installOrain sortu dezagun — kredituak eta nora joan. Alphavantage-ren datuak ere bertan argitaratu ditzakezu berehala. Beno, aurrera egin dezagun — aplikaziorako datuak gure konfiguraziotik ateratzen ditugu. Bai, aitortzen dut, nire liburutegia erabili dut — .
Mongorekin konektatzeari dagokionez, dena nahiko erraza da. Iragarri zuten konektatzeko eta Crudes-entzat, bildumen artean kontsultak egitea errazteko.
Zer gertatuko da gero?
Artikulu hau ez da oso luzea, motibazioaz eta prestaketaz bakarrik ari naizelako, beraz, izan pazientzia, hurrengo zatian ekintza eta grafikoak egongo direla agintzen dizut.
Beraz, hurrengo zati honetan bertan:
- Idatzi dezagun bezero txiki bat aiohttp-n alphaavantagerako, behar ditugun amaierako puntuen eskaerarekin.
- Baloreei eta haien prezio historikoei buruzko datuak bilduko dituen agente bat sortuko dugu.
Iturria: www.habr.com
