फॉस्ट पर पृष्ठभूमि कार्य, भाग I: परिचय

फॉस्ट पर पृष्ठभूमि कार्य, भाग I: परिचय

मैं इस तरह कैसे जीने लगा?

कुछ समय पहले मुझे एक अत्यधिक भरी हुई परियोजना के बैकएंड पर काम करना था, जिसमें जटिल गणनाओं और तृतीय-पक्ष सेवाओं के अनुरोधों के साथ बड़ी संख्या में पृष्ठभूमि कार्यों के नियमित निष्पादन को व्यवस्थित करना आवश्यक था। परियोजना अतुल्यकालिक है और मेरे आने से पहले, इसमें क्रॉन-लॉन्चिंग कार्यों के लिए एक सरल तंत्र था: वर्तमान समय की जांच करने वाला एक लूप और इकट्ठा होने के माध्यम से कोरटाइन के समूहों को लॉन्च करना - यह दृष्टिकोण तब तक स्वीकार्य साबित हुआ जब तक कि ऐसे दर्जनों और सैकड़ों कोरटाइन नहीं थे हालाँकि, जब उनकी संख्या दो हजार से अधिक हो गई, तो मुझे एक दलाल, कई श्रमिकों आदि के साथ एक सामान्य कार्य कतार आयोजित करने के बारे में सोचना पड़ा।

सबसे पहले मैंने अजवाइन को आज़माने का फैसला किया, जिसका मैंने पहले भी इस्तेमाल किया था। परियोजना की अतुल्यकालिक प्रकृति के कारण, मैंने प्रश्न का गहराई से अध्ययन किया और देखा लेखसाथ ही साथ परियोजना, लेख के लेखक द्वारा बनाया गया।

मैं यह कहूंगा, परियोजना बहुत दिलचस्प है और हमारी टीम के अन्य अनुप्रयोगों में काफी सफलतापूर्वक काम करती है, और लेखक स्वयं कहते हैं कि वह एक अतुल्यकालिक पूल का उपयोग करके इसे उत्पादन में लाने में सक्षम थे। लेकिन, दुर्भाग्य से, यह वास्तव में मेरे अनुकूल नहीं था, जैसा कि यह निकला एक समस्या कार्यों के समूह लॉन्च के साथ (देखें। समूह). लेखन के समय मुद्दा पहले से ही बंद है, फिर भी एक माह से काम चल रहा है। किसी भी मामले में, लेखक को शुभकामनाएँ और शुभकामनाएँ, क्योंकि lib पर पहले से ही काम करने वाली चीज़ें हैं... सामान्य तौर पर, बात मुझमें है और उपकरण मेरे लिए नम हो गया। इसके अलावा, कुछ कार्यों में विभिन्न सेवाओं के लिए 2-3 http अनुरोध थे, इसलिए कार्यों को अनुकूलित करते समय भी, हम 4 हजार टीसीपी कनेक्शन बनाते हैं, लगभग हर 2 घंटे में - बहुत अच्छा नहीं... मैं एक प्रकार के लिए एक सत्र बनाना चाहूंगा श्रमिकों को शुरू करते समय कार्य। Aiohttp के माध्यम से बड़ी संख्या में अनुरोधों के बारे में थोड़ा और यहां.

इस संबंध में मैंने तलाश शुरू की альтернативы और यह मिल गया! अजवाइन के निर्माता, विशेष रूप से, जैसा कि मैं इसे समझता हूं सोलेम से पूछो, बनाया गया था Faust, मूल रूप से परियोजना के लिए रॉबिन हुड. फॉस्ट काफ्का स्ट्रीम्स से प्रेरित है और ब्रोकर के रूप में काफ्का के साथ काम करता है, रॉक्सडीबी का उपयोग एजेंटों के काम के परिणामों को संग्रहीत करने के लिए भी किया जाता है, और सबसे महत्वपूर्ण बात यह है कि लाइब्रेरी अतुल्यकालिक है।

आप भी देख सकते हैं त्वरित तुलना उत्तरार्द्ध के रचनाकारों से अजवाइन और फ़ॉस्ट: उनके मतभेद, दलालों के बीच मतभेद, एक प्राथमिक कार्य का कार्यान्वयन। सब कुछ काफी सरल है, हालांकि, फ़ॉस्ट में एक अच्छी सुविधा ध्यान आकर्षित करती है - विषय पर प्रसारण के लिए टाइप किया गया डेटा।

हम क्या करते हैं?

इसलिए, लेखों की एक छोटी श्रृंखला में, मैं आपको दिखाऊंगा कि फ़ॉस्ट का उपयोग करके पृष्ठभूमि कार्यों से डेटा कैसे एकत्र किया जाए। जैसा कि नाम से पता चलता है, हमारे उदाहरण प्रोजेक्ट का स्रोत होगा, alphavantage.co. मैं दिखाऊंगा कि एजेंट कैसे लिखें (सिंक, विषय, विभाजन), नियमित (क्रॉन) निष्पादन कैसे करें, सबसे सुविधाजनक फ़ॉस्ट सीएलआई कमांड (क्लिक पर एक रैपर), सरल क्लस्टरिंग, और अंत में हम एक डेटाडॉग संलग्न करेंगे ( बॉक्स से बाहर काम करना) और कुछ देखने का प्रयास करें। एकत्रित डेटा को संग्रहीत करने के लिए हम कनेक्शन के लिए मोंगोडब और मोटर का उपयोग करेंगे।

पुनश्च जिस विश्वास के साथ निगरानी के बारे में बात लिखी गई थी, उसे देखते हुए, मुझे लगता है कि पिछले लेख के अंत में पाठक अभी भी कुछ इस तरह दिखेगा:

फॉस्ट पर पृष्ठभूमि कार्य, भाग I: परिचय

परियोजना आवश्यकताएँ

इस तथ्य के कारण कि मैंने पहले ही वादा किया है, आइए एक छोटी सूची बनाएं कि सेवा क्या करने में सक्षम होनी चाहिए:

  1. प्रतिभूतियाँ और उनका अवलोकन अपलोड करें (लाभ और हानि, बैलेंस शीट, नकदी प्रवाह सहित - पिछले वर्ष के लिए) - नियमित रूप से
  2. ऐतिहासिक डेटा अपलोड करें (प्रत्येक ट्रेडिंग वर्ष के लिए, ट्रेडिंग के समापन मूल्य के चरम मूल्य खोजें) - नियमित रूप से
  3. नवीनतम ट्रेडिंग डेटा नियमित रूप से अपलोड करें
  4. प्रत्येक सुरक्षा के लिए संकेतकों की एक अनुकूलित सूची नियमित रूप से अपलोड करें

जैसा कि अपेक्षित था, हम शुरू से ही प्रोजेक्ट के लिए एक नाम चुनते हैं: हॉर्टन

हम इंफ्रास्ट्रक्चर तैयार कर रहे हैं

शीर्षक निश्चित रूप से मजबूत है, हालाँकि, आपको बस काफ्का (और ज़ुकीपर - एक कंटेनर में), काफ़ड्रॉप (यदि हम विषयों में संदेशों को देखना चाहते हैं), मोंगोडब के साथ डॉकर-कंपोज़ के लिए एक छोटा कॉन्फिगरेशन लिखना है। हम पाते हैं [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 *

*मैंने जो कुछ भी नोट किया हमने अभी तक इसे नहीं छुआ है, हम बस खाली फ़ाइलें बनाते हैं।**

हमने एक संरचना बनाई. अब आवश्यक निर्भरताएँ जोड़ें, कॉन्फ़िगरेशन लिखें और मोंगोडब से कनेक्ट करें। मैं लेख में फ़ाइलों का पूरा पाठ प्रदान नहीं करूंगा, ताकि इसमें देरी न हो, लेकिन मैं आवश्यक संस्करणों के लिंक प्रदान करूंगा।

आइए प्रोजेक्ट के बारे में निर्भरता और मेटा से शुरुआत करें - pyproject.toml

इसके बाद, हम निर्भरता स्थापित करना और वर्चुअलएन्व बनाना शुरू करते हैं (या आप स्वयं वेनव फ़ोल्डर बना सकते हैं और पर्यावरण को सक्रिय कर सकते हैं):

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

अब चलिए बनाते हैं config.yml - क्रेडेंशियल्स और कहां खटखटाना है। आप तुरंत अल्फावांटेज के लिए डेटा वहां रख सकते हैं। खैर, चलिए आगे बढ़ते हैं config.py - हमारे कॉन्फिगरेशन से एप्लिकेशन के लिए डेटा निकालें। हाँ, मैं स्वीकार करता हूँ, मैंने अपनी lib का उपयोग किया - सित्री.

मोंगो से कनेक्ट होने पर, सब कुछ काफी सरल है। की घोषणा की ग्राहक वर्ग कनेक्ट करने के लिए और आधार वर्ग क्रुड्स के लिए, संग्रहों पर प्रश्न पूछना आसान बनाने के लिए।

आगे क्या होगा?

लेख बहुत लंबा नहीं है, क्योंकि यहां मैं केवल प्रेरणा और तैयारी के बारे में बात कर रहा हूं, इसलिए मुझे दोष न दें - मैं वादा करता हूं कि अगले भाग में एक्शन और ग्राफिक्स होंगे।

तो, इस अगले भाग में हम:

  1. आइए aiohttp पर अल्फ़ावेंटेज के लिए एक छोटा क्लाइंट लिखें जिसमें हमें आवश्यक अंतिम बिंदुओं के अनुरोध हों।
  2. आइए एक एजेंट बनाएं जो प्रतिभूतियों और उनके लिए ऐतिहासिक कीमतों पर डेटा एकत्र करेगा।

परियोजना का कोड

इस भाग के लिए कोड

स्रोत: www.habr.com

एक टिप्पणी जोड़ें