Nilikujaje kuishi hivi?
Sio muda mrefu uliopita nilipaswa kufanya kazi kwenye backend ya mradi uliojaa sana, ambayo ilikuwa ni lazima kuandaa utekelezaji wa mara kwa mara wa idadi kubwa ya kazi za nyuma na mahesabu magumu na maombi ya huduma za tatu. Mradi huo ni sawa na kabla sijaja, ulikuwa na utaratibu rahisi wa kazi za uzinduzi wa cron: kitanzi kinachoangalia wakati wa sasa na kuzindua vikundi vya coroutines kupitia mkusanyiko - njia hii ilikubalika hadi kulikuwa na kadhaa na mamia ya coroutines kama hizo. , hata hivyo, wakati idadi yao ilizidi elfu mbili, nilipaswa kufikiri juu ya kuandaa foleni ya kazi ya kawaida na broker, wafanyakazi kadhaa, na kadhalika.
Kwanza niliamua kujaribu Celery, ambayo nilikuwa nimeitumia hapo awali. Kwa sababu ya hali isiyo ya kawaida ya mradi, nilijiingiza kwenye swali na nikaona
Nitasema hivi, mradi huo ni wa kufurahisha sana na unafanya kazi kwa mafanikio katika matumizi mengine ya timu yetu, na mwandishi mwenyewe anasema kwamba aliweza kuisambaza kwa uzalishaji kwa kutumia dimbwi la asynchronous. Lakini, kwa bahati mbaya, haikufaa kwangu, kama ilivyotokea
Katika suala hili, nilianza kuangalia njia mbadala na kuipata! Waundaji wa celery, haswa, kama ninavyoelewa
Pia, unaweza kuangalia
Tunafanya nini?
Kwa hiyo, katika mfululizo mfupi wa makala, nitakuonyesha jinsi ya kukusanya data kutoka kwa kazi za nyuma kwa kutumia Faust. Chanzo cha mradi wetu wa mfano kitakuwa, kama jina linavyopendekeza,
PS Kwa kuzingatia imani ambayo hoja ya ufuatiliaji iliandikwa, nadhani msomaji mwishoni mwa kifungu kilichopita bado ataonekana kama hii:
Mahitaji ya mradi
Kwa sababu ya ukweli kwamba tayari nimeahidi, wacha tufanye orodha ndogo ya kile huduma inapaswa kuwa na uwezo wa kufanya:
- Pakia dhamana na muhtasari wao (pamoja na faida na hasara, karatasi ya usawa, mtiririko wa pesa - kwa mwaka jana) - mara kwa mara
- Pakia data ya kihistoria (kwa kila mwaka wa biashara, pata maadili yaliyokithiri ya bei ya kufunga ya biashara) - mara kwa mara
- Pakia data ya hivi punde ya biashara - mara kwa mara
- Pakia orodha iliyobinafsishwa ya viashiria kwa kila usalama - mara kwa mara
Kama inavyotarajiwa, tunachagua jina la mradi kutoka mwanzo: Horton
Tunatayarisha miundombinu
Kichwa hakika kina nguvu, hata hivyo, unachohitaji kufanya ni kuandika usanidi mdogo wa docker-compose na kafka (na zookeeper - kwenye chombo kimoja), kafdrop (ikiwa tunataka kuangalia ujumbe katika mada), mongodb. Tunapata [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
Hakuna kitu ngumu hapa hata kidogo. Wasikilizaji wawili walitangazwa kwa kafka: moja (ya ndani) kwa matumizi ndani ya mtandao wa watunzi, na ya pili (ya nje) kwa maombi kutoka nje, kwa hivyo waliisambaza nje. 2181 - bandari ya zookeeper. Wengine, nadhani, ni wazi.
Kuandaa mifupa ya mradi
Katika toleo la msingi, muundo wa mradi wetu unapaswa kuonekana kama hii:
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 *
*Kila kitu nilichobainisha Bado hatuigusi, tunaunda faili tupu.**
Tumeunda muundo. Sasa hebu tuongeze utegemezi muhimu, andika usanidi na uunganishe kwa mongodb. Sitatoa maandishi kamili ya faili kwenye kifungu, ili usichelewesha, lakini nitatoa viungo kwa matoleo muhimu.
Wacha tuanze na utegemezi na meta juu ya mradi -
Ifuatayo, tunaanza kusanikisha utegemezi na kuunda virtualenv (au unaweza kuunda folda ya venv mwenyewe na kuamsha mazingira):
pip3 install poetry (если ещё не установлено)
poetry install
Sasa tuunde
Wakati wa kuunganisha kwa Mongo, kila kitu ni rahisi sana. alitangaza
Je, nini kitafuata?
Nakala hiyo sio ndefu sana, kwani hapa ninazungumza tu juu ya motisha na maandalizi, kwa hivyo usinilaumu - ninaahidi kuwa sehemu inayofuata itakuwa na hatua na michoro.
Kwa hivyo, katika sehemu hii inayofuata sisi:
- Wacha tuandike mteja mdogo kwa alfavantage kwenye aiohttp na maombi ya miisho tunayohitaji.
- Hebu tuunde wakala ambaye atakusanya data juu ya dhamana na bei za kihistoria kwa ajili yake.
Chanzo: mapenzi.com