Пример потоковой передачи журналов с использованием celery, socket.IO и контейнеров
В этом примере мы предоставляем пример приложения, демонстрирующий потоковую передачу журналов между контейнерами и почему это важно. У нас есть два компонента:
- Сервер, принимающий запросы HTTP POST.
- Клиент, который отправляет запросы HTTP POST.
Клиент отправляет POST-запрос на сервер для расчёта последовательности Фибоначчи. Затем сервер вычисляет последовательность и отправляет ответ. Эту простую модель можно расширить для распределения всех видов рабочих нагрузок в виде микросервисов.
Следующий файл docker-compose.yml представляет описанную выше настройку.
version: "3"
services:
redis:
image: redis:5
ports:
- "6379:6379"
web:
build: ./server
command: flask run --host=0.0.0.0 --port=5001
volumes:
- "./server:/code"
ports:
- "5001:5001"
environment:
FLASK_APP=app_server.py
FLASK_RUN_HOST=0.0.0.0
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1
depends_on:
- redis
worker:
build: ./server #
command: celery -A tasks.celery worker --loglevel=info
command: celery -A tasks worker --loglevel=info
volumes:
- "./server:/code"
environment:
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1
depends_on:
- web
client:
build: context: ./client
dockerfile: Dockerfile
volumes:
- "./client:/code"
depends_on:
- worker
Приведённый выше файл docker-compose.yml создаёт четыре контейнера: redis, worker и web составляют серверный компонент, а client — отдельный компонент. Для простоты, чтобы избежать ошибки '404 not found', мы добавили ключ depend_on в образ клиента, чтобы клиент отправлял запрос только после полной загрузки сервера. Как только все контейнеры готовы, клиент отправляет POST-запрос с одним параметром n для вычисления последовательности Фибоначчи до n чисел Фибоначчи. Например, если параметр n равен 10, последовательность будет такой: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]. Каждое число Фибоначчи, вычисленное сервером, отправляется клиенту в виде журнала. Такое поведение полезно, когда клиент отправляет серверу длительную команду, и вместо ожидания пустого экрана сервер может отправлять журналы обратной связи. Рабочие процессы Celery используются для передачи ресурсоемких или длительных задач, которые могут обрабатываться асинхронно. Celery требуется брокер сообщений — в данном случае Redis — для облегчения связи между производителем задачи (клиентским приложением) и потребителем задачи (работником). Полный код приложения выше доступен по адресу:
Заключение
Docker Compose позволяет настраивать, создавать и запускать многоконтейнерные приложения Docker с помощью файла конфигурации YAML docker-compose.yml. Разработчики могут отслеживать приложения, отображая журналы всех определённых служб с помощью команды docker-compose logs. Docker поддерживает различные драйверы журналирования, которые обрабатывают и хранят журналы контейнера. Режимы доставки журналов Docker, "блокирующий" и "неблокирующий", влияют на то, как журналы передаются из контейнеров в указанный драйвер журнала.
Перевод с некоторыми авторскими правками.