Scalability Benchmarks
Измерение способности системы справляться с большим количеством concurrent consumers.
Метрики
| Метрика | Описание | Единица |
|---|---|---|
produce_throughput |
Скорость публикации сообщений | msg/s |
consume_throughput |
Скорость потребления сообщений | msg/s |
latency_p50/p99 |
End-to-end задержка (от publish до consume) | ms |
message_loss_pct |
Процент потерянных сообщений | % |
consumer_startup_sec |
Время запуска всех консьюмеров | sec |
Тесты
test_massive_consumers_stress
Ключевой тест масштабируемости. Проверяет работу с экстремальным числом concurrent consumers.
@pytest.mark.parametrize("n_consumers,n_messages", [
(100, 1000), # Moderate stress
(500, 2000), # High stress
(900, 3000), # Extreme stress
])
def test_massive_consumers_stress(...)
Методология:
- Создается connection с pool размером
n_consumers + 10 - Запускается
n_consumersconsumer threads - Все consumers синхронизируются через
Barrier - После готовности всех consumers — публикация сообщений
- Измерение времени потребления каждого сообщения
Паттерн consumer:
def consumer(cons_id: int) -> None:
with pool.acquire() as ch:
simple_queue = connection.SimpleQueue(queue_name, channel=ch)
try:
consumers_ready.wait() # Синхронизация
while not stop_consumers.is_set():
msg = simple_queue.get(timeout=0.5)
# Process message...
msg.ack()
finally:
simple_queue.close()
test_concurrent_produce_consume
Реалистичный сценарий одновременной работы producers и consumers.
@pytest.mark.parametrize("n_producers,n_consumers,n_messages", [
(5, 5, 500), # Balanced workload
(10, 3, 300), # Producer-heavy
])
def test_concurrent_produce_consume(...)
Особенности:
- Producers и consumers работают одновременно
- Симуляция обработки сообщения (
time.sleep(5-20ms)) - Отслеживание уникальности сообщений (дедупликация)
test_burst_traffic
Тестирование обработки burst-нагрузки (всплесков трафика).
# Traffic pattern: (messages, delay_ms)
traffic = [
(50, 20), # Normal: ~50/s
(200, 2), # Spike: ~500/s
(50, 20), # Normal
(300, 0), # Heavy spike: instant
(50, 20), # Normal
]
Что проверяет:
- Способность справляться с резкими всплесками нагрузки
- Восстановление после пиков
- Queue buffering под нагрузкой
Результаты
Scalability по количеству consumers
Таблица результатов
| Consumers | Messages | Throughput | Startup | P50 | P99 | Loss |
|---|---|---|---|---|---|---|
| 100 | 1,000 | 2,142 msg/s | 0.08s | 4.84ms | 13.05ms | 0% |
| 500 | 2,000 | 906 msg/s | 0.36s | 19.93ms | 315ms | 0% |
| 900 | 3,000 | 341 msg/s | 0.73s | 36.36ms | 326ms | 0% |
Latency Distribution
Анализ
Линейность масштабирования
Sublinear scaling
Эффективность 1.8% указывает на существенную деградацию при масштабировании. Это ожидаемо для shared-nothing архитектуры с одним connection.
Bottlenecks
- Single Connection — все consumers используют один TCP connection
- Transport Lock — все операции сериализуются через
_transport_lock - SimpleQueue Overhead — каждый consumer поддерживает свою очередь
Рекомендации
Масштабирование в production
- Для > 100 consumers используйте несколько connections
- Каждый connection — отдельный pool с 50-100 consumers
- Рассмотрите sharding очередей по consumers
Воспроизведение
# Все scalability тесты
pytest tests/benchmarks/bench_realistic.py::TestRealisticWorkloads -v
# Только massive consumers
pytest tests/benchmarks/bench_realistic.py::TestRealisticWorkloads::test_massive_consumers_stress -v
# Конкретная конфигурация
pytest "tests/benchmarks/bench_realistic.py::TestRealisticWorkloads::test_massive_consumers_stress[900-3000]" -v