Skip to content

Repository files navigation

Система обработки очереди событий

Обзор

Данная система предназначена для обработки событий, связанных с различными аккаунтами, с сохранением порядка обработки событий для каждого аккаунта. Система построена с использованием Redis для хранения очереди и PHP для обработки событий.

Ключевые компоненты

  1. Event: Класс, представляющий событие с идентификатором аккаунта и идентификатором события
  2. QueueInterface: Интерфейс, определяющий методы для работы с очередью
  3. RedisQueue: Реализация интерфейса очереди с использованием Redis
  4. EventProcessorInterface: Интерфейс, определяющий метод обработки события
  5. SimpleEventProcessor: Простая реализация обработчика событий с задержкой в 1 секунду
  6. Worker: Класс, координирующий обработку событий в режиме round-robin по аккаунтам

Принцип работы

  • События хранятся в Redis в отдельных списках для каждого аккаунта
  • Система поддерживает множество активных аккаунтов (с ожидающими обработки событиями)
  • Воркеры обрабатывают по одному событию от каждого активного аккаунта за один проход
  • Это обеспечивает обработку событий для каждого аккаунта в правильном порядке
  • Запуск нескольких процессов-воркеров параллельно (по одному на каждое ядро CPU) максимизирует пропускную способность

Максимизация скорости

Ключ к ускорению этого решения — запуск нескольких процессов-воркеров параллельно. Каждый воркер независимо обрабатывает события от разных аккаунтов, но события для одного аккаунта всегда обрабатываются по порядку. Скрипт start-workers.sh запускает по одному воркеру на каждое ядро CPU для использования всех доступных вычислительных ресурсов.

Docker-установка (рекомендуется)

Проект настроен для запуска в Docker с использованием docker-compose.

Предварительные требования

  • Docker
  • Docker Compose

Запуск с помощью Docker

  1. Клонировать репозиторий:
git clone https://github.com/ma1exe/event-queue-processor.git
cd event-queue-processor
  1. Запустить приложение с помощью docker-compose:
docker-compose up -d

Это запустит:

  • Redis контейнер для хранения очереди
  • PHP контейнер для добавления событий в очередь и их обработки с несколькими воркерами
  1. Просмотр системных логов контейнеров:
docker-compose logs -f
  1. Просмотр логов обработки событий:
# Просмотр всего лог-файла
cat logs/log.txt

# Просмотр в реальном времени
tail -f logs/log.txt

Настройка количества воркеров

По умолчанию система запускает количество воркеров, равное числу ядер процессора. Вы можете изменить это значение в docker-compose.yml:

environment:
  - WORKERS_COUNT=4  # Задаем нужное количество воркеров

Использование Makefile

Для удобства в проекте есть Makefile с основными командами:

# Запуск контейнеров
make up

# Остановка контейнеров
make down

# Просмотр логов контейнеров
make logs

# Просмотр логов обработки событий
make log
  
# Запуск тестов
make test

# Пересборка и перезапуск
make reset

Конфигурация

Настройки Redis хранятся в файле .env:

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

Стандартная установка (без Docker)

Требования

  • PHP 7.4 или выше
  • Расширение Redis для PHP
  • Redis сервер

Установка

composer install

Использование

  1. Убедитесь, что Redis сервер запущен
  2. Добавьте события в очередь:
php bin/enqueue.php
  1. Запустите обработку событий:
bash bin/start-workers.sh

Тесты

Система включает модульные тесты для проверки корректности работы компонентов очереди и воркера.

Запуск тестов без Docker:

vendor/bin/phpunit

Запуск тестов в Docker:

docker-compose exec app vendor/bin/phpunit

Структура проекта

├── bin/
│   ├── enqueue.php          # Скрипт для добавления событий в очередь
│   ├── worker.php           # Скрипт воркера
│   └── start-workers.sh     # Скрипт для запуска нескольких воркеров
├── src/
│   ├── Event.php            # Класс события
│   ├── Queue/
│   │   ├── QueueInterface.php  # Интерфейс очереди
│   │   └── RedisQueue.php   # Реализация очереди на Redis
│   ├── Processor/
│   │   ├── EventProcessorInterface.php  # Интерфейс обработчика событий
│   │   └── SimpleEventProcessor.php     # Реализация обработчика
│   ├── Utils/
│   │   └── Config.php       # Утилита для загрузки конфигурации
│   └── Worker/
│       └── Worker.php       # Класс воркера
├── tests/
│   ├── QueueTest.php        # Тесты для очереди
│   └── WorkerTest.php       # Тесты для воркера
├── .env                     # Файл конфигурации
├── docker-compose.yml       # Конфигурация Docker
├── Dockerfile               # Инструкции для сборки PHP-контейнера
├── Makefile                 # Make-команды для удобства
└── phpunit.xml              # Конфигурация PHPUnit

Принципы SOLID

Решение построено с соблюдением принципов SOLID:

  1. S (Single Responsibility): Каждый класс отвечает только за одну часть функциональности
  2. O (Open/Closed): Система открыта для расширения через интерфейсы
  3. L (Liskov Substitution): Подклассы (например, RedisQueue) могут заменить базовые классы
  4. I (Interface Segregation): Интерфейсы разделены на специфичные (QueueInterface, EventProcessorInterface)
  5. D (Dependency Inversion): Высокоуровневые компоненты зависят от абстракций, а не от конкретных реализаций

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages