فاسٹ پر پس منظر کے کام، حصہ اول: تعارف

فاسٹ پر پس منظر کے کام، حصہ اول: تعارف

مجھے ایسے کیسے جینا آیا؟

کچھ عرصہ پہلے مجھے ایک انتہائی بھری ہوئی پراجیکٹ کے بیک اینڈ پر کام کرنا پڑا، جس میں پیچیدہ حسابات اور تھرڈ پارٹی سروسز کے لیے درخواستوں کے ساتھ بیک گراؤنڈ کے کاموں کی ایک بڑی تعداد کے باقاعدہ عمل کو منظم کرنا ضروری تھا۔ یہ پروجیکٹ متضاد ہے اور میرے آنے سے پہلے، اس میں کرون لانچنگ کے کاموں کے لیے ایک سادہ طریقہ کار موجود تھا: ایک لوپ موجودہ وقت کی جانچ کرتا ہے اور کوروٹینز کے گروپس کو اکٹھا کرنے کے ذریعے لانچ کرتا ہے - یہ نقطہ نظر اس وقت تک قابل قبول ثابت ہوا جب تک کہ اس طرح کے درجنوں اور سیکڑوں کوروٹائنز نہ ہوں۔ تاہم، جب ان کی تعداد دو ہزار سے تجاوز کر گئی، مجھے ایک بروکر، کئی کارکنوں وغیرہ کے ساتھ ایک عام کام کی قطار کو ترتیب دینے کے بارے میں سوچنا پڑا۔

سب سے پہلے میں نے سیلری کو آزمانے کا فیصلہ کیا، جو میں نے پہلے استعمال کیا تھا۔ پروجیکٹ کی متضاد نوعیت کی وجہ سے، میں نے سوال میں غوطہ لگایا اور دیکھا مضمونبھی منصوبے، مضمون کے مصنف کے ذریعہ تخلیق کیا گیا ہے۔

میں یہ کہوں گا، یہ منصوبہ بہت دلچسپ ہے اور ہماری ٹیم کی دیگر ایپلی کیشنز میں کافی کامیابی سے کام کرتا ہے، اور مصنف خود کہتے ہیں کہ وہ ایک غیر مطابقت پذیر پول کا استعمال کرکے اسے پروڈکشن میں لانے کے قابل تھا۔ لیکن، بدقسمتی سے، یہ واقعی میرے مطابق نہیں تھا، جیسا کہ یہ نکلا۔ مسئلہ کاموں کے گروپ لانچ کے ساتھ (دیکھیں۔ گروپ)۔ لکھنے کے وقت مسئلہ پہلے ہی بند ہے، تاہم ایک ماہ سے کام جاری ہے۔ کسی بھی صورت میں، مصنف کے لیے گڈ لک اور تمام نیک خواہشات، چونکہ lib پر پہلے سے ہی کام کر رہے ہیں... عام طور پر، بات مجھ میں ہے اور ٹول میرے لیے نم نکلا۔ اس کے علاوہ، کچھ کاموں میں مختلف سروسز کے لیے 2-3 HTTP درخواستیں تھیں، اس لیے ٹاسک کو بہتر بناتے وقت بھی، ہم تقریباً ہر 4 گھنٹے میں 2 ہزار TCP کنکشن بناتے ہیں - بہت اچھا نہیں... میں ایک قسم کے لیے ایک سیشن بنانا چاہوں گا کارکنوں کو شروع کرتے وقت کام۔ aiohttp کے ذریعے درخواستوں کی بڑی تعداد کے بارے میں کچھ اور یہاں.

اس سلسلے میں میں نے دیکھنا شروع کیا۔ متبادل اور اسے مل گیا! اجوائن کے تخلیق کار، خاص طور پر، جیسا کہ میں اسے سمجھتا ہوں۔ سلیم سے پوچھو، بنایا گیا تھا۔ Faust، اصل میں اس منصوبے کے لئے رابن ہڈ. فاسٹ کافکا اسٹریمز سے متاثر ہے اور کافکا کے ساتھ ایک بروکر کے طور پر کام کرتا ہے، rocksdb ایجنٹوں کے کام کے نتائج کو ذخیرہ کرنے کے لیے بھی استعمال ہوتا ہے، اور سب سے اہم بات یہ ہے کہ لائبریری غیر مطابقت پذیر ہے۔

اس کے علاوہ، آپ دیکھ سکتے ہیں فوری موازنہ مؤخر الذکر کے تخلیق کاروں سے اجوائن اور فاسٹ: ان کے اختلافات، بروکرز کے درمیان اختلافات، ایک ابتدائی کام کا نفاذ۔ سب کچھ بہت آسان ہے، تاہم، فاسٹ میں ایک اچھی خصوصیت توجہ کو اپنی طرف متوجہ کرتی ہے - موضوع پر ٹرانسمیشن کے لیے ٹائپ کردہ ڈیٹا۔

ہم کیا کریں؟

لہذا، مضامین کی ایک مختصر سیریز میں، میں آپ کو دکھاؤں گا کہ Faust کا استعمال کرتے ہوئے پس منظر کے کاموں سے ڈیٹا کیسے اکٹھا کیا جائے۔ ہمارے مثال کے منصوبے کا ذریعہ ہوگا، جیسا کہ نام سے پتہ چلتا ہے، alphavantage.co. میں یہ ظاہر کروں گا کہ ایجنٹوں کو کیسے لکھا جائے (سنک، عنوانات، پارٹیشنز)، باقاعدہ (کرون) پر عمل کیسے کریں، سب سے آسان فاسٹ کلی کمانڈز (ایک ریپر اوور کلک)، سادہ کلسٹرنگ، اور آخر میں ہم ایک ڈیٹا ڈاگ منسلک کریں گے ( باکس سے باہر کام کرنا) اور کچھ دیکھنے کی کوشش کریں۔ جمع کردہ ڈیٹا کو ذخیرہ کرنے کے لیے ہم کنکشن کے لیے mongodb اور موٹر استعمال کریں گے۔

PS جس اعتماد کے ساتھ نگرانی کے بارے میں نکتہ لکھا گیا تھا اس کو دیکھتے ہوئے، میں سمجھتا ہوں کہ آخری مضمون کے آخر میں پڑھنے والے کو اب بھی کچھ اس طرح نظر آئے گا:

فاسٹ پر پس منظر کے کام، حصہ اول: تعارف

پروجیکٹ کی ضروریات

اس حقیقت کی وجہ سے کہ میں نے پہلے ہی وعدہ کیا ہے، آئیے ایک چھوٹی سی فہرست بناتے ہیں کہ خدمت کو کیا کرنے کے قابل ہونا چاہئے:

  1. سیکیورٹیز اور ان کا ایک جائزہ (بشمول منافع اور نقصان، بیلنس شیٹ، کیش فلو - پچھلے سال کے لیے) - باقاعدگی سے اپ لوڈ کریں
  2. تاریخی ڈیٹا اپ لوڈ کریں (ہر تجارتی سال کے لیے، ٹریڈنگ کی اختتامی قیمت کی انتہائی قدریں تلاش کریں) - باقاعدگی سے
  3. تازہ ترین تجارتی ڈیٹا اپ لوڈ کریں - باقاعدگی سے
  4. ہر سیکیورٹی کے لیے اشارے کی حسب ضرورت فہرست اپ لوڈ کریں - باقاعدگی سے

جیسا کہ توقع کی گئی ہے، ہم شروع سے پروجیکٹ کے لیے ایک نام کا انتخاب کرتے ہیں: ہارٹن

ہم انفراسٹرکچر کی تیاری کر رہے ہیں۔

عنوان یقینی طور پر مضبوط ہے، تاہم، آپ کو بس کافکا (اور زوکیپر - ایک کنٹینر میں)، kafdrop (اگر ہم موضوعات میں پیغامات دیکھنا چاہتے ہیں)، mongodb کے ساتھ docker-compose کے لیے ایک چھوٹی سی ترتیب لکھنے کی ضرورت ہے۔ ہم حاصل [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 *

*سب کچھ جو میں نے نوٹ کیا۔ ہم ابھی تک اسے ہاتھ نہیں لگاتے، ہم صرف خالی فائلیں بناتے ہیں۔**

ہم نے ایک ڈھانچہ بنایا۔ آئیے اب ضروری انحصار شامل کریں، تشکیل لکھیں اور mongodb سے جڑیں۔ میں مضمون میں فائلوں کا مکمل متن فراہم نہیں کروں گا، تاکہ اس میں تاخیر نہ ہو، لیکن میں ضروری ورژن کے لنک فراہم کروں گا۔

آئیے پروجیکٹ کے بارے میں انحصار اور میٹا کے ساتھ شروع کریں - pyproject.toml

اس کے بعد، ہم انحصار کو انسٹال کرنا اور ورچوئلنوی بنانا شروع کرتے ہیں (یا آپ خود venv فولڈر بنا سکتے ہیں اور ماحول کو چالو کر سکتے ہیں):

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

اب تخلیق کرتے ہیں۔ config.yml - اسناد اور کہاں دستک دینا ہے۔ آپ الفاوانٹیج کے لیے فوری طور پر ڈیٹا وہاں رکھ سکتے ہیں۔ ٹھیک ہے، چلو آگے بڑھتے ہیں config.py - ہماری تشکیل سے ایپلیکیشن کے لیے ڈیٹا نکالیں۔ ہاں، میں اقرار کرتا ہوں، میں نے اپنی لب استعمال کی - sitri.

منگو سے منسلک ہونے پر، سب کچھ بہت آسان ہے. اعلان کیا کلائنٹ کلاس مربوط کرنے کے لئے اور بیس کلاس cruds کے لیے، جمع کرنے پر سوالات کرنا آسان بنانے کے لیے۔

آگے کیا ہوگا؟

مضمون زیادہ لمبا نہیں ہے، چونکہ یہاں میں صرف حوصلہ افزائی اور تیاری کے بارے میں بات کر رہا ہوں، اس لیے مجھ پر الزام نہ لگائیں - میں وعدہ کرتا ہوں کہ اگلے حصے میں ایکشن اور گرافکس ہوں گے۔

تو، اس اگلے حصے میں ہم:

  1. آئیے aiohttp پر الفاوانٹیج کے لیے ایک چھوٹا سا کلائنٹ لکھتے ہیں جن کی ہمیں ضرورت کے اختتامی پوائنٹس کی درخواستیں ہیں۔
  2. آئیے ایک ایجنٹ بنائیں جو ان کے لیے سیکیورٹیز اور تاریخی قیمتوں کا ڈیٹا اکٹھا کرے۔

پروجیکٹ کوڈ

اس حصے کے لیے کوڈ

ماخذ: www.habr.com

نیا تبصرہ شامل کریں