Этот сервис отвечает за загрузку и асинхронную обработку медиафайлов. Он состоит из двух компонентов: API-сервера, который принимает файлы, и воркера, который обрабатывает их в фоновом режиме. Для организации очереди заданий используется RabbitMQ, а для хранения файлов — MinIO.
Проект состоит из трех основных микросервисов, работающих вместе:
- Сервис Аутентификации: Предоставляет аутентификацию пользователей. API обработчика медиа использует его для проверки прав пользователя на загрузку файлов.
- Сервис Чата: Сервис для обмена сообщениями. Воркер обработчика медиа отправляет уведомления в чат после завершения обработки файла.
media-processor(Этот сервис): Управляет полным жизненным циклом загрузки медиа, от получения файла до уведомления пользователей о завершении.
- Загрузка с аутентификацией: HTTP-ендпоинт для безопасной загрузки файлов, защищенный аутентификацией через
auth-service. - Асинхронная обработка: При загрузке файла задание немедленно публикуется в очередь RabbitMQ, что позволяет API быстро отвечать на запросы.
- Фоновый воркер: Отдельный процесс-воркер получает задания из очереди, выполняет "обработку" (в данном случае симулированную) и затем вызывает
chat-appдля уведомления соответствующей комнаты. - Объектное хранилище: Все загруженные медиафайлы хранятся в бакете объектного хранилища MinIO.
- Язык: Go
- Фреймворк API: Gin для HTTP-сервера.
- Очередь сообщений: RabbitMQ для управления фоновыми задачами.
- Объектное хранилище: MinIO для хранения медиафайлов.
- Межсервисная коммуникация: gRPC (клиент) для связи с
auth-service. - Логирование:
slog(стандартная библиотека) для структурированного логирования.
- Ендпоинт:
POST /v1/upload - Описание: Принимает запросы
multipart/form-data, содержащиеfileиroomId. - Логика:
- Аутентифицирует запрос с помощью
auth-service. - Загружает файл в MinIO.
- Публикует задание на обработку в очередь
processing_jobsв RabbitMQ.
- Аутентифицирует запрос с помощью
- Очередь:
processing_jobs - Логика:
- Слушает и получает задания из очереди RabbitMQ.
- (Симулирует обработку файла).
- Отправляет HTTP POST-запрос на внутренний ендпоинт
/notifyсервисаchat-appдля уведомления пользователей.
Самый простой и рекомендуемый способ запустить весь проект — использовать Docker Compose. Эта команда запустит и API, и воркер этого сервиса, а также все зависимости.
- Перейдите в корневой каталог проекта.
- Выполните команду:
docker compose up --build
-
Требования:
- Установленный Go 1.24+.
- Запущенные экземпляры RabbitMQ и MinIO.
- Запущенные экземпляры
auth-serviceиchat-app.
-
Настройте окружение: Создайте файл
.envв каталогеmedia-processor:# Порт для API-сервера загрузок HTTP_PORT=8002 # URL для подключения к RabbitMQ RABBITMQ_URL=amqp://user:password@localhost:5672/ # Данные для подключения к MinIO MINIO_ENDPOINT=localhost:9000 MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MINIO_BUCKET_NAME=media MINIO_USE_SSL=false # Адрес gRPC-сервера auth-service AUTH_SERVICE_ADDR=localhost:50001 # Адрес HTTP-сервера chat-app CHAT_APP_ADDR=http://localhost:8080 # Секретный ключ для внутреннего API сервиса чата CHAT_APP_INTERNAL_API_KEY=your-internal-api-key
-
Запустите сервисы: Вам нужно запустить и API, и воркер в разных терминалах.
- Терминал 1 (API):
go run ./cmd/api/main.go
- Терминал 2 (Воркер):
go run ./cmd/worker/main.go
- Терминал 1 (API):