๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป32

MQTT Keep Alive ์ตœ๊ทผ์— MQTT ํ†ต์‹  ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ Keep Alive ์„ค์ •์— ๊ด€๋ จํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค. Status Update ํ•˜๋Š” mqtt ํด๋ผ์ด์–ธํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•˜๊ณ send_status ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. import paho.mqtt.client as mqttimport uuidimport timeclass RobotStatusUpdater: def __init__(self, broker_ip, topic="robot/status"): self.client = mqtt.Client(f"Robot_Status_Updater_{uuid.uuid4()}") self.client.connect(broker_ip, 1883) self.topic = to.. 2025. 3. 12.
[MQTT] pc 2๊ฐœ ํ†ต์‹  (python, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ) ๊ฐœ์š”PC 2๊ฐœ๊ฐ€ ์žˆ๋‹ค.ํ•˜๋‚˜๋Š” User๊ฐ€ ์—…๋ฌด๋ฅผ ์š”์ฒญํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” Robot์ด ๊ทธ ์—…๋ฌด๋ฅผ ๋ฐ›์•„์„œ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๋ฅผ User๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Robot์ด ํ•˜๋‚˜ ๋ฟ์ด๋ผ์„œ socket์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ–ˆ๋‹ค.์ด๋ฒˆ์—๋Š” Robot์ด ์ถ”๊ฐ€๋กœ ๋” ๋Š˜์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘ํ•ด์„œ MQTT๋ฅผ ํ™œ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํŽธํžˆ PC, Robot์ด๋ผ๊ณ  ์นญํ•˜๊ฒ ๋‹ค.PC โ†’ Robot : ์ˆ˜ํ–‰ํ•  ์ž‘์—… (ํ…์ŠคํŠธ ํ˜•์‹) ์ „๋‹ฌRobot โ†’ PC : ์ž‘์—… ์ƒํƒœ (์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ) ์ „๋‹ฌ ๊ตฌ์กฐPC๋Š” ์ž‘์—…์ง€์‹œ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ๋กœ๋ด‡์€ ์ด๋ฅผ ๊ตฌ๋…๋กœ๋ด‡์€ ์ƒํƒœ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , PC๋Š” ์ด๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธTopic ์„ค๊ณ„PC โ†’ Robot: "robot/task"Robot โ†’ PC: "robot/status" ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ๊ตฌ.. 2025. 2. 25.
[MQTT] Mac mosquitto ์„ค์น˜ / ์‹คํ–‰ / ์ค‘์ง€ 1. mosquitto ์„ค์น˜brew install mosquitto  2. mosquitto ์„œ๋น„์Šค ์‹คํ–‰brew services start mosquitto 3. mosquitto ์„œ๋น„์Šค ์ค‘์ง€brew services stop mosquitto  ๋ฉ”์„ธ์ง€ ํ™•์ธ์€ MQTT Explorer ์‚ฌ์šฉํ–ˆ๋‹ค. ์—ฐ๊ฒฐ ์ž˜๋จ ~ 2025. 2. 25.
์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋„๊ตฌ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ–ˆ๋‹ค.์‚ฌ์šฉํ•  ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌSonar : ์ฝ”๋“œ ํ’ˆ์งˆ ๋ถ„์„, ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€Black : ์ฝ”๋“œ ์Šคํƒ€์ผ ์ž๋™ ํฌ๋งทํŒ…Flake8 : ์ •์  ์ฝ”๋“œ ๋ถ„์„ (PEP 8, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ)isort : import ๋ฌธ ์ž๋™ ์ •๋ ฌpytest : Python ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ 1๏ธโƒฃ Sonar (SonarQube / SonarCloud)Sonar๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ถ„์„ํ•˜๋Š” ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌSonarQube, SonarCloud ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณตโœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋กœ์ปฌ์—์„œ SonarQube๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ (sonarqube + sonar-scanner ์‚ฌ์šฉ)CI/CD ํ™˜๊ฒฝ์—์„œ๋Š” SonarCloud๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ„์„sonar-scanner \ -Dsonar.pr.. 2025. 2. 20.
[Celery] ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ฑ๋Šฅ ์ฒดํฌ ์‹คํ–‰ ํ›„ CPU ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ Celery Worker ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค ํ•œ๋‹ค. โœ” Celery Worker ํ”„๋กœ์„ธ์Šค ํ™•์ธps aux | grep "celery worker" โœ” CPU & ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฒดํฌhtop โœ” Redis์— ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—… ํ™•์ธredis-cli llen celery โ†’ ๋งŒ์•ฝ ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—… ๊ฐœ์ˆ˜ ํ™•์ธํ•˜๊ณ  ์ ์ ˆํ•œ concurrency ์กฐ์ •โ†’ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ๊ณ ๋ คํ•ด์„œ concurrency ์กฐ์ • 2025. 2. 19.
[Celery] ์ ์ ˆํ•œ concurrency ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ ๊ฐœ์š”Celery์—์„œ concurrency ๊ฐ’์€ ํ•œ ๋ฒˆ์— ๋ช‡๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์„ค์ •์ด๋‹ค.์ ์ ˆํ•œ concurrency ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ• ๊นŒ .. (ํ•˜๋“œ์›จ์–ด, ์›Œํฌ๋กœ๋“œ, ์ž‘์—… ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค!)ํ™•์ธconcurrencyCelery๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Prefork (multiprocessing) ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉconcurrency๋Š” ๊ฐ worker๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.worker๋Š” ์‹ค์ œ๋กœ Task๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค(์ž‘์—… ๋‹จ์œ„)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.1๏ธโƒฃ CPU ์ฝ”์–ด ์ˆ˜Celery๊ฐ€ CPU ์—ฐ์‚ฐ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…(์˜ˆ: ๋จธ์‹ ๋Ÿฌ๋‹, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, CPU ์ฝ”์–ด ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ์„ค์ • CPU ์ฝ”์–ด ๊ฐœ์ˆ˜์ ์ ˆํ•œ concurrency ๊ฐ’2 ์ฝ”์–ด2~44 ์ฝ”์–ด4~88 ์ฝ”์–ด8~.. 2025. 2. 19.
Redis ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ์š”ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํ•˜๋Š”๋ฐ redis๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋ ค๊ณ  ํ•จ์ง„ํ–‰Redis ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธRedis์˜ ๋ชจ๋“  ์š”์ฒญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด:redis-cli monitor โ†’ Redis์˜ ๋ชจ๋“  ์ž‘์—…์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•œ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค. Celery ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋งRedis์˜ ๋กœ๊ทธ ์ค‘์—์„œ ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ celery app์— ๋Œ€ํ•œ ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์–ด์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ, Celery์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” celery ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์žˆ์—ˆ๋‹ค.โœ… celery worker ์‹คํ–‰ํ•  ๋•Œ -E ์˜ต์…˜ ์ถ”๊ฐ€ํ•ด์„œ ์ด๋ฒคํŠธ ๋กœ๊น… ํ™œ์„ฑํ™”ํ•˜๊ธฐ (์•„๋‹ˆ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œธ)pkill -9 -f "celery worker" # ๊ธฐ์กด ์›Œ์ปค ์ข…๋ฃŒcelery -A celery_tasks.c.. 2025. 2. 13.
Redis and Celery ๊ฐœ์š”Redis์™€ Celery์˜ ๊ด€๊ณ„๋ฅผ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.์ •๋ฆฌRedis์™€ Celery๋Š” ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ํ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ๊ฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•œ๋‹ค.Celery๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ถ„์‚ฐ ํƒœ์ŠคํŠธ ํ ์‹œ์Šคํ…œ์œผ๋กœ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค(Message Broker)๋ฅผ ํ†ตํ•ด ์ž‘์—… ๊ด€๋ฆฌProducer (Client)์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋ƒ„Celery๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ Redis์— ์ž‘์—…์„ ๋“ฑ๋ก(Queue)ํ•จBroker (Redis)Celery๊ฐ€ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์„ ํ(Queue) ํ˜•ํƒœ๋กœ ์ €์žฅWorker๊ฐ€ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ์ž‘์—…์„ ๊ฐ€์ ธ๊ฐ€์„œ ์‹คํ–‰Worker (Celery Worker)Redis์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ์—ฌ๋Ÿฌ ๊ฐœ์˜ Worker๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ ๊ฐ€๋Šฅ (๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)Bac.. 2025. 2. 12.
Celery๋ฅผ ์ด์šฉํ•œ ํฌ๋กค๋ง ์˜ˆ์ œ ๊ฐœ์š”Airflow์™€ Celery๋ฅผ ๋น„๊ตํ–ˆ๋‹ค. ํฌ๋กค๋ง ๊ด€๋ฆฌ Airflow vs Celery๊ฐœ์š”๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ Airflow๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.Airflow ์šด์˜ ์ค‘์ด๋˜ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋Š” ๋ฐ, ๊ทธ ์ค‘์—์„œ ์ œ์ผ ํฐ ๋ฌธ์ œ๋Š” cpu ์ ์œ ์œจ์ด 100์œผ๋กœ ์น˜์†Ÿ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.Airflow๋กœ ์šด์˜bonory.tistory.com ํฌ๋กค๋ง ์ง„ํ–‰ ์‹œ, Celery๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ ํ•ฉํ•˜๋‹ค๋Š” ํŒ๋‹จ๊ณผ ํ•จ๊ป˜ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. FastAPI + Celery + requests + BeautifulSoup ๋ฅผ ํ™œ์šฉํ•œ ํฌ๋กค๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œํฌ๋กค๋ง์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ง„ํ–‰๊ธฐ๋ณธ ๊ตฌ์กฐFastAPI: ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ํฌ๋กค๋ง ์š”์ฒญ์„ ๋ณด๋ƒ„Celery: ์š”์ฒญ์„ ํ์— ๋„ฃ๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ .. 2025. 2. 5.