Latar Tugas dina Faust, Bagian I: Bubuka

Latar Tugas dina Faust, Bagian I: Bubuka

Kumaha kuring bisa hirup kawas kieu?

Teu lami pisan kuring kedah damel di backend tina proyék anu sarat pisan, dimana anjeun kedah ngatur palaksanaan rutin sajumlah ageung tugas latar kalayan itungan rumit sareng pamundut pikeun jasa pihak katilu. Proyék éta henteu sinkron sareng sateuacan kuring sumping, éta ngagaduhan mékanisme saderhana pikeun tugas cron-launching: loop mariksa waktos ayeuna sareng ngaluncurkeun grup coroutines via gathering - pendekatan ieu tétéla tiasa ditarima dugi ka aya puluhan sareng ratusan coroutines sapertos kitu. , kumaha oge, lamun jumlah maranéhanana ngaleuwihan dua rébu, Kuring kungsi mikir ngeunaan pangatur antrian tugas normal jeung calo a, sababaraha pagawe, jeung saterusna.

Mimiti kuring mutuskeun pikeun nyobaan Seledri, anu kuring kantos dianggo sateuacanna. Alatan sipat Asynchronous proyék, abdi dived kana patarosan tur nempo tulisan, jeung proyékna, dijieun ku panulis artikel.

Kuring bakal nyebutkeun ieu, proyék nu pisan metot sarta jalan rada suksés di aplikasi sejenna tim kami, sarta panulis sorangan nyebutkeun yen anjeunna bisa gulung kaluar kana produksi ku ngagunakeun hiji kolam renang Asynchronous. Tapi, hanjakalna, éta teu bener cocog kuring, sakumaha tétéla masalahna kalayan peluncuran tugas kelompok (tingali. kumpulan). Dina waktu nulis masalah geus ditutup, kumaha oge, pagawean geus lumangsung salila sabulan. Dina sagala hal, alus tuah ka panulis sarta sakabeh pangalusna, saprak aya geus bisa dipake dina lib nu ... sacara umum, titik dina kuring jeung alat tétéla beueus pikeun kuring. Sajaba ti éta, sababaraha pancén miboga 2-3 requests http kana jasa béda, jadi sanajan optimizing tugas, urang nyieun 4 sarébu sambungan TCP, kira unggal 2 jam - teu pisan alus ... Abdi hoyong nyieun sési pikeun hiji tipe. tugas nalika ngamimitian pagawe. A saeutik leuwih ngeunaan jumlah badag requests via aiohttp di dieu.

Dina hal ieu, kuring mimiti pilari alternatif sarta kapanggih eta! Pencipta seledri, husus, sakumaha Abdi ngartos eta Tanya Solem, dijieun Faust, asalna pikeun proyék robinhood. Faust diideuan ku Kafka Streams sareng damel sareng Kafka salaku calo, rocksdb ogé dianggo pikeun nyimpen hasil tina karya agén, sareng anu paling penting nyaéta perpustakaan henteu sinkron.

Ogé, anjeun tiasa ningali ngabandingkeun gancang seledri jeung faust ti pencipta dimungkinkeun: béda maranéhanana, béda antara calo, palaksanaan hiji tugas dasar. Sagalana cukup basajan, kumaha oge, fitur nice di faust metot perhatian - data diketik pikeun transmisi ka topik.

Naon anu urang laksanakeun?

Janten, dina séri tulisan anu pondok, kuring bakal nunjukkeun anjeun kumaha cara ngumpulkeun data tina tugas latar nganggo Faust. Sumber pikeun conto proyék urang bakal, sakumaha ngaranna nunjukkeun, alphavantage.co. Kuring baris demonstrate cara nulis agén (tilelep, jejer, partitions), kumaha ngalakukeun biasa (cron) palaksanaan, nu pangmerenahna faust cli paréntah (a wrapper leuwih klik), clustering basajan, sarta dina tungtungna urang ngagantelkeun datadog a ( digawé out of the box) jeung coba mun hal ningali. Pikeun nyimpen data anu dikumpulkeun kami bakal nganggo mongodb sareng motor pikeun sambungan.

PS Ditilik ku kapercayaan anu mana titik ngeunaan monitoring ieu ditulis, Jigana nu maca dina ahir artikel panungtungan masih bakal kasampak kawas kieu:

Latar Tugas dina Faust, Bagian I: Bubuka

Sarat proyék

Kusabab kanyataan yén kuring parantos jangji, hayu urang ngadamel daptar leutik naon anu kedah dilakukeun ku jasa:

  1. Unggah sekuritas sareng tinjauan aranjeunna (kalebet kauntungan sareng karugian, neraca, aliran kas - kanggo taun ka tukang) - rutin
  2. Unggah data sajarah (pikeun unggal taun dagang, panggihan nilai ekstrim tina harga nutup dagang) - rutin
  3. Unggah data dagang panganyarna - rutin
  4. Unggah daptar indikator khusus pikeun tiap kaamanan - rutin

Saperti nu diharapkeun, urang milih ngaran pikeun proyék ti scratch: Horton

Kami nyiapkeun infrastruktur

Judulna pasti kuat, kumaha oge, sadaya anu anjeun kedah laksanakeun nyaéta nyerat config leutik pikeun docker-compose sareng kafka (sareng zookeeper - dina hiji wadah), kafdrop (upami urang hoyong ningali pesen dina topik), mongodb. Urang meunang [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) tina bentuk ieu:

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

Aya nanaon pajeulit di dieu pisan. Dua listeners dinyatakeun pikeun kafka: hiji (internal) pikeun pamakéan di jero jaringan komposit, sarta kadua (éksternal) pikeun requests ti luar, ngarah diteruskeun kaluar. 2181 - palabuhan zookeeper. Sésana, kuring pikir, jelas.

Nyiapkeun kerangka proyék

Dina versi dasar, struktur proyék urang kedah sapertos kieu:

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 *

*Sagalana kuring nyatet Kami henteu acan ngarampa, ngan ukur nyiptakeun file kosong.**

Kami nyiptakeun struktur. Ayeuna hayu urang tambahkeun kabebasan anu diperyogikeun, nyerat config sareng sambungkeun ka mongodb. Kuring moal nyadiakeun téks lengkep file dina artikel, ku kituna teu reureuh eta, tapi kuring baris nyadiakeun Tumbu ka versi perlu.

Hayu urang mimitian ku dependensi sareng meta ngeunaan proyék - pyproject.toml

Salajengna, urang mimitian masang dependensi sareng nyiptakeun virtualenv (atanapi anjeun tiasa nyiptakeun folder venv nyalira sareng ngaktipkeun lingkunganana):

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

Ayeuna hayu urang nyieun config.yml - Kapercayaan sareng dimana sambel. Anjeun tiasa langsung nempatkeun data pikeun alphavantage di dinya. Nya, hayu urang teraskeun config.py - ekstrak data pikeun aplikasi tina config kami. Leres, kuring ngaku, kuring nganggo lib kuring - sitri.

Nalika nyambung ka Mongo, sadayana saderhana. ngumumkeun kelas klien pikeun nyambung jeung kelas dasar pikeun cruds, pikeun nyieun leuwih gampang queries on kumpulan.

Naon anu bakal kajadian salajengna?

Tulisan éta henteu panjang, sabab di dieu kuring ngan ukur nyarioskeun ngeunaan motivasi sareng persiapan, janten entong nyalahkeun kuring - kuring janji yén bagian salajengna bakal gaduh aksi sareng grafik.

Janten, dina bagian salajengna ieu urang:

  1. Hayu urang nulis hiji klien leutik keur alphavantage on aiohttp kalawan requests pikeun titiktungtung kami butuh.
  2. Hayu urang ngadamel agén anu bakal ngumpulkeun data ngeunaan jaminan sareng harga sajarah pikeun aranjeunna.

Kodeu proyék

Kode pikeun bagian ieu

sumber: www.habr.com

Tambahkeun komentar