Faust üzrə fon tapşırıqları, I hissə: Giriş

Faust üzrə fon tapşırıqları, I hissə: Giriş

Mən necə yaşamağa gəldim?

Bir müddət əvvəl mən mürəkkəb hesablamalar və üçüncü tərəf xidmətləri üçün sorğularla çox sayda fon tapşırıqlarının müntəzəm icrasını təşkil etmək lazım olan yüksək yüklənmiş bir layihənin arxa tərəfində işləməli oldum. Layihə asinxrondur və mən gəlməmişdən əvvəl onun cron-başlatma tapşırıqları üçün sadə mexanizmi var idi: cari vaxtı yoxlayan dövrə və toplama vasitəsilə koroutin qruplarını işə salmaq - bu yanaşma onlarla və yüzlərlə belə koroutinlər olana qədər məqbul oldu. , lakin onların sayı iki mini keçdikdə mən makler, bir neçə işçi və s. ilə normal tapşırıq növbəsi təşkil etmək barədə düşünməli oldum.

Əvvəlcə əvvəllər istifadə etdiyim Kərəvizi sınamaq qərarına gəldim. Layihənin asinxron olması səbəbindən suala daldım və gördüm MəqaləHəmçinin layihə, məqalənin müəllifi tərəfindən yaradılmışdır.

Bunu deyəcəyəm, layihə çox maraqlıdır və komandamızın digər tətbiqlərində kifayət qədər uğurla işləyir və müəllif özü deyir ki, asinxron hovuzdan istifadə edərək onu istehsala çıxara bilib. Ancaq təəssüf ki, göründüyü kimi, bu, mənə uyğun gəlmədi problem tapşırıqların qrup işə salınması ilə (bax. qrup). Yazı zamanı buraxılış artıq bağlanıb, lakin bir aydır iş gedir. Hər halda, müəllifə uğurlar və hər şeyin ən yaxşısı, çünki artıq libdə işləyən şeylər var... ümumiyyətlə, məsələ məndədir və alət mənim üçün nəm oldu. Bundan əlavə, bəzi tapşırıqların müxtəlif xidmətlərə 2-3 http sorğusu var idi, buna görə də tapşırıqları optimallaşdırarkən belə, təxminən hər 4 saatdan bir 2 min TCP bağlantısı yaradırıq - çox yaxşı deyil... Mən bir növ seans yaratmaq istərdim. işçilərə başladıqda vəzifə. aiohttp vasitəsilə çoxlu sayda sorğu haqqında bir az daha burada.

Bu baxımdan axtarmağa başladım alternativlər və tapdı! Kərəvizin yaradıcıları, konkret olaraq, mən başa düşdüyüm kimi Solemdən soruşun, yaradılmışdır Faust, əvvəlcə layihə üçün Robinhood. Faust Kafka Streams-dən ilhamlanıb və Kafka ilə broker kimi işləyir, rocksdb də agentlərin işinin nəticələrini saxlamaq üçün istifadə olunur və ən əsası kitabxananın asinxron olmasıdır.

Həm də baxa bilərsiniz sürətli müqayisə sonuncunun yaradıcılarından kərəviz və faust: onların fərqləri, brokerlər arasındakı fərqlər, elementar vəzifənin həyata keçirilməsi. Hər şey olduqca sadədir, lakin faustun gözəl bir xüsusiyyəti diqqəti cəlb edir - mövzuya ötürülmək üçün yazılmış məlumatlar.

Biz nə edirik?

Beləliklə, qısa məqalələr silsiləsində sizə Faust istifadə edərək fon tapşırıqlarından məlumat toplamaq yollarını göstərəcəyəm. Nümunə layihəmizin mənbəyi adından da göründüyü kimi, alphavantage.co. Mən agentləri (sink, mövzular, arakəsmələr) necə yazmağı, müntəzəm (cron) icra etməyi, ən rahat faust cli əmrlərini (klik üzərində sarğı), sadə klasterləşdirməni nümayiş etdirəcəyəm və sonunda bir datadog əlavə edəcəyik ( qutudan kənarda işləmək) və görmək üçün bir şey etməyə çalışın. Toplanmış məlumatları saxlamaq üçün əlaqə üçün mongodb və motordan istifadə edəcəyik.

P.S. Monitorinqlə bağlı mətləbin hansı inamla yazıldığını nəzərə alsaq, düşünürəm ki, sonuncu məqalənin sonundakı oxucu hələ də belə görünəcək:

Faust üzrə fon tapşırıqları, I hissə: Giriş

Layihə tələbləri

Artıq söz verdiyimə görə, xidmətin nə edə biləcəyinin kiçik bir siyahısını verək:

  1. Qiymətli kağızları və onların icmalını (son bir il üçün mənfəət və zərər, balans hesabatı, pul vəsaitlərinin hərəkəti daxil olmaqla) yükləyin - müntəzəm olaraq
  2. Tarixi məlumatları yükləyin (hər ticarət ili üçün ticarətin bağlanma qiymətinin həddindən artıq dəyərlərini tapın) - müntəzəm olaraq
  3. Ən son ticarət məlumatlarını yükləyin - müntəzəm olaraq
  4. Hər bir təhlükəsizlik üçün göstəricilərin fərdiləşdirilmiş siyahısını yükləyin - müntəzəm olaraq

Gözlənildiyi kimi, biz sıfırdan layihə üçün bir ad seçirik: horton

Biz infrastrukturu hazırlayırıq

Başlıq sözsüz ki, güclüdür, lakin sizə lazım olan şey kafka (və zookeeper - bir konteynerdə), kafdrop (əgər mövzulardakı mesajlara baxmaq istəsək), mongodb ilə docker-compose üçün kiçik bir konfiqurasiya yazmaqdır. alırıq [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) aşağıdakı formada:

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

Burada ümumiyyətlə mürəkkəb bir şey yoxdur. Kafka üçün iki dinləyici elan edildi: biri (daxili) kompozit şəbəkə daxilində istifadə üçün, ikincisi (xarici) xaricdən gələn sorğular üçün, ona görə də onu xaricə yönləndirdilər. 2181 - zookeper limanı. Qalanları, məncə, aydındır.

Layihənin skeletinin hazırlanması

Əsas versiyada layihəmizin strukturu belə görünməlidir:

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 *

*Qeyd etdiyim hər şey Biz hələ ona toxunmuruq, sadəcə boş fayllar yaradırıq.**

Biz struktur yaratdıq. İndi lazım olan asılılıqları əlavə edək, konfiqurasiyanı yazıb mongodb-a qoşulaq. Gecikməmək üçün məqalədəki faylların tam mətnini verməyəcəyəm, lakin lazımi versiyalara keçidlər verəcəyəm.

Layihə haqqında asılılıqlar və meta ilə başlayaq - pyproject.toml

Sonra, asılılıqları quraşdırmağa və virtualenv yaratmağa başlayırıq (yaxud venv qovluğunu özünüz yarada və mühiti aktivləşdirə bilərsiniz):

pip3 install poetry (если ещё не установлено)
poetry install

İndi yaradaq config.yml - Etibarnamə və harada döymək. Orada alfavant üçün məlumatları dərhal yerləşdirə bilərsiniz. Yaxşı, keçək config.py — konfiqurasiyamızdan tətbiq üçün məlumatları çıxarın. Bəli, etiraf edirəm, mən libtimdən istifadə etdim - sitri.

Mongo-ya qoşulduqda hər şey olduqca sadədir. elan etdi müştəri sinfi qoşulmaq və əsas sinif kolleksiyalar üzrə sorğuların aparılmasını asanlaşdırmaq üçün xörəklər üçün.

Bundan sonra nə olacaq?

Məqalə çox uzun deyil, çünki burada mən yalnız motivasiya və hazırlıqdan danışıram, buna görə də məni günahlandırmayın - söz verirəm ki, növbəti hissədə hərəkət və qrafika olacaq.

Beləliklə, növbəti hissədə biz:

  1. Bizə lazım olan son nöqtələr üçün sorğularla aiohttp-də alfavantage üçün kiçik bir müştəri yazaq.
  2. Gəlin qiymətli kağızlar və onlar üçün tarixi qiymətlər haqqında məlumat toplayan agent yaradaq.

Layihə kodu

Bu hissə üçün kod

Mənbə: www.habr.com

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