๋ด๊ฐ ์ด์ฉ๋ค๊ฐ ์ด๋ ๊ฒ ์ด๊ฒ ๋์ง?
์ผ๋ง ์ ์ ๋ ๋ก๋๊ฐ ๋ง์ ํ๋ก์ ํธ์ ๋ฐฑ์๋ ์์ ์ ํด์ผ ํ์ต๋๋ค. ์ด ํ๋ก์ ํธ์์๋ ๋ณต์กํ ๊ณ์ฐ๊ณผ ํ์ฌ ์๋น์ค ์์ฒญ์ด ํฌํจ๋ ์๋ง์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ ๊ธฐ์ ์ธ ์คํ์ ๊ตฌ์ฑํด์ผ ํ์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ ๋น๋๊ธฐ์์ด๋ฉฐ ์ ๊ฐ ์ค๊ธฐ ์ ์๋ ํฌ๋ก ์คํ ์์ ์ ์ํ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ด ์์์ต๋๋ค. ์ฆ, ํ์ฌ ์๊ฐ์ ํ์ธํ๋ ๋ฃจํ์ ์์ง์ ํตํด ์ฝ๋ฃจํด ๊ทธ๋ฃน์ ์์ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๊ทธ๋ฌํ ์ฝ๋ฃจํด์ด ์์ญ, ์๋ฐฑ ๊ฐ๊ฐ ์์ ๋๊น์ง ํ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์๊ฐ XNUMX๋ช ์ ์ด๊ณผํ๋ฉด ๋ธ๋ก์ปค, ์ฌ๋ฌ ์์ ์ ๋ฑ์ผ๋ก ์ผ๋ฐ ์์ ๋๊ธฐ์ด์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ํด ์๊ฐํด์ผ ํ์ต๋๋ค.
๋จผ์ ์ด์ ์ ์ฌ์ฉํ๋ ์
๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ํ๋ก์ ํธ์ ๋น๋๊ธฐ์ ํน์ฑ์ผ๋ก ์ธํด ์ ๋ ์ง๋ฌธ์ ๊น์ด ๋น ์ ธ๋ค์ด ๋ณด์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ๋งค์ฐ ํฅ๋ฏธ๋กญ๊ณ ์ฐ๋ฆฌ ํ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋งค์ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ํ๋ฉฐ ์ ์ ์์ ๋ ๋น๋๊ธฐ์ ํ์ ์ฌ์ฉํ์ฌ ์ด ํ๋ก์ ํธ๋ฅผ ํ๋ก๋์
์ ์ถ์ํ ์ ์์๋ค๊ณ ๋งํฉ๋๋ค. ํ์ง๋ง ๋ถํํ๋ ๊ทธ๊ฒ์ ๋์๊ฒ ๋ณ๋ก ์ ํฉํ์ง ์์์ต๋๋ค.
์ด์ ๊ด๋ จํ์ฌ ๋๋ ์ฐพ๊ธฐ ์์ํ์ต๋๋ค. ๋์ ๊ทธ๋ฆฌ๊ณ ์ฐพ์์ด์! ํนํ ๋ด๊ฐ ์ดํดํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์
๋ฌ๋ฆฌ์ ์ฐฝ์์๋
๋ํ, ๋น์ ์ ๋ณผ ์ ์์ต๋๋ค
์ฐ๋ฆฌ๊ฐ ๋ญ ํ ๊ฑฐ ๋?
๊ทธ๋์ ์งง์ ๊ธฐ์ฌ ์๋ฆฌ์ฆ์์ Faust๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ ํ๋ก์ ํธ์ ์์ค๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ถ์ : ๋ชจ๋ํฐ๋ง์ ๋ํ ๋ด์ฉ์ด ์์ ๊ฐ์๊ฒ ์ฐ์ฌ์ง ๊ฒ์ผ๋ก ํ๋จํ๋ฉด, ๋ง์ง๋ง ๊ธฐ์ฌ ๋ ๋ถ๋ถ์ ๋ ์๋ ์ฌ์ ํ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ๋ก์ ํธ ์๊ตฌ์ฌํญ
์ด๋ฏธ ์ฝ์ํ์ผ๋ฏ๋ก ์๋น์ค๊ฐ ์ํํ ์ ์๋ ์์ ์ ๋ํ ๊ฐ๋จํ ๋ชฉ๋ก์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
- ์ฆ๊ถ ๋ฐ ๊ฐ์(์ง๋ํด ์์ต, ๋์ฐจ๋์กฐํ, ํ๊ธ ํ๋ฆ ํฌํจ)๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ก๋ํ์ธ์.
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ์ ๋ก๋(๋งค ๊ฑฐ๋ ์ฐ๋๋ง๋ค ๊ฑฐ๋ ์ข ๊ฐ์ ๊ทน๋จ๊ฐ ์ฐพ๊ธฐ) - ์ ๊ธฐ์ ์ผ๋ก
- ์ต์ ๊ฑฐ๋ ๋ฐ์ดํฐ ์ ๋ก๋ - ์ ๊ธฐ์ ์ผ๋ก
- ๊ฐ ์ฆ๊ถ์ ๋ํ ๋ง์ถคํ ์งํ ๋ชฉ๋ก์ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ก๋
์์๋๋ก ์ฒ์๋ถํฐ ํ๋ก์ ํธ ์ด๋ฆ์ ์ ํํฉ๋๋ค. ํธํผ
์ธํ๋ผ๋ฅผ ์ค๋นํ๊ณ ์์ต๋๋ค
์ ๋ชฉ์ ํ์คํ ๊ฐ๋ ฅํ์ง๋ง kafka(๋ฐ Zookeeper - ํ๋์ ์ปจํ
์ด๋์ ์์), kafdrop(์ฃผ์ ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ค๋ ๊ฒฝ์ฐ), mongodb๋ฅผ ์ฌ์ฉํ์ฌ docker-compose์ ๋ํ ์์ ๊ตฌ์ฑ์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ป๋๋ค [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
์ฌ๊ธฐ์๋ ์ ํ ๋ณต์กํ ๊ฒ์ด ์์ต๋๋ค. Kafka์ ๋ํด ๋ ๊ฐ์ ๋ฆฌ์ค๋๊ฐ ์ ์ธ๋์์ต๋๋ค. ํ๋(๋ด๋ถ)๋ ๋ณตํฉ ๋คํธ์ํฌ ๋ด๋ถ์์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๊ณ , ๋ ๋ฒ์งธ(์ธ๋ถ)๋ ์ธ๋ถ ์์ฒญ์ ์ํ ๊ฒ์ด๋ฏ๋ก ์ธ๋ถ๋ก ์ ๋ฌํ์ต๋๋ค. 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์ ์ฐ๊ฒฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ฐํ
๊ทธ ๋ค์์ ์ด๋ป๊ฒ๋ฉ๋๊น?
์ฌ๊ธฐ์๋ ๋๊ธฐ ๋ถ์ฌ์ ์ค๋น์ ๋ํด์๋ง ์ด์ผ๊ธฐํ๊ณ ์์ผ๋ฏ๋ก ๊ธฐ์ฌ๊ฐ ๊ทธ๋ฆฌ ๊ธธ์ง ์์ผ๋ฏ๋ก ์ ๋ฅผ ๋น๋ํ์ง ๋ง์ญ์์ค. ๋ค์ ๋ถ๋ถ์๋ ์ก์ ๊ณผ ๊ทธ๋ํฝ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์ฝ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฐ๋ก ๋ค์ ๋ถ๋ถ์์๋ ๋ค์์ ์ํํฉ๋๋ค.
- ํ์ํ ์๋ํฌ์ธํธ์ ๋ํ ์์ฒญ์ ์ฌ์ฉํ์ฌ aiohttp์ alphavantage์ฉ ์๊ท๋ชจ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ฆ๊ถ ๋ฐ ๊ณผ๊ฑฐ ๊ฐ๊ฒฉ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ถ์ฒ : habr.com