Skip to content

ilyakonovaloff/php-consumer

Repository files navigation

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

Задача - обработать события в том порядке в котором они попали в очередь и как можно быстрее.

Для очередей был выбран redis, под каждого пользователя создается отдельная очередь по шаблону user_events_queue_* где * это Id пользователя.

Код написан в процедурном стиле, т.к. для решения данной задачи ООП выглядит избыточным.

Установка

  1. Склонировать репозиторий в рабочую директорию.

    git clone https://github.com/ilyakonovaloff/php-consumer .
    
  2. Собрать и запустить докер контейнеры.

    docker-compose up -d --build
    
  3. Проект готов для работы, ниже будут приведен конфигурация и команды.

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

Проект использует следующие переменные окружения:

  • REDIS_HOST: Хост редиса. По умолчанию redis.
  • SINGLE_LOG_FILE: Значение 1 для записи отладочных логов выполнения консьюмера в один файл, или 0 для записи в отдельные файлы для каждого пользователя. По умолчанию 1.
  • DEBUG_MODE: Значение 1 для включения режима отладки и записи в логи, или 0 отключает режим отладки. По умолчанию 0.
  • WRITE_TO_FILE: Значение 1 записывает обработанные события пользователя для проверки очередности обработки, 0 без фиксирования обработанных событий в файл. По умолчанию 1.
  • FAIR_CONSUMING: Задает значения справедливой обработки значений пользователя, чтобы исключить ситуацию, когда у одних пользователей очень много событий, а другие ожидают, пока все события обработаются. По умолчанию 0 (нет ограничений).
  • CHUNK_SIZE: Задает количество очередей пользователей на одну итерацию(количество консьюмеров). По умолчанию 100.
  • EMULATE_EVENT_PROCESS: Значение 1 для эмуляции обработки пользовательского события, или 0 отключает режим эмуляции. По умолчанию 0. (При включенном режиме записи в файл (WRITE_TO_FILE) обработанных событий это выглядит достаточным, чтобы не увеличивать время ожидания обработки события)
  • USERS_COUNT: Количество пользователей для которых будут создаваться события. По умолчанию 1000.
  • EVENTS_PER_USER_COUNT: Количество событий для каждого пользователя. По умолчанию 10000.

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

Генерация событий

Для генерации событий запустить EventGenerator.php:

docker-compose exec php php src/EventGenerator.php

Время генерации зависит от параметров USERS_COUNT и EVENTS_PER_USER_COUNT. При значениях по умолчанию генерация для 1000 пользователей 10000 событий (для каждого) занимает в общем пару минут.

Обработка событий

Для запуска обработки очередей запустить MainProcess.php:

docker-compose exec php php src/MainProcess.php

MainProcess.php руководит процессом обработки очередей, порождая дочерние процессы. Их количество зависит от параметра CHUNK_SIZE. Периодически проверяя не появились ли новые очереди и не опустели ли обрабатываемые.

Если включен режим записи в файл WRITE_TO_FILE проверить очередность можно в директории data в файлах типа user_events_*.log

Дополнительные скрипты

Если включены параметры DEBUG_MODE и WRITE_TO_FILE может потребоваться очистка старых лог файлов, для этого можно запустить скрипт:

docker-compose exec php sh clear_logs.sh

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published