Anything can be a message queue if you use it wrongly enough (2023)
Предупреждение: это сатира, не используйте в проде. Читая, вы клянётесь не повторять описанное.
Проблема
Managed NAT Gateway в AWS тарифицирует исходящий трафик по 0,07 $/ГБ и убивает стартапы счетами за облако.
Решение
Вместо него для веб-хуков можно:
- поднять exit-ноду Tailscale с публичным IP;
- привязать её к той же VPC;
- получить шифрование и экономию до 700 %.
Это единственный безопасный фрагмент статьи.
S3 как очередь
AWS начинался с S3, SQS и EC2. S3 — это malloc()
для облака:
- выделяете «память» (бакет);
- кладёте туда объекты любой длины;
- освобождаете, когда надоедает.
Аналогия с C: malloc()
→ указатель, free()
→ удаление объекта. Ошибка выделения → ENOMEM
, дальше — краш.
Как превратить S3 в очередь
- Писать сообщения в виде объектов с ключом
queue/<uuid>.json
. - Читать через
ListObjectsV2
иGetObject
. - Удалять после обработки.
- Повторять раз в секунду — получаем «очередь» с задержкой ~1 с и бесплатным исходящим трафиком внутри региона.
Плюсы:
- нет платы за NAT Gateway;
- S3 дёшев и масштабируем;
- можно шифровать объекты.
Минусы:
- eventual consistency: сообщения могут дублироваться или задерживаться;
- rate limit 3 500 PUT/COPY/POST/DELETE и 5 500 GET/HEAD на префикс;
- ListObjects дорогой (0,005 $ за 1 000 запросов);
- придётся реализовать ack/nack, dead-letter и backoff самому.
«Продвинутые» техники
- Long polling: ждать, пока в бакете появится новый объект.
- Fan-out: несколько читателей по префиксам.
- Batching: складывать сообщения в один объект gzipом.
- Priority: префиксы
high/
,low/
. - FIFO: ключ
queue/<timestamp>-<uuid>.json
. - DLQ: префикс
failed/
. - Крон: Lambda по расписанию чистит старые сообщения.
Итог
S3-очередь — это пародия на архитектуру, но она работает и экономит деньги. Для настоящих задач используйте SQS, Kafka или RabbitMQ.
Комментарии (48)
- Участники вспомнили, как в 90-х использовали Microsoft Exchange вместо дорогого TIBCO, а Amazon Video — S3 вместо очереди, и оба решения оказались «костылями».
- Подчеркивают, что очередь — это просто быстрый конечный автомат, но самописные варианты на SQL или Git-вебхуках быстро ломаются под нагрузкой.
- Некоторые шутят, что любую технологию можно превратить в очередь или базу, если использовать её «достаточно неправильно».
- Обсуждают юридические проблемы с IP, когда хобби-проект пересекается с работой, и сравнивают цены AWS с Whole Foods.
- В итоге сходятся во мнении: костыль может работать, но рано или поздно придётся платить за правильное решение.
Why was Apache Kafka created? 💬 Длинная дискуссия
Почему появился Apache Kafka
LinkedIn, 2012 г.
Проблема интеграции
LinkedIn нужно было передавать данные активности (лайки, просмотры, публикации) в десятки систем: антифрод, ML-модели, веб-функции, витрины, Hadoop. Эти потоки — критичная инфраструктура, а не просто аналитика.
Старые трубы
- Пакетный конвейер: приложения писали XML на HTTP-сервер; раз в час файлы собирались, парсились и грузились в Oracle + Hadoop.
- Realtime-конвейер: метрики и логи уходили в Zenoss, но туда нельзя было добавить новые данные без ручной работы, а данные были изолированы.
Общие боли
- ручное сопровождение и добавление источников;
- постоянные бэклоги;
- point-to-point архитектура без обмена между системами.
Вывод
LinkedIn понял, что нужен один надёжный, масштабируемый и универсальный «шина событий», куда пишут все, а читают кто угодно. Так родился Kafka.
Комментарии (172)
- LinkedIn отказался от Kafka и создал собственную систему Northguard из-за невозможности масштабировать 32 трлн записей/день, 17 ПБ/день и 400 тыс. топиков.
- Участники спорят: Kafka мощна для «огненных шлангов» данных и многократного потребления, но требует экспертизы и ресурсов; для большинства задач достаточно Redis, NATS, RabbitMQ.
- Названа главная фишка Kafka — возможность переигрывать сообщения и строить разные консьюмеры поверх одного лога.
- Сравнивают NATS (Jetstream) и Apache Pulsar как более лёгкие альтернативы; Redpanda тоже упоминается.
- Мнения разделились: кто-то считает Kafka переоценённой и «бюрократичной», кто-то — незаменимой для больших данных.