ฉันมาใช้ชีวิตแบบนี้ได้ยังไง?
ไม่นานมานี้ ฉันต้องทำงานในส่วนแบ็คเอนด์ของโปรเจ็กต์ที่มีการโหลดสูง ซึ่งจำเป็นต้องจัดระเบียบการดำเนินงานเบื้องหลังจำนวนมากเป็นประจำด้วยการคำนวณที่ซับซ้อนและการร้องขอบริการจากบุคคลที่สาม โครงการเป็นแบบอะซิงโครนัสและก่อนที่ฉันจะมา มันมีกลไกง่ายๆ สำหรับงาน cron-launching: การวนซ้ำตรวจสอบเวลาปัจจุบันและการเปิดตัวกลุ่มของ coroutines ผ่านการรวบรวม - วิธีการนี้เป็นที่ยอมรับจนกระทั่งมี coroutines ดังกล่าวหลายสิบหลายร้อย อย่างไรก็ตาม เมื่อมีจำนวนเกินสองพันคน ฉันก็ต้องคิดถึงการจัดคิวงานตามปกติโดยมีนายหน้า คนงานหลายคน และอื่นๆ
ก่อนอื่นฉันตัดสินใจลองใช้คื่นฉ่ายซึ่งฉันเคยใช้มาก่อน เนื่องจากลักษณะของโปรเจ็กต์ไม่ตรงกัน ฉันจึงดำดิ่งลงไปในคำถามและเห็น
ฉันจะพูดแบบนี้โครงการนี้น่าสนใจมากและทำงานได้ค่อนข้างประสบความสำเร็จในแอปพลิเคชันอื่น ๆ ของทีมของเราและผู้เขียนเองก็บอกว่าเขาสามารถนำไปใช้จริงได้โดยใช้พูลแบบอะซิงโครนัส แต่น่าเสียดายที่มันไม่เหมาะกับฉันจริงๆ
ในเรื่องนี้ฉันเริ่มมองหา ทางเลือก และพบมัน! ผู้สร้างขึ้นฉ่ายโดยเฉพาะอย่างที่ฉันเข้าใจ
นอกจากนี้คุณยังสามารถดูได้
พวกเราทำอะไร?
ดังนั้น ในบทความชุดสั้นๆ ฉันจะแสดงวิธีรวบรวมข้อมูลจากงานเบื้องหลังโดยใช้ Faust แหล่งที่มาสำหรับโครงการตัวอย่างของเราจะเป็นตามชื่อที่แนะนำ
ป.ล. เมื่อพิจารณาจากความมั่นใจในการเขียนประเด็นการติดตามฉันคิดว่าผู้อ่านในตอนท้ายของบทความที่แล้วจะยังคงมีลักษณะดังนี้:
ข้อกำหนดของโครงการ
เนื่องจากฉันได้สัญญาไว้แล้ว เรามาสร้างรายการเล็กๆ น้อยๆ ว่าบริการนี้ควรจะทำอะไรได้บ้าง:
- อัปโหลดหลักทรัพย์และภาพรวม (รวมถึงกำไรขาดทุน งบดุล กระแสเงินสด - สำหรับปีที่แล้ว) - เป็นประจำ
- อัปโหลดข้อมูลย้อนหลัง (สำหรับแต่ละปีการซื้อขาย ค้นหาค่าสุดขีดของราคาปิดของการซื้อขาย) - เป็นประจำ
- อัปโหลดข้อมูลการซื้อขายล่าสุด - เป็นประจำ
- อัปโหลดรายการตัวบ่งชี้ที่กำหนดเองสำหรับการรักษาความปลอดภัยแต่ละรายการ - เป็นประจำ
ตามที่คาดไว้ เราเลือกชื่อสำหรับโปรเจ็กต์ตั้งแต่เริ่มต้น: ฮอร์ตัน
เรากำลังเตรียมโครงสร้างพื้นฐาน
ชื่อนี้แข็งแกร่งอย่างแน่นอน อย่างไรก็ตาม สิ่งที่คุณต้องทำคือเขียนการกำหนดค่าเล็กน้อยสำหรับนักเทียบท่าเขียนด้วย kafka (และผู้ดูแลสวนสัตว์ - ในคอนเทนเนอร์เดียว), kafdrop (หากเราต้องการดูข้อความในหัวข้อ), mongodb เราได้รับ [นักเทียบท่า-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 ฉันจะไม่ให้ข้อความเต็มของไฟล์ในบทความเพื่อไม่ให้เกิดความล่าช้า แต่ฉันจะให้ลิงก์ไปยังเวอร์ชันที่จำเป็น
เริ่มต้นด้วยการพึ่งพาและเมตาเกี่ยวกับโครงการ -
ต่อไป เราจะเริ่มการติดตั้งการพึ่งพาและสร้าง virtualenv (หรือคุณสามารถสร้างโฟลเดอร์ venv ด้วยตัวเองและเปิดใช้งานสภาพแวดล้อม):
pip3 install poetry (если ещё не установлено)
poetry install
ตอนนี้เรามาสร้างกัน
เมื่อเชื่อมต่อกับ Mongo ทุกอย่างค่อนข้างง่าย ประกาศแล้ว
จะเกิดอะไรขึ้นต่อไป?
บทความนี้ไม่ได้ยาวมาก เนื่องจากที่นี่ฉันแค่พูดถึงแรงจูงใจและการเตรียมตัวเท่านั้น ดังนั้นอย่าโทษฉันเลย ฉันสัญญาว่าส่วนต่อไปจะมีฉากแอ็คชั่นและกราฟิก
ดังนั้นในส่วนถัดไปนี้ เรา:
- มาเขียนไคลเอนต์ขนาดเล็กสำหรับ alphavantage บน aiohttp พร้อมคำขอปลายทางที่เราต้องการ
- เรามาสร้างตัวแทนที่จะรวบรวมข้อมูลหลักทรัพย์และราคาย้อนหลังให้พวกเขากันดีกว่า
ที่มา: will.com