프로그래밍/개발

[개발] 메시지 큐

riroan 2023. 5. 19. 21:16

메시지 큐(Message Queue)란 무엇일까?

서로 다른 프로세스간 데이터를 통신하는 방법이다. 그렇다면 데이터를 보내는 프로세스가 있고 받는 프로세스가 있을 것이다. 여기에서 보내는 프로세스를 Producer, 받는 프로세스를 Consumer라고 한다. 일반적으로는 역할이 나눠져 있지만 특수한 경우에는 Producer이면서 Consumer인 케이스도 있을 것이다. 일단 그런 경우는 고려하지 말자.

 

그냥 설명만 보면 이해가 안되니 직접 코드로 확인해보자.

# producer.py
print("I'm producer!")
idx = 0

for i in range(10):
    with open(f"./data/{i}", "w") as f:
        f.write(f"Hi! I'm {i}-th message!")
    print(f"saved {i}-th message")
# consumer.py
import os

print("I'm consumer!")

while True:
    path = "./data"
    datas = os.listdir("./data")
    if not datas:
        continue
    data = datas[0]
    path += f'/{data}'
    with open(path, "r") as f:
        print(f.read())
    os.remove(path)

producer에서 data에 파일을 생성하면 consumer에서 받아서 처리하는 형식이다. 이 때 consumer는 서버처럼 while True를 사용해서 무한히 돌며 데이터를 언제든 받을 수 있도록 준비해야 한다. 그리고 consumer를 실행시키고 producer를 실행시킨다.

속도가 너무 빨라서 producer가 보낸 순서대로 consumer가 읽지 못했다. 순서가 필요없다면 이런 방법을 사용할 수 있을 것이다. 이러한 방식을 풀(pool) 방식이라고 한다. 풀 방식의 특징은 순서를 저장하지 않는다. 우리는 순서가 유지되길 원하므로 코드를 살짝 수정해보자.

# consumer.py

import os

print("I'm consumer!")

while True:
    path = "./data"
    datas = os.listdir("./data")
    if not datas:
        continue
    data = sorted(datas)[0] # <- here!
    path += f'/{data}'
    with open(path, "r") as f:
        print(f.read())
    os.remove(path)

단 한줄만 수정하고 순서를 지킬 수 있었다.

물론 이렇게 정렬하면서 수행하면 시간이 정말 오래 걸리기 때문에 실제로 이런 방식은 아닐 것이지만 메시지큐가 어떤 느낌인지 이해하기엔 충분하다.

 

다음엔 AWS에서 제공하는 SQS를 사용해보자.