6.7 KiB
Queue Interoperability
About
queue-interop tries to identify and standardize a common way for PHP programs to create, send, receive and read MQ messages to achieve interoperability.
Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
If PHP projects that provide queue implementations begin to adopt these common standards, then PHP applications and projects that use MQs can depend on the common interfaces instead of specific implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume any MQ transport implementation that can be adapted to these interfaces.
The work done in this project is not officially endorsed by the PHP-FIG. We adhere to the spirit and ideals of PHP-FIG, and hope this project will pave the way for one or more future PSRs.
Roadmap
The Queue Interop project started in the summer of 2016, almost two years ago. Since then It has been well-tried by many developers. A lot of companies use it in production.
It is time to settle a date of a stable release and possibly some intermediate steps towards it:
- The 1.0 will be released in December 2018.
- The 1.0-beta1 will be released in August 2018.
- The 1.0-alpha1 will be released in March 2018.
Installation
You can install this package through Composer:
# Install a Queue Interop compatible transport, for example
$ composer require enqueue/fs
Examples
Send a message:
<?php
use Enqueue\Fs\FsConnectionFactory;
$context = (new FsConnectionFactory())->createContext();
$context->createProducer()->send(
$context->createQueue('aQueue'),
$context->createMessage('aBody')
);
Consume a message:
<?php
use Enqueue\Fs\FsConnectionFactory;
$context = (new FsConnectionFactory())->createContext();
$consumer = $consumer->createConsumer($context->createQueue('aQueue'));
$timeout = 5000; // 5sec
if ($message = $consumer->receive($timeout)) {
// process the message.
$consumer->acknowledge($message);
}
Find out more here:
- Enqueue transport docs contains a lot how to use example.
- Formapro's Blog contains varitety blog post about Queue Interop useage.
- RabbitMQ's official tutorials ported to AMQP Interop.
Compatible projects
Projects
- Enqueue
- Swarrot
- Bernard
- vladimir-yuldashev/laravel-queue-rabbitmq
- sonata-project/notification-bundle
- yiisoft/yii2-queue
Implementations
- enqueue/amqp-ext
- enqueue/amqp-lib
- enqueue/amqp-bunny
- makasim/rabbitmq-cli-consumer-client
- enqueue/pheanstalk
- enqueue/stomp
- Amazon SQS enqueue/sqs
- Google PubSub enqueue/gps
- enqueue/rdkafka
- enqueue/redis
- enqueue/mongodb
- enqueue/gearman
- enqueue/dbal
- enqueue/fs
- enqueue/null
- enqueue/wamp
- makasim/php-fpm-queue
- assoconnect/enqueue-azure
Amqp interop
There is AMQP interop built on top of Queue Interop. It is completly compatible with queue interop and only adds some AMQP specific features:
- Queue\Exchange declaration
- Queue\Exchange Binding.
- Basic consume support.
- and other AMQP specific features.
Compatible projects
Workflow
Everyone is welcome to join and contribute.
The general workflow looks like this:
- Someone opens a discussion (GitHub issue) to suggest an interface
- Feedback is gathered
- The interface is added to a development branch
- We release alpha versions so that the interface can be experimented with
- Discussions and edits ensue until the interface is deemed stable by a general consensus
- A new minor version of the package is released
We try to not break BC by creating new interfaces instead of editing existing ones.
While we currently work on interfaces, we are open to anything that might help towards interoperability, may that be code, best practices, etc.