Задача - обработать события в том порядке в котором они попали в очередь и как можно быстрее.
Для очередей был выбран redis, под каждого пользователя создается отдельная очередь по шаблону user_events_queue_* где * это Id пользователя.
Код написан в процедурном стиле, т.к. для решения данной задачи ООП выглядит избыточным.
-
Склонировать репозиторий в рабочую директорию.
git clone https://github.com/ilyakonovaloff/php-consumer .
-
Собрать и запустить докер контейнеры.
docker-compose up -d --build
-
Проект готов для работы, ниже будут приведен конфигурация и команды.
Проект использует следующие переменные окружения:
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