Инфраструктура и инструменты (RabbitMQ, Redis, Docker)
RabbitMQ и AMQP
RabbitMQ — это брокер сообщений, использующий протокол AMQP 0-9-1.
- Жизненный цикл сообщения: Producer -> Exchange -> Queue -> Consumer.
- Типы Exchange:
Direct: Направляет сообщения по точному совпадению ключа маршрутизации.Topic: Направляет сообщения по шаблону (с использованием*и#).Fanout: Пересылает сообщения во все привязанные к нему очереди.Headers: Использует заголовки сообщений вместо ключей маршрутизации.
- Ack/Nack:
Ack(Acknowledge): Потребитель сообщает RabbitMQ, что сообщение обработано (можно удалить).Nack(Negative Acknowledge): Потребитель сообщает RabbitMQ, что произошла ошибка (сообщение может быть возвращено в очередь или отброшено).
- Durable vs Persistent: Durable-очередь переживает перезапуск брокера. Persistent-сообщения сохраняются на диск (при условии, что очередь тоже durable).
- Pull vs Push: RabbitMQ обычно использует модель Push (брокер отправляет сообщения потребителям), но потребители также могут «забирать» сообщения через Pull с помощью
basic.get.
Возможности Redis
Redis — это хранилище данных в оперативной памяти, используемое как база данных, кэш и брокер сообщений.
- Базовые типы данных: String, List, Set, Sorted Set, Hash.
- Сложные типы данных: Bitmaps, HyperLogLogs, Geospatial, Streams.
- Pub/Sub: Redis может выступать в качестве легковесного брокера сообщений, где издатели отправляют сообщения в каналы, а подписчики слушают их (модель «отправил и забыл»).
- Безопасность: Redis предназначен для внутреннего использования. Он должен быть доступен только в доверенных сетях. Меры безопасности включают:
requirepass: Аутентификация.rename-command: Отключение или переименование опасных команд (например,FLUSHALL).bind: Ограничение доступа определёнными IP-адресами.
Docker и DevOps
ENV vs ARG
- ARG: Используется только на этапе сборки образа. Недоступен в работающем контейнере.
- ENV: Используется как при сборке, так и во время выполнения. Сохраняется в окружении контейнера.
Docker Volumes
- Anonymous Volume: Управляется Docker, сложно найти (например,
/var/lib/docker/volumes/...). - Named Volume: Проще управлять и повторно использовать между контейнерами.
- Bind Mount: Связывает конкретную директорию хоста с директорией контейнера (лучший вариант для разработки).
Производительность БД в Docker
Запуск базы данных в Docker может иметь накладные расходы по производительности, особенно на macOS/Windows (из-за виртуальной машины и синхронизации файловой системы). На Linux скорость почти нативная, но тома по-прежнему необходимы для сохранения данных.
CI/CD (Continuous Integration / Continuous Deployment)
- Continuous Integration (CI): Частое слияние кода в основную ветку и запуск автоматизированных тестов.
- Continuous Delivery (CD): Автоматическая подготовка кода к релизу, но финальное развёртывание выполняется вручную.
- Continuous Deployment (CD): Каждое изменение, прошедшее автоматизированные тесты, автоматически развёртывается в продакшен.