На главную

Сервис отправки Webhook-уведомлений на Go (для всех)

1. Цель проекта Разработать сервис на языке Go для отправки HTTP-запросов (вебхуков) на указанные URL с учетом следующих требований: Поддержка методов GET, POST, PUT. Передача заголовков, параметров и тела запроса. Ограничение количества запросов для каждого домена (по умолчанию 1 запрос в секунду, с возможностью настройки). Отправка всех вебхуков с одного IP-адреса, независимо от количества подов или нод. Управление очередью задач, обработка ошибок и предоставление интерфейса для мониторинга и управления. 2. Функциональные требования 2.1. Получение задач Сервис принимает задачи через очередь RabbitMQ. Описание полей: task_id: Уникальный идентификатор задачи. initiator: Название сервиса, инициировавшего задачу. method: HTTP-метод (GET, POST, PUT). url: URL для отправки запроса. headers: Заголовки запроса (опционально). params: Параметры для GET-запросов (опционально). body: Тело запроса для POST/PUT (опционально). 2.2. Очередь задач Задачи хранятся в RabbitMQ и обрабатываются в порядке поступления (по принципу FIFO). Поддержка пачечной обработки для повышения производительности. 2.3. Обработка задач Используется пул worker’ов (горутин) для параллельной обработки задач. Логика обработки: Извлечение домена из url (например, example.com). Проверка лимита запросов для домена через Redis. Если лимит не превышен, отправка HTTP-запроса через прокси (для использования одного IP). Обработка ответа: Код 200: Успех, задача завершена. Любой другой статус (4xx, 5xx, таймауты, сетевые ошибки): Увеличить attempts на 1. Если attempts < 30, отложить задачу с экспоненциальной задержкой (например, 2^attempts секунд). Если attempts >= 30, переместить задачу в Dead Letter Queue (DLQ). 2.4. Rate Limiting Для каждого домена устанавливается лимит запросов в секунду (по умолчанию 1 запрос/сек). Лимиты хранятся в PostgreSQL и кэшируются в Redis. При появлении нового домена он автоматически добавляется с дефолтным лимитом (1 запрос/сек). Worker’ы проверяют лимит перед отправкой каждого запроса. 2.5. Отправка с одного IP-адреса Все запросы отправляются через прокси-сервер (например, Squid) или NAT, чтобы использовать единый выходной IP-адрес. 2.6. Управление доменами Данные о доменах хранятся в PostgreSQL Логика: При поступлении задачи с новым доменом добавляется запись с rate_limit = 1 и is_active = true. Администратор может изменять rate_limit или деактивировать домен (is_active = false), что приостанавливает обработку задач для этого домена и все задачи будут уходить в DLQ. 2.7. Dead Letter Queue (DLQ) Задачи, не доставленные после 30 попыток, перемещаются в DLQ (отдельная очередь в RabbitMQ). Дополнительно задачи сохраняются в PostgreSQL. Админ-панель для DLQ: Возможность выбрать задачи и переотправить их пачкой. При переотправке создается новая задача в основной очереди с attempts = 0. Удаляется запись из DLQ и таблицы dlq_tasks. 2.8. Админ-панель Веб-интерфейс для управления: Домены: Просмотр списка, редактирование rate_limit и is_active. Очередь задач: Просмотр текущих задач, фильтрация по initiator, домену, статусу. DLQ: Просмотр, фильтрация, переотправка задач пачкой. Реализация аутентификации (например, JWT или базовая аутентификация). 2.9. Мониторинг Использование Prometheus для сбора метрик: Длина основной очереди и DLQ. Количество ошибок и сбоев. Использование лимитов (rate limiting). Время нахождения задач в очереди. Настройка Grafana для визуализации метрик. Настройка алертов на превышение лимитов или большое количество ошибок. 3. Нефункциональные требования Производительность: Способность обрабатывать до 1000 задач в минуту. Масштабируемость: Поддержка горизонтального масштабирования worker’ов. Надежность: Повторные попытки до 30 раз при неудаче. Идемпотентность обработки задач через уникальный task_id. Безопасность: Защита админ-панели аутентификацией. Хранение секретов (паролей, ключей) в переменных окружения или Vault. Логирование: Подробные логи с указанием task_id, initiator, URL и статуса ответа. Конфигурирование: Все настройки сервиса выносятся в config.yaml 4. Технологии Язык программирования: Go. Очередь: RabbitMQ. База данных: PostgreSQL. Rate Limiting: Redis. Веб-сервер для админ-панели: Gin или Echo. Мониторинг: Prometheus + Grafana. 5. Архитектура Worker Service: Основной сервис для обработки задач из очереди. Admin Service: Веб-интерфейс для управления доменами, очередью и DLQ. Rate Limiter: Redis для отслеживания и ограничения запросов. Коммуникация: RabbitMQ для передачи задач. Хранилище: PostgreSQL для хранения данных о доменах и DLQ. 7. Дополнительные требования Документация: Подготовить документацию API для админ-панели. Тестирование: Написать юнит-тесты для модулей rate limiter и обработки задач. CI/CD: Настроить автоматизацию деплоя (например, через GitHub Actions или GitLab CI). 8. Сроки и бюджет обсуждаются, напишите ваш опыт и предложение!

Разработка проекта строительства котельной мощностью 116 МВт

Разработка проектной документации строительства котельной на 116 МВт, раздел ТМ(тепломеханические решения) цена договорная 2025-03-28

Создание трафарета для фотоальбома

задача создать в corel, в .cdr формате трафарет для фотоальбома с тематикой изображений для школы, это набор рисунков, цифр, которые относятся...

Разработка логотипа

Добрый день работяги! Требуется разработать логотип для сервиса по оплате зарубежных подписок с сфере AI, различный... цена договорная 2025-03-31