JavaRush /Курси /Модуль 4: FastAPI /Тестування черг повідомлень та їх продуктивності

Тестування черг повідомлень та їх продуктивності

Модуль 4: FastAPI
Рівень 12 , Лекція 9
Відкрита

Уявіть, що ви — архітектор хмарочоса. Він виглядає гарно, але наскільки він стійкий до вітру або землетрусу? Аналогічно, системи, які ви будуєте, мають бути не тільки функціональними, а й витривалими під навантаженням. Тестування черг повідомлень допомагає відповісти на найважливіші питання:

  • Скільки повідомлень на секунду система може обробити без втрати даних?
  • Що відбувається з чергою при високому навантаженні?
  • Як швидко повідомлення доставляються від продюсера до консьюмера?
  • Чи стійкі ваші налаштування RabbitMQ до відмов?

Сьогодні навчимося проводити такі тести й оптимізувати RabbitMQ на їх основі.


Основні метрики для тестування продуктивності

Коли говоримо про тестування RabbitMQ, важливо знати, на що саме дивитися. Ось основні метрики, які варто мати на увазі:

  1. Пропускна здатність (Throughput): кількість повідомлень, яку система може обробити за секунду.
  2. Затримка (Latency): час, який потрібен для доставки повідомлення від продюсера до консьюмера.
  3. Розмір черги (Queue Depth): наскільки швидко черга заповнюється і очищається.
  4. Відсоток втрачених повідомлень: втрата повідомлень неприйнятна для більшості застосунків.
  5. Продуктивність консьюмерів: наскільки швидко консьюмери обробляють повідомлення.
  6. Використання ресурсів (CPU, пам'ять): як RabbitMQ споживає ресурси під високим навантаженням.

Усі ці показники допоможуть зрозуміти, наскільки ефективно працює ваша система і де є вузькі місця.


Інструменти для тестування продуктивності

RabbitMQ Management Interface

RabbitMQ надає веб-інтерфейс управління, де можна спостерігати за станом черг, exchanges і самих серверів. Це крутий інструмент для моніторингу в реальному часі, але він не годиться для стресс-тестування. Інтерфейс показує:

  • Кількість повідомлень у черзі.
  • Швидкість публікації повідомлень.
  • Завантаження ресурсів.

Спробуйте зайти в панель керування (зазвичай доступна на http://localhost:15672).

rabbitmq-perf-test

RabbitMQ надає утиліту rabbitmq-perf-test для стресс-тестування. Вона дозволяє емулювати роботу продюсерів і консьюмерів з заданою частотою публікації й обробки повідомлень. Відмінний інструмент, щоб зрозуміти межі продуктивності RabbitMQ.

Встановлення:


git clone https://github.com/rabbitmq/rabbitmq-perf-test.git
cd rabbitmq-perf-test
./gradlew jar

Використання:


java -jar target/rabbitmq-perf-test-<version>.jar --producers 10 --consumers 10 --rate 1000

Цей тест створює 10 продюсерів і 10 консьюмерів, які публікують і читають повідомлення на швидкості 1000 повідомлень/секунда.

Custom Scripts (Написання власних тестів на Python)

Для гнучкішого тестування можна написати свої сценарії на Python. Використовуються бібліотеки типу pika або aio_pika для роботи з RabbitMQ. Давайте подивимося приклад.


Практичні приклади тестування

Приклад 1: Стресс-тест з продюсерами і консьюмерами

Припустимо, у нас вже налаштований RabbitMQ сервер, а також є черга з назвою test_queue. Протестуємо, як RabbitMQ впорається з великою кількістю продюсерів і консьюмерів.

Код продюсера


import pika
import time

def send_messages():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()

    channel.queue_declare(queue='test_queue', durable=True)

    for i in range(10000):  # Відправляємо 10 000 повідомлень
        message = f"Повідомлення {i}"
        channel.basic_publish(
            exchange='',
            routing_key='test_queue',
            body=message,
            properties=pika.BasicProperties(
                delivery_mode=2,  # Робить повідомлення стійким
            )
        )
        print(f"Відправлено: {message}")
        time.sleep(0.001)  # Штучно обмежуємо швидкість відправки

    connection.close()

send_messages()

Код консьюмера


import pika

def callback(ch, method, properties, body):
    print(f"Отримано: {body.decode()}")
    ch.basic_ack(delivery_tag=method.delivery_tag)

def consume_messages():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()

    channel.queue_declare(queue='test_queue', durable=True)

    channel.basic_qos(prefetch_count=1)  # Обмежуємо кількість повідомлень для обробки
    channel.basic_consume(queue='test_queue', on_message_callback=callback)
    
    print("Чекаю на повідомлення...")
    channel.start_consuming()

consume_messages()

Приклад 2: тестування затримок

Ми також можемо виміряти затримку: скільки часу проходить від публікації повідомлення до його обробки. Для цього замірятимемо час відправки й отримання повідомлення.

Вимірювання затримки


import pika
import time

def send_message():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='latency_test', durable=True)

    start_time = time.time()
    message = f"{start_time}"
    channel.basic_publish(
        exchange='',
        routing_key='latency_test',
        body=message
    )
    print(f"Відправлено повідомлення о {start_time}")
    connection.close()

def consume_message():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='latency_test', durable=True)

    def callback(ch, method, properties, body):
        received_time = time.time()
        sent_time = float(body.decode())
        latency = received_time - sent_time
        print(f"Затримка повідомлення: {latency:.4f} секунд")
        ch.basic_ack(delivery_tag=method.delivery_tag)

    channel.basic_consume(queue='latency_test', on_message_callback=callback)
    print("Чекаю на повідомлення...")
    channel.start_consuming()

# В одному терміналі запускаємо send_message(), в іншому — consume_message().

Практичні рекомендації по тестуванню

  1. Тестуйте на реальних даних: використовуйте обсяг повідомлень і швидкість, яка очікується в вашому застосунку.
  2. Імітуйте збої: перевірте, як система поводиться при відключенні мережі або падінні консьюмера.
  3. Збільшуйте навантаження поступово: починайте з низької швидкості, потім нарощуйте обсяг повідомлень.
  4. Моніторьте ресурси: стежте за використанням CPU і пам'яті.

Оптимізація продуктивності

На основі результатів тестування ви можете покращити продуктивність RabbitMQ:

  • Використовуйте prefetch_count: обмежте кількість повідомлень, яке консьюмер може отримувати за раз.
  • Увімкніть durable черги і persistent повідомлення: це захистить дані від втрат при збоях, але може трохи зменшити продуктивність.
  • Збільшіть кількість воркерів: додавання консьюмерів допомагає справлятися з високим навантаженням.
  • Використовуйте кластеризацію RabbitMQ: це дозволяє масштабувати сервер горизонтально.

Тепер ви не просто майстер публікації й обробки повідомлень, а й експерт з тестування продуктивності. Знання про затримки, пропускну здатність і оптимізацію тепер у вашому арсеналі! Вперед до безпроблемних мікросервісів і бажаних відмовостійких систем!

3
Опитування
Налаштування durable черг для збереження даних, рівень 12, лекція 9
Недоступний
Налаштування durable черг для збереження даних
Налаштування постійних (durable) черг для збереження даних
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ