Система обработки CAN-логов упиралась: скрипт не успевал разбирать сообщения из Redis. Разобрал три анти-паттерна: hash-set вместо очереди, циклический полный обход вместо блокирующего чтения, один потребитель для CPU-bound декодирования. ## Решение Redis Streams + consumer groups: продюсер дописывает через `XADD` с pipeline, несколько воркеров читают через `XREADGROUP` с `BLOCK`, подтверждают через `XACK` после успешной вставки в ClickHouse. Зависшие сообщения забирает `XAUTOCLAIM`. Декодирование CAN — CPU-bound, поэтому масштабируем процессами, а не потоками (GIL). Дедупликация — по `msg_id` через `ReplacingMergeTree`.