Bagaimana saya bisa hidup seperti ini?
Belum lama ini saya harus mengerjakan bagian belakang proyek yang sarat muatan, di mana perlu mengatur pelaksanaan rutin sejumlah besar tugas latar belakang dengan perhitungan rumit dan permintaan layanan pihak ketiga. Proyek ini tidak sinkron dan sebelum saya datang, ia memiliki mekanisme sederhana untuk tugas peluncuran cron: sebuah loop yang memeriksa waktu saat ini dan meluncurkan grup coroutine melalui pengumpulan - pendekatan ini ternyata dapat diterima sampai ada lusinan dan ratusan coroutine tersebut Namun, ketika jumlahnya melebihi dua ribu, saya harus memikirkan untuk mengatur antrian tugas normal dengan seorang broker, beberapa pekerja, dan sebagainya.
Pertama saya memutuskan untuk mencoba Seledri, yang pernah saya gunakan sebelumnya. Karena sifat proyek yang tidak sinkron, saya menyelami pertanyaan dan melihatnya
Saya akan mengatakan ini, proyek ini sangat menarik dan bekerja cukup sukses di aplikasi lain dari tim kami, dan penulis sendiri mengatakan bahwa dia dapat meluncurkannya ke dalam produksi menggunakan kumpulan asinkron. Tapi, sayangnya, ternyata hal itu tidak terlalu cocok untukku
Dalam hal ini, saya mulai mencari alternatif dan menemukannya! Pencipta seledri, khususnya, menurut pemahaman saya
Anda juga bisa melihatnya
Apa yang kita lakukan?
Jadi, dalam rangkaian artikel singkat, saya akan menunjukkan cara mengumpulkan data dari tugas latar belakang menggunakan Faust. Sumber untuk proyek contoh kita adalah, seperti namanya,
PS Dilihat dari keyakinan penulisan poin tentang pemantauan, menurut saya pembaca di akhir artikel terakhir masih akan melihat seperti ini:
Persyaratan proyek
Karena apa yang telah saya janjikan, mari kita buat daftar kecil tentang apa yang seharusnya dapat dilakukan oleh layanan tersebut:
- Unggah sekuritas dan ikhtisarnya (termasuk laba dan rugi, neraca, arus kas - selama setahun terakhir) - secara teratur
- Unggah data historis (untuk setiap tahun perdagangan, temukan nilai ekstrim dari harga penutupan perdagangan) - secara teratur
- Unggah data perdagangan terbaru - secara teratur
- Unggah daftar indikator yang disesuaikan untuk setiap keamanan - secara teratur
Seperti yang diharapkan, kami memilih nama untuk proyek dari awal: Horton
Infrastruktur sedang kami persiapkan
Judulnya tentu kuat, namun yang perlu Anda lakukan hanyalah menulis konfigurasi kecil untuk docker-compose dengan kafka (dan zookeeper - dalam satu wadah), kafdrop (jika kita ingin melihat pesan dalam topik), mongodb. Kita mendapatkan [buruh pelabuhan-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
Tidak ada yang rumit sama sekali di sini. Dua pendengar dideklarasikan untuk kafka: satu (internal) untuk digunakan di dalam jaringan komposit, dan yang kedua (eksternal) untuk permintaan dari luar, sehingga mereka meneruskannya ke luar. 2181 — pelabuhan penjaga kebun binatang. Selebihnya, menurut saya, sudah jelas.
Mempersiapkan kerangka proyek
Dalam versi dasar, struktur proyek kita akan terlihat seperti ini:
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 *
*Semua yang saya catat Kami belum menyentuhnya, kami hanya membuat file kosong.**
Kami membuat struktur. Sekarang mari tambahkan dependensi yang diperlukan, tulis konfigurasi dan sambungkan ke mongodb. Saya tidak akan memberikan teks lengkap dari file di artikel, agar tidak menundanya, tetapi saya akan memberikan tautan ke versi yang diperlukan.
Mari kita mulai dengan dependensi dan meta tentang proyek -
Selanjutnya, kita mulai menginstal dependensi dan membuat virtualenv (atau Anda dapat membuat folder venv sendiri dan mengaktifkan lingkungan):
pip3 install poetry (если ещё не установлено)
poetry install
Sekarang mari kita berkreasi
Saat terhubung ke Mongo, semuanya cukup sederhana. diumumkan
Apa yang akan terjadi selanjutnya?
Artikelnya tidak terlalu panjang, karena disini saya hanya berbicara tentang motivasi dan persiapan, jadi jangan salahkan saya - saya berjanji di bagian selanjutnya akan ada aksi dan grafik.
Jadi, di bagian selanjutnya ini kita:
- Mari kita menulis klien kecil untuk alphavantage di aiohttp dengan permintaan untuk titik akhir yang kita butuhkan.
- Mari kita buat agen yang akan mengumpulkan data sekuritas dan harga historisnya.
Sumber: www.habr.com