Faust bo'yicha asosiy vazifalar, I qism: Kirish

Faust bo'yicha asosiy vazifalar, I qism: Kirish

Qanday qilib men shunday yashashga keldim?

Yaqinda men juda yuklangan loyihaning orqa tomonida ishlashim kerak edi, unda murakkab hisob-kitoblar va uchinchi tomon xizmatlariga so'rovlar bilan ko'p sonli fon vazifalarini muntazam ravishda bajarishni tashkil qilish kerak edi. Loyiha asinxrondir va men kelishimdan oldin u vazifalarni bajarish uchun oddiy mexanizmga ega edi: joriy vaqtni tekshirish va yig'ish orqali korutinlar guruhlarini ishga tushirish - bu yondashuv o'nlab va yuzlab shunday koroutinlar mavjud bo'lmaguncha maqbul bo'lib chiqdi. , ammo, ularning soni ikki mingdan oshganda, men broker, bir nechta ishchi va boshqalar bilan oddiy vazifa navbatini tashkil qilish haqida o'ylashim kerak edi.

Avvaliga men ilgari ishlatgan Seldereyni sinab ko'rishga qaror qildim. Loyihaning asinxron tabiati tufayli men savolga sho'ng'idim va ko'rdim maqola, shuningdek qoralama, maqola muallifi tomonidan yaratilgan.

Men shuni aytamanki, loyiha juda qiziqarli va bizning jamoamizning boshqa ilovalarida juda muvaffaqiyatli ishlaydi va muallifning o'zi uni asinxron hovuz yordamida ishlab chiqarishga chiqarishga muvaffaq bo'lganligini aytadi. Ammo, afsuski, bu menga to'g'ri kelmadi, chunki ma'lum bo'ldi muammo vazifalarni guruhli boshlash bilan (qarang. guruh). Yozish vaqtida nashr allaqachon yopiq, ammo ish bir oydan beri davom etmoqda. Qanday bo'lmasin, muallifga omad va eng yaxshisi, chunki libda allaqachon ishlaydigan narsalar bor ... umuman olganda, nuqta menda va asbob men uchun nam bo'lib chiqdi. Bundan tashqari, ba'zi vazifalarda turli xizmatlarga 2-3 http so'rovlari bor edi, shuning uchun ham vazifalarni optimallashtirishda biz 4 ming TCP ulanishini yaratamiz, taxminan har 2 soatda - unchalik yaxshi emas... Men bir turdagi seans yaratmoqchiman. ishchilarni ishga tushirishda vazifa. aiohttp orqali ko'p sonli so'rovlar haqida bir oz ko'proq shu yerda.

Shu munosabat bilan men izlay boshladim muqobillar va topildi! Seldereyni yaratuvchilar, xususan, men tushunganimdek Solemdan so'rang, yaratilgan Faust, dastlab loyiha uchun robinhood. Faust Kafka oqimlaridan ilhomlangan va Kafka bilan broker sifatida ishlaydi, rocksdb ham agentlar ishi natijalarini saqlash uchun ishlatiladi va eng muhimi kutubxona asinxrondir.

Bundan tashqari, siz qarashingiz mumkin tez taqqoslash ikkinchisini yaratuvchilardan selderey va faust: ularning farqlari, brokerlar o'rtasidagi farqlar, elementar vazifani amalga oshirish. Hammasi juda oddiy, ammo faustdagi yoqimli xususiyat e'tiborni tortadi - mavzuga o'tkazish uchun yozilgan ma'lumotlar.

Nima qilamiz?

Shunday qilib, qisqacha maqolalar turkumida men sizga Faust yordamida fon vazifalaridan ma'lumotlarni qanday yig'ishni ko'rsataman. Bizning namunaviy loyihamiz uchun manba, nomidan ko'rinib turibdiki, alphavantage.co. Men agentlarni (sink, mavzular, bo'limlar) qanday yozishni, muntazam (cron) bajarilishini, eng qulay faust cli buyruqlarini (klik orqali o'rash), oddiy klasterlashni ko'rsataman va oxirida biz datadogni biriktiramiz ( qutidan tashqarida ishlash) va biror narsani ko'rishga harakat qiling. Yig'ilgan ma'lumotlarni saqlash uchun biz ulanish uchun mongodb va motordan foydalanamiz.

PS. Monitoring haqidagi fikr qay darajada yozilganligiga qarab, oxirgi maqolaning oxiridagi o'quvchi hali ham shunday ko'rinishda bo'ladi deb o'ylayman:

Faust bo'yicha asosiy vazifalar, I qism: Kirish

Loyiha talablari

Men allaqachon va'da qilganim sababli, keling, xizmat nima qilishi kerakligi haqida kichik ro'yxat tuzaylik:

  1. Qimmatli qog'ozlarni va ularning umumiy ko'rinishini (shu jumladan foyda va zararlar, balans, pul oqimi - oxirgi yil uchun) yuklash - muntazam ravishda
  2. Tarixiy ma'lumotlarni yuklang (har bir savdo yili uchun savdoning yopilish narxining ekstremal qiymatlarini toping) - muntazam ravishda
  3. So'nggi savdo ma'lumotlarini yuklang - muntazam ravishda
  4. Har bir xavfsizlik uchun moslashtirilgan ko'rsatkichlar ro'yxatini muntazam ravishda yuklang

Kutilganidek, biz noldan loyiha nomini tanlaymiz: Xorton

Biz infratuzilmani tayyorlayapmiz

Sarlavha albatta kuchli, ammo siz qilishingiz kerak bo'lgan narsa kafka (va zookeeper - bitta konteynerda), kafdrop (agar mavzulardagi xabarlarni ko'rib chiqmoqchi bo'lsak), mongodb bilan docker-compose uchun kichik konfiguratsiyani yozish. olamiz [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) quyidagi shaklda:

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

Bu erda hech qanday murakkab narsa yo'q. Kafka uchun ikkita tinglovchi e'lon qilindi: biri (ichki) kompozit tarmoq ichida foydalanish uchun, ikkinchisi (tashqi) tashqaridan so'rovlar uchun, shuning uchun ular uni tashqariga yo'naltirdilar. 2181 - hayvonot bog'i porti. Qolganlari, menimcha, aniq.

Loyihaning skeletini tayyorlash

Asosiy versiyada loyihamizning tuzilishi quyidagicha ko'rinishi kerak:

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 *

*Men qayd etgan hamma narsa Biz unga hali tegmayapmiz, shunchaki boʻsh fayllar yaratamiz.**

Biz tuzilma yaratdik. Endi kerakli bog'liqliklarni qo'shamiz, konfiguratsiyani yozamiz va mongodb ga ulanamiz. Men uni kechiktirmaslik uchun maqoladagi fayllarning to'liq matnini bermayman, lekin kerakli versiyalarga havolalar beraman.

Loyiha haqida bog'liqliklar va metadan boshlaylik - pyproject.toml

Keyinchalik, biz bog'liqliklarni o'rnatishni va virtualenv yaratishni boshlaymiz (yoki siz venv papkasini o'zingiz yaratishingiz va muhitni faollashtirishingiz mumkin):

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

Endi yarataylik config.yml - Hisob ma'lumotlari va qaerda taqillatish kerak. Siz darhol u erda alfavant uchun ma'lumotlarni joylashtirishingiz mumkin. Xo'sh, keling, davom etaylik config.py — konfiguratsiyamizdan dastur uchun ma'lumotlarni chiqarib oling. Ha, tan olaman, men o'zimdan foydalanganman - sitri.

Mongo-ga ulanishda hamma narsa juda oddiy. e'lon qildi mijoz klassi ulanish uchun va asosiy sinf to'plamlar bo'yicha so'rovlar qilishni osonlashtirish uchun.

Keyingi nima bo'ladi?

Maqola unchalik uzoq emas, chunki bu erda men faqat motivatsiya va tayyorgarlik haqida gapiryapman, shuning uchun meni ayblamang - keyingi qismda harakatlar va grafikalar bo'lishiga va'da beraman.

Shunday qilib, keyingi qismda biz:

  1. Bizga kerakli so'nggi nuqtalar uchun so'rovlar bilan aiohttp-da alfavantage uchun kichik mijoz yozamiz.
  2. Keling, qimmatli qog'ozlar va ular uchun tarixiy narxlar to'g'risida ma'lumot to'playdigan agent yarataylik.

Loyiha kodi

Ushbu qism uchun kod

Manba: www.habr.com

a Izoh qo'shish