Поддержка очередей Redis (и на RabbitMq, и на Filesystem, и через DBAL) в Битриксе

Overview

Модуль для Битрикса, организующий работу с очередями через Redis (и не только)

Поддерживаемый транспорт:

  • 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:

use Bitrix\Main\Loader;
use Proklung\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, т.к. опирается на Доктрину).

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

Producer

use Enqueue\Client\ProducerInterface;

$provider = new Proklung\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');

Consumers

use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;

class FooRedisProcessor implements Processor, TopicSubscriberInterface
{
    public function process(Message $message, Context $session)
    {
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/redis-bitrix.log', $message->getBody());

        return self::ACK;
        // return self::REJECT; // when the message is broken
        // return self::REQUEUE; // the message is fine but you want to postpone processing
    }

    public static function getSubscribedTopics()
    {
        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.

CLI

Доступны некоторые команды, которые упрощают работу:

  • enqueue:consume
  • enqueue:produce
  • enqueue:setup-broker
  • enqueue:routes
  • enqueue:transport:consume

Подробнее в документации оригинального бандла.

В папке /install/bin модуля лежит файл enqueue. При установке модуля система попробует скопировать его в директорию, bin, лежащую двумя уровнями выше DOCUMENT_ROOT. Если такой директории не существует, то сделано ничего не будет. Придется создать папку руками и скопировать туда файл вручную.

Запуск:

   php bin/enqueue enqueue:setup-broker

Все доступные команды:

   php bin/enqueue

Другие транспорты

RabbitMq

Настройка

.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 Битрикса.

DBAL

Установка

Дабы не отягощать модуль зависимостями - 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',
                    ],
                ],
            ]
        ]
    ],

Клиент

Класс:

use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;

class FooFsProcessor implements Processor, TopicSubscriberInterface
{
    public function process(Message $message, Context $session)
    {
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/fs-bitrix.log', $message->getBody());

        return self::ACK;
    }

    public static function getSubscribedTopics()
    {
        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 = new Proklung\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);

Credits

Данный модуль представляет собой адаптацию пакета для работы в среде Битрикс.

Оригинальная документация валидна, за исключением некоторых нюансов.

You might also like...
A micro web application providing a REST API on top of any relational database, using Silex and Doctrine DBAL

Microrest is a Silex provider to setting up a REST API on top of a relational database, based on a YAML (RAML) configuration file.

The most widely used PHP client for RabbitMQ

php-amqplib This library is a pure PHP implementation of the AMQP 0-9-1 protocol. It's been tested against RabbitMQ. The library was used for the PHP

Performant pure-PHP AMQP (RabbitMQ) sync/async (ReactPHP) library

BunnyPHP Performant pure-PHP AMQP (RabbitMQ) sync/async (ReactPHP) library Requirements BunnyPHP requires PHP 7.1 and newer. Installation Add as Compo

PHP Library that implements several messaging patterns for RabbitMQ

Thumper Thumper is a PHP library that aims to abstract several messaging patterns that can be implemented over RabbitMQ. Inside the examples folder yo

Curso Laravel Microservices - RabbitMQ

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

PHP Library that implements several messaging patterns for RabbitMQ

Thumper Thumper is a PHP library that aims to abstract several messaging patterns that can be implemented over RabbitMQ. Inside the examples folder yo

The most widely used PHP client for RabbitMQ

php-amqplib This library is a pure PHP implementation of the AMQP 0-9-1 protocol. It's been tested against RabbitMQ. The library was used for the PHP

RabbitMQ driver for ThinkPHP6 Queue.

RabbitMQ driver for ThinkPHP6 Queue.

RabbitMQ driver for Laravel Queue. Supports Laravel Horizon.

RabbitMQ Queue driver for Laravel Support Policy Only the latest version will get new features. Bug fixes will be provided using the following scheme:

A wrapper for vladimir-yuldashev RabbitMQ Queue for Laravel with Actions

RabbitMQ Actions This package its a wrapper of vladimir-yuldashev/rabbitmq-queue-laravel. Adds a new feature to produce and consume messages with Rabb

A PHP implementation of RabbitMQ Client for webman plugin.
A PHP implementation of RabbitMQ Client for webman plugin.

workbunny/webman-rabbitmq 🐇 A PHP implementation of RabbitMQ Client for webman plugin. 🐇 A PHP implementation of RabbitMQ Client for webman plugin 常

A filesystem-like repository for storing arbitrary resources.

The Puli Repository Component Latest release: 1.0.0-beta10 PHP = 5.3.9 The Puli Repository Component provides an API for storing arbitrary resources

PHP library that provides a filesystem abstraction layer − will be a feast for your files!

Gaufrette Gaufrette provides a filesystem abstraction layer. Why use Gaufrette? Imagine you have to manage a lot of medias in a PHP project. Lets see

This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files.

Laravel FFMpeg This package provides an integration with FFmpeg for Laravel 6.0 and higher. Laravel's Filesystem handles the storage of the files. Fea

Google Cloud Storage filesystem driver for Laravel
Google Cloud Storage filesystem driver for Laravel

Google Cloud Storage filesystem driver for Laravel Google Cloud Storage filesystem driver for Laravel. This started as a fork from Superbalist/laravel

A Qiniu Storage filesystem for Laravel

Laravel filesystem Qiniu Qiniu storage for Laravel based on overtrue/flysystem-qiniu. Requirement PHP = 5.5.9 Installation $ composer require "overtr

Egnyte Filesystem

Egnyte Filesystem I was working on Egnyte project for Laravel and didn't find any decent solution so decided to write my own. Inspired by Yespbs\Egnyt

This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files.

Laravel FFMpeg This package provides an integration with FFmpeg for Laravel 6.0 and higher. Laravel's Filesystem handles the storage of the files. Lau

Mage2click toolset to create and manage the Magento Docker development environment with mutagen.io file-sync for macOS and native filesystem mounts on Linux.
Mage2click toolset to create and manage the Magento Docker development environment with mutagen.io file-sync for macOS and native filesystem mounts on Linux.

Mage2click - Magento Docker Toolset Mage2click toolset is a system-wide command-line tool for creating and managing simultaneously running Magento Doc

Releases(1.1.7)
Owner
Fedy
Fedy
🔌 A Doctrine DBAL Driver implementation on top of Swoole Coroutine PostgreSQL extension

Swoole Coroutine PostgreSQL Doctrine DBAL Driver A Doctrine\DBAL\Driver implementation on top of Swoole\Coroutine\PostgreSQL. Getting started Install

Leo Cavalcante 19 Nov 25, 2022
A Redis based, fully automated and scalable database cache layer for Laravel

Lada Cache A Redis based, fully automated and scalable database cache layer for Laravel Contributors wanted! Have a look at the open issues and send m

Matt 501 Dec 30, 2022
Async Redis client implementation, built on top of ReactPHP.

clue/reactphp-redis Async Redis client implementation, built on top of ReactPHP. Redis is an open source, advanced, in-memory key-value database. It o

Christian Lück 240 Dec 20, 2022
a distributed-redis-lock implementation for hyperf2.*

hyperf-redis-lock English | 中文 an easy redis-based distributed-lock implementation for hyperf 2.*。 This extension features distributed-lock includes b

lysice 11 Nov 8, 2022
A Redis bundle for Symfony supporting Predis and PhpRedis

RedisBundle About This bundle integrates Predis and PhpRedis into your Symfony 3.4+ application, providing a fast and convenient interface to Redis. U

Henrik Westphal 1k Dec 22, 2022
This is raw connection between redis server and django python app

Django_Redis This repository contains the code for this blogpost. Running the Application Clone the repository git clone https://github.com/xxl4tomxu9

Tom Xu 1 Sep 15, 2022
Dockerized PHP development stack: Nginx, MySQL, MongoDB, PHP-FPM, HHVM, Memcached, Redis, Elasticsearch and RabbitMQ

PHP Dockerized Dockerized PHP development stack: Nginx, MySQL, MongoDB, PHP-FPM, HHVM, Memcached, Redis, Elasticsearch and RabbitMQ PHP Dockerized giv

Kasper Isager Dalsgarð 1.1k Dec 30, 2022
:gem: Simple MySQLi Abstraction Layer + Doctrine/DBAL support

?? Simple MySQLi Class This is a simple MySQL Abstraction Layer compatible with PHP 7+ that provides a simple and secure interaction with your databas

Lars Moelleken 40 Sep 5, 2022
🔌 A Doctrine DBAL Driver implementation on top of Swoole Coroutine PostgreSQL extension

Swoole Coroutine PostgreSQL Doctrine DBAL Driver A Doctrine\DBAL\Driver implementation on top of Swoole\Coroutine\PostgreSQL. Getting started Install

Leo Cavalcante 19 Nov 25, 2022
Symprowire is a PHP MVC Framework based and built on Symfony, using the ProcessWire CMS as DBAL and Service Provider.

Symprowire - PHP MVC Framework for ProcessWire 3.x Symprowire is a PHP MVC Framework based and built on Symfony using ProcessWire 3.x as DBAL and Serv

Luis Mendez 7 Jan 16, 2022