- Notifications
You must be signed in to change notification settings - Fork0
Поддержка очередей Redis (и на RabbitMq, и на Filesystem, и через DBAL) в Битриксе
License
ProklUng/bitrix.redis.module
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Поддерживаемый транспорт:
- Redis
- RabbitMq
- Filesystem
- DBAL
composer.json основного проекта:
"extra": {"installer-paths": {"./bitrix/modules/{$name}/": ["type:bitrix-d7-module","type:bitrix-module"],"./bitrix/components/{$name}/": ["type:bitrix-d7-component","type:bitrix-component"],"./bitrix/templates/{$name}/": ["type:bitrix-d7-template","type:bitrix-theme"] } }
И:
"repositories": [ {"type":"git","url":"https://github.com/proklung/bitrix.redis.module" }, {"type":"git","url":"https://github.com/proklung/bitrix.containerable.boilerplate" } ]
$ composer require proklung/bitrix-redis-module
Установите модульproklung.redis в административном интерфейсе сайтаbitrix/admin/partner_modules.php
Добавьте следующий код в вашinit.php:
useBitrix\Main\Loader;useProklung\Redis\DI\Services;if (Loader::includeModule('proklung.redis')) { Services::boot();}
Конфигурация идентична родительскому пакету. Настройка производится посредством правки файловbitrix/.settings.phpиbitrix/.settings_extra.php:
return ['proklung.redis' => ['value' => ['enqueue' => ['default' => ['transport' =>'redis://','client' => ['default_queue' =>'default','prefix' =>'redis','app_name' =>'fedy', ], ], ], ], ]];
Консольные команды- так как в процессе запуска модуля формируется отдельный контейнер, то для запуска командпредлагается отдельный раннерenqueue.Выпилено все, что касается Doctrine (и все, что относится к
jobs, т.к. опирается на Доктрину).
useEnqueue\Client\ProducerInterface;$provider =newProklung\Redis\DI\Services();$container =$provider->boot();/** @var Symfony\Component\DependencyInjection\ContainerInterface $container *//** @var $producer ProducerInterface $producer */$producer =$container->get('enqueue.client.default.lazy_producer');$producer->sendEvent('bitrix-redis','REDDIS');
useInterop\Queue\Message;useInterop\Queue\Context;useInterop\Queue\Processor;useEnqueue\Client\TopicSubscriberInterface;class FooRedisProcessorimplements Processor, TopicSubscriberInterface{publicfunctionprocess(Message$message,Context$session) {file_put_contents($_SERVER['DOCUMENT_ROOT'] .'/redis-bitrix.log',$message->getBody());returnself::ACK;// return self::REJECT; // when the message is broken// return self::REQUEUE; // the message is fine but you want to postpone processing }publicstaticfunctiongetSubscribedTopics() {return ['bitrix-redis']; }}
КлассFooRedisProcessor должен быть зарегистрирован сервисом (и помечен тэгомenqueue.topic_subscriber)в.settings.php модуля:
return ['parameters' => ['value' => ['cache_path' =>'/bitrix/cache/s1/proklung.redis',// Путь к закешированному контейнеру'compile_container_envs' => ['dev','prod'],// Окружения при которых компилировать контейнер'container.dumper.inline_factories' =>false,// Дампить контейнер как одиночные файлы ],'readonly' =>false, ],'services' => ['value' => ['Proklung\Redis\Samples\FooRedisProcessor' => ['className' => \Proklung\Redis\Samples\FooRedisProcessor::class,'tags' => ['name' =>'enqueue.topic_subscriber','client' =>'default'] ], ],'readonly' =>false, ],];
В целом модуль следует канве оригинального бандла. Основное отличие - способ конфигурирования сервисов (не Yaml, а битриксовыемассивные конфиги).
Параметрcache_path - путь, куда ляжет скомпилированный контейнер. Если не задано, то по умолчанию/bitrix/cache/s1/proklung.redis.
Предполагается, что в системе так или иначе установлена переменная средыDEBUG в массиве$_ENV. Если нет, то по умолчаниюполагается, что среда "отладочная".
Параметр (массив)compile_container_envs указывает окружения, при которых необходимо кэшировать контейнер.
Пока простая логика:$_ENV["DEBUG"] === true => окружениеdev, иначеprod.
Доступны некоторые команды, которые упрощают работу:
enqueue:consumeenqueue:produceenqueue:setup-brokerenqueue:routesenqueue:transport:consume
Подробнее в документации оригинального бандла.
В папке/install/bin модуля лежит файлenqueue. При установке модуля система попробует скопировать его в директорию,bin, лежащую двумя уровнями вышеDOCUMENT_ROOT. Если такой директории не существует, то сделано ничего не будет. Придетсясоздать папку руками и скопировать туда файл вручную.
Запуск:
php bin/enqueue enqueue:setup-broker
Все доступные команды:
php bin/enqueue
.settings.php Битрикса:
// ... предыдущее'proklung.redis' => ['value' => ['enqueue' => [// ... предыдущее'rabbit' => ['transport' =>'amqp://','client' => ['default_queue' =>'default','prefix' =>'rabbit','app_name' =>'fedy', ], ], ] ] ],
Все по аналогии с Redis или файловой системой. Важно первый раз не забыть запуститьsetup-broker:
php bin/enqueue enqueue:setup-broker --client=rabbit
php bin/enqueue enqueue:consume --client=rabbit
Гдеrabbit - название клиента, определяемое в.settings.php Битрикса.
Дабы не отягощать модуль зависимостями -enqueue/dbal не включен в стандартныйcomposer.json. Для использованияэтого транспорта нужно самолично запуститьcomposer require enqueue/dbal в конечном проекте.
.settings.php Битрикса:
// ... предыдущее'proklung.redis' => ['value' => ['enqueue' => [// ... предыдущее'dbal' => ['transport' =>'mysql://root:@localhost/bitrix.loc','client' => ['default_queue' =>'default','prefix' =>'dbal','app_name' =>'fedy', ], ], ] ] ],
Все по аналогии с Redis или файловой системой. Важно первый раз не забыть запуститьsetup-broker (будет созданатаблицаenqueue):
php bin/enqueue enqueue:setup-broker --client=dbal
php bin/enqueue enqueue:consume --client=dbal
Гдеdbal - название клиента, определяемое в.settings.php Битрикса.
.settings.php Битрикса:
// ... предыдущее'proklung.redis' => ['value' => ['enqueue' => [// ... предыдущее'filesystem' => [// $_SERVER['DOCUMENT_ROOT'] - важно!'transport' =>'file:///' .$_SERVER['DOCUMENT_ROOT'] .'/bitrix/cache/s1/fs','client' => ['default_queue' =>'default','prefix' =>'fs','app_name' =>'fedy', ], ], ] ] ],
Класс:
useInterop\Queue\Message;useInterop\Queue\Context;useInterop\Queue\Processor;useEnqueue\Client\TopicSubscriberInterface;class FooFsProcessorimplements Processor, TopicSubscriberInterface{publicfunctionprocess(Message$message,Context$session) {file_put_contents($_SERVER['DOCUMENT_ROOT'] .'/fs-bitrix.log',$message->getBody());returnself::ACK; }publicstaticfunctiongetSubscribedTopics() {return ['bitrix-fs']; }}
.settings.php модуля:
return ['services' => ['value' => [// ... предыдущие клиенты'Proklung\Redis\Samples\FooFsProcessor' => ['className' => \Proklung\Redis\Samples\FooFsProcessor::class,'tags' => ['name' =>'enqueue.topic_subscriber','client' =>'filesystem'] ], ],'readonly' =>false, ],];
$services =newProklung\Redis\DI\Services();$container =$services->boot();$producerFs =$container->get('enqueue.client.filesystem.lazy_producer');$producerFs->sendEvent('bitrix-fs','FS');
php bin/enqueue enqueue:consume --client=filesystem
Гдеfilesystem - название клиента, определяемое в.settings.php Битрикса.
Или так:
/** @var Context $context */$context =$container->get('enqueue.transport.filesystem.context');$fooQueue =$context->createQueue('fs.fedy.default');// См. .settings.php, свойства клиента.$consumer =$context->createConsumer($fooQueue);$message =$consumer->receiveNoWait();// Для примера, чтобы скрипт не зацикливался. В нормальной среде - $consumer->receive().$consumer->acknowledge($message);
Данный модуль представляет собой адаптациюпакета для работыв среде Битрикс.
Оригинальнаядокументация валидна, за исключением некоторых нюансов.
About
Поддержка очередей Redis (и на RabbitMq, и на Filesystem, и через DBAL) в Битриксе
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.