Фаусттай холбоотой үндсэн даалгавар, I хэсэг: Оршил

Фаусттай холбоотой үндсэн даалгавар, I хэсэг: Оршил

Би яаж ингэж амьдрах болсон юм бэ?

Тун удалгүй би маш их ачаалалтай төслийн арын хэсэг дээр ажиллах шаардлагатай болсон бөгөөд үүнд нарийн төвөгтэй тооцоолол, гуравдагч талын үйлчилгээ авах хүсэлт бүхий олон тооны суурь даалгавруудыг тогтмол гүйцэтгэх ажлыг зохион байгуулах шаардлагатай болсон. Төсөл нь асинхрон бөгөөд намайг ирэхээс өмнө даалгавруудыг гүйцэтгэх энгийн механизмтай байсан: одоогийн цагийг шалгаж, цуглуулах замаар корутинуудын бүлгүүдийг эхлүүлдэг гогцоо - хэдэн арван, хэдэн зуун ийм корутин гарах хүртэл энэ арга нь зөвшөөрөгдөх боломжтой болсон. Гэсэн хэдий ч тэдний тоо хоёр мянга давсан үед би брокер, хэд хэдэн ажилчин гэх мэт ердийн ажлын дараалал зохион байгуулах талаар бодох хэрэгтэй болсон.

Эхлээд би өмнө нь хэрэглэж байсан Celery-г туршиж үзэхээр шийдсэн. Төслийн асинхрон шинж чанараас шалтгаалан би асуулт руу шумбаж, харсан нийтлэлтүүнчлэн ноорог, нийтлэлийн зохиогчийн бүтээсэн.

Би үүнийг хэлэх болно, төсөл нь маш сонирхолтой бөгөөд манай багийн бусад хэрэглээнд амжилттай ажиллаж байгаа бөгөөд зохиогч өөрөө үүнийг асинхрон усан санг ашиглан үйлдвэрлэлд нэвтрүүлж чадсан гэж хэлсэн. Гэвч харамсалтай нь энэ нь надад тохирохгүй байсан асуудал бүлгийн даалгавруудыг эхлүүлэх (харна уу. бүлэг). Бичиж байх үед асуудал аль хэдийн хаагдсан, гэхдээ нэг сарын турш ажил үргэлжилж байна. Ямар ч байсан, зохиогчид нь амжилт хүсье, lib дээр аль хэдийн ажиллаж байгаа зүйлүүд байгаа тул хамгийн сайн сайхныг хүсье ... ерөнхийдөө гол зүйл нь надад байгаа бөгөөд хэрэгсэл нь надад чийгтэй болсон. Нэмж дурдахад, зарим даалгаврууд өөр өөр үйлчилгээнд 2-3 http хүсэлттэй байсан тул даалгавруудыг оновчтой болгохдоо бид ойролцоогоор 4 цаг тутамд 2 мянган TCP холболт үүсгэдэг - тийм ч сайн биш ... Би нэг төрлийн сесс үүсгэхийг хүсч байна. ажилчдыг эхлүүлэх үед даалгавар. aiohttp-ээр дамжуулан олон тооны хүсэлтийн талаар бага зэрэг илүү энд.

Үүнтэй холбогдуулан би хайж эхэлсэн өөр хувилбарууд тэгээд оллоо! Селөдерей бүтээгчид, ялангуяа миний ойлгож байгаагаар Солемоос асуу, үүсгэгдсэн Faust, анх төсөлд зориулагдсан дээрэмдэх. Фауст нь Кафкагийн урсгалаас санаа авч, Кафкатай брокероор ажилладаг, rocksdb нь агентуудын ажлын үр дүнг хадгалахад ашиглагддаг бөгөөд хамгийн чухал нь номын сан нь асинхрон байдаг.

Мөн та харж болно хурдан харьцуулалт селөдерей ба фаустыг бүтээгчдээс: тэдгээрийн ялгаа, брокеруудын хоорондох ялгаа, энгийн даалгаврын хэрэгжилт. Бүх зүйл маш энгийн, гэхдээ фауст дахь сайхан шинж чанар нь анхаарлыг татдаг - сэдэв рүү дамжуулахад зориулж бичсэн өгөгдөл.

Бид юу хийх вэ?

Тиймээс, богино цуврал нийтлэлд би Фаустыг ашиглан далд ажлуудаас хэрхэн өгөгдөл цуглуулахыг харуулах болно. Бидний жишээ төслийн эх сурвалж нь нэрнээс нь харахад, alphavantage.co. Би агентуудыг (угаалтуур, сэдвүүд, хуваалтууд) хэрхэн бичих, ердийн (cron) гүйцэтгэлийг хэрхэн хийх, хамгийн тохиромжтой faust cli командууд (товшилтоор боодол), энгийн кластер хийх, эцэст нь бид datadog () хавсаргах болно. хайрцагнаас гарч ажиллах) мөн ямар нэг зүйлийг харахыг хичээ. Цуглуулсан өгөгдлийг хадгалахын тулд бид mongodb болон мотор ашиглан холболт хийх болно.

Жич Мониторингийн тухай санааг ямар итгэлтэйгээр бичсэнээс харахад сүүлийн нийтлэлийн төгсгөлд уншигчид иймэрхүү харагдах болно гэж би бодож байна.

Фаусттай холбоотой үндсэн даалгавар, I хэсэг: Оршил

Төслийн шаардлага

Би аль хэдийн амласан тул үйлчилгээ нь юу хийх боломжтой талаар жижиг жагсаалтыг гаргая:

  1. Үнэт цаас, тэдгээрийн тоймыг (сүүлийн жилийн ашиг, алдагдал, тайлан баланс, мөнгөн гүйлгээ зэрэг) байршуулах - тогтмол
  2. Түүхэн мэдээллийг байршуулах (арилжааны жил бүрийн хувьд арилжааны хаалтын үнийн хэт утгыг олох) - тогтмол
  3. Хамгийн сүүлийн үеийн арилжааны өгөгдлийг байнга байршуулах
  4. Аюулгүй байдал тус бүрийн шалгуур үзүүлэлтийн жагсаалтыг тогтмол байршуулах

Хүлээгдэж буйгаар бид төслийн нэрийг эхнээс нь сонгоно: хортон

Бид дэд бүтцийг нь бэлдэж байна

Гарчиг нь мэдээж хүчтэй боловч та хийх ёстой зүйл бол kafka (мөн амьтны хүрээлэнгийн ажилтан - нэг саванд), kafdrop (хэрэв бид сэдвүүдийн мессежийг үзэхийг хүсвэл), mongodb ашиглан docker-compose-ийн жижиг тохиргоог бичихэд хангалттай. Бид авдаг [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 - манай тохиргооноос програмын өгөгдлийг задлах. Тийм ээ, би хүлээн зөвшөөрч байна, би либеригээ ашигласан - Сайхан.

Mongo-д холбогдоход бүх зүйл маш энгийн байдаг. зарлалаа үйлчлүүлэгчийн ангилал холбох ба суурь анги Цуглуулга дээр асуулга хийхэд хялбар болгох үүднээс царцдас.

Дараа нь юу болох вэ?

Нийтлэл тийм ч урт биш, учир нь би энд зөвхөн урам зориг, бэлтгэлийн тухай ярьж байгаа тул намайг битгий буруутгаарай - дараагийн хэсэгт үйл ажиллагаа, график байх болно гэдгийг би амлаж байна.

Тиймээс, энэ дараагийн хэсэгт бид:

  1. Бидэнд хэрэгтэй төгсгөлийн цэгүүдийн хүсэлтийг aiohttp дээр alphavantage-д зориулсан жижиг клиент бичье.
  2. Үнэт цаас, тэдгээрийн түүхэн үнийн талаархи мэдээллийг цуглуулах агент байгуулъя.

Төслийн код

Энэ хэсгийн код

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх