백엔드 Back-end/메시지 큐 Message Queue

Q. 래빗엠큐RabbitMQ에서 큐Queue와 메시지Message 중 어떤 것이 메모리를 더 많이 차지할까?

Tap to restart 2023. 9. 29. 11:00
반응형

A. 큐 1개가 메시지 1개보다 약 700배 정도 더 차지한다.

 

RabbitMQ는 Docker로 설치 및 실행했다. 2 core, 메모리는 4GB

 

큐를 하나도 만들지 않았을 때 136 MiB, CPU 사용량도 1% 미만이었다.

 

 

큐를 30000개 추가했을 때 메모리 사용량 약 1400GiB 증가

이 상태에서 아래 코드로 큐를 30000개 추가했다.

 

import time

import requests
from requests.auth import HTTPBasicAuth

rabbitmq_server = 'http://localhost:15672'
rabbitmq_user = 'guest'
rabbitmq_password = 'guest'


def create_queue(name):
    vhost_name = '%2F'
    queue_name = name
    url = f"{rabbitmq_server}/api/queues/{vhost_name}/{queue_name}"
    response = requests.put(
        url,
        auth=HTTPBasicAuth(rabbitmq_user, rabbitmq_password),
        headers={"content-type": "application/json"},
        json={}
    )
    print(f"response: {response}")


if __name__ == "__main__":
    for i in range(0, 30000):
        create_queue(f"test_{i}")
        time.sleep(0.01)

도커 stats 정보를 보면 아래와 같다. 큐를 추가하는 경우 CPU도 많이 사용하고 메모리도 많이 사용하는 것을 알 수 있다.

 

메모리 사용량이 계속 유동적이다. 1.5GiB에서 1.7GiB로.

 

이 상태에서 아래 코드로 각 큐마다 메시지를 30000개 추가를 시도했다. 메시지 body 크기가 Hello World!로 작은 것을 감안할 필요는 있다.

 

import time

import pika

def send_message(queue_name):
    connection = pika.BlockingConnection(
        pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue=queue_name)

    result = channel.basic_publish(exchange='', routing_key=queue_name, body='Hello World!')
    print(result)
    connection.close()


if __name__ == "__main__":
    for i in range(0, 30000):
        send_message(f"test_{i}")
        print(i)
        time.sleep(0.01)

 

메모리가 2 GiB 도달하면 제대로 작동하지 않아

메시지 62개에서 멈췄다. 더 이상 추가되지 않았다. 메모리는 2 GiB에 도달했다. 다시 시도했다. 메시지 108개에서 멈췄다. 메모리가 임계점을 넘어서면 RabbitMQ가 제대로 작동하지 않는다는 것을 알 수 있다.

 

 

메시지 30000개를 추가할 때 메모리 20 MiB 증가

이번에는 test_0이란 큐를 1개만 만들고 메시지 body는 "Hello World!"로 메시지를 30000개 추가해보자.

큐 1개를 추가했을 때 메모리는 144 MiB다.

 

추가를 완료했고 메모리 사용량은 165 MiB로 늘었다. 채널과 달리 메모리 사용량이 일정했다.

 

9:57 이후 그래프를 봐야 한다. CPU 사용량도 일정하고 메모리 사용량도 메시지를 추가하는 경우 일정한 것을 확인할 수 있다.

 

 

hello world가 아니라 100글자를 추가하면 어떻게 될까? 아래처럼 숫자 100개를 body로 해서 메시지를 30000개 추가해봤다.

 

body = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"

처음 시작할 때는 도커 stats 상으로 146.3MB였다. 래빗엠큐 상으로는 140MiB였다.

 

3만개 메시지를 Publish한 뒤에는 174.3MB, 래빗엠큐 상으로는 167MiB가 되었다.

 

대략 28MB가 증가했다.

"Hello World!"가 공백 포함 12개 문자였고, 숫자 100개로 차이가 크지만 메모리는 비례해서 증가하지는 않았다.

 

결론

큐 수가 너무 늘어나게 설계한다면 래빗엠큐가 작동 중 문제를 일으킬 수 있다. 큐 성격에 따라 분리해서 큐 숫자가 너무 늘어나지 않게 관리할 필요가 있다. 큐가 늘어나면 지속적으로 CPU와 메모리를 사용하기 때문이다.

반응형