kastilyo / rabbit-hole
RabbitHole RabbitMQ 库
Requires
- php: >=5.6.0
- calcinai/php-amqplib-bridge: ^0.1.1
Requires (Dev)
- codeclimate/php-test-reporter: ^0.2.0
- eloquent/liberator: ^2.0
- kahlan/kahlan: ^3.1
- psy/psysh: ^0.5.2
- rdlowrey/auryn: ^1.1
This package is not auto-updated.
Last update: 2024-09-28 18:00:08 UTC
README
这是一个深受Hutch(https://github.com/gocardless/hutch)启发的RabbitMQ库。到目前为止,我仅实现了基本的订阅机制。我计划通过提供批量处理支持来扩展它。我还计划添加发布机制,然后是RPC模式的支持。最后,我还想添加运行机制,即管理和运行具有不同配置的多个订阅者,这可能是最具挑战性的,此时可能会被认为是非常实验性的,甚至可能是对PHP的滥用和误用,因为PHP通常不打算用于此类操作。
RabbitHole提供了从RabbitMQ交换中消费消息的机制,而不需要使用低级别的样板代码。为此所做的权衡是,这个库在如何使用RabbitMQ方面做出了一些假设。
- RabbitHole订阅者创建的交换是持久性主题交换。
- 同样,RabbitHole订阅者创建的队列也将是持久的。
因此,RabbitHole旨在为希望最小化数据丢失的用户而设计。
用法
使用RabbitHole制作的订阅者类必须实现SubscriberInterface并使用SubscriberTrait。它必须将$amqp_connection
属性设置为AMQPConnection实例。最后,它必须确认其processMessage
实现处理的消息。
以下是一个示例订阅者实现,直接来自测试源。
namespace Kastilyo\RabbitHole\Spec; use AMQPConnection; use AMQPEnvelope; use Kastilyo\RabbitHole\Subscriber\SubscriberTrait; use Kastilyo\RabbitHole\Subscriber\SubscriberInterface; /** * This is a test SubscriberInterface implementation that mixes in SubscriberTrait. * It represents the intended use of this library. */ class Subscriber implements SubscriberInterface { use SubscriberTrait; public function __construct(AMQPConnection $amqp_connection) { $this->setAMQPConnection($amqp_connection); } public function getExchangeName() { return 'test_exchange'; } public function getQueueName() { return 'test_queue'; } public function getBindingKeys() { return ['test.info']; } public function processMessage(AMQPEnvelope $amqp_envelope) { echo $amqp_envelope->getBody(), PHP_EOL; $this->acknowledgeMessage($amqp_envelope); } }
这个类通过构造函数注入获取一个AMQPConnection
实例,并通过SubscriberTrait
提供的setAMQPConnection
方法设置其$amqp_connection
属性。
这个类实现了SubscriberInterface
,它包括几个静态获取方法。
getExchangeName
应返回要声明的持久性主题交换的名称。这个类将要声明的交换名称是'test_exchange'。
getQueueName
应返回要声明的持久性队列的名称。这个类将要从'test_queue'读取。
getBindingKeys
应返回一个数组,其中包含可能包含'*'或'#'通配符的路由键。这个类仅绑定'test.info'到队列。
SubscriberInterface
的一部分是processMessage
实例方法,它是队列中消息的回调。此实现简单地将消息体打印到带有换行符的行中,然后确认消息。
要实际消费消息,必须在Subscriber
实例上调用由SubscriberTrait
提供的consume
方法。它将声明交换和队列,并开始根据上述内容消费消息。
$amqp_connection = new AMQPConnection([ 'host' => 'localhost', 'port' => 5672, 'login' => 'guest', 'password' => 'guest', ]); $subscriber = new Kastilyo\RabbitHole\Spec\Subscriber($amqp_connection); $subscriber->consume();
如果您有Docker并且想测试这个库,可以克隆此仓库,并使用composer install
安装所有依赖项,包括开发依赖项。
运行docker run -d -p 15672:15672 -p 5672:5672 rabbitmq:3-management
,这将运行一个带有管理器安装的RabbitMQ Docker容器,使用默认凭据'guest'/'guest',将端口15672和5672转发到后台。管理器Web界面应可通过localhost:15672访问,并且主机机器上运行的所有服务都应能够通过localhost:5672与容器接口。
开始终端会话,然后从项目根目录运行php dev/consumer.php
,这将等待从队列中传入的消息。
从RabbitMQ管理插件Web界面来看,应该存在一个名为'test_exchange'的交换机和名为'test_queue'的队列,该队列通过路由键'test.info'与之绑定。
在交换机面板中,选择'test_exchange',并使用路由键'test.info'以及一些可识别的内容发布一条消息。
运行php dev/consumer.php
的终端会话应产生已发布的消息中的内容。管理界面中的图表也应指示已发布、消费和确认了一条消息。
将来,我将在dev目录中添加一个Dockerfile,以便将仓库本身部署到容器中运行。
依赖项
PHP >= 5.6.0
这个库是使用calcinai/php-amqplib-bridge包构建的,以便与videlalvaro/php-amqplib包和PECL AMQP扩展兼容。然而,我从未亲自运行过任何带有PECL扩展的代码,无法确认其是否工作,但从理论上讲,它应该可以工作。
样式和命名约定
关于编码风格,我尽量遵循PSR编码风格指南。在命名约定方面,我在任何特质后加上'Trait',在接口后加上'Interface'。'src'目录中的任何其他文件都应该是类。我还使用了下划线命名变量和属性,以便于从方法中区分它们。没有函数,但如果有的话,我也会用下划线命名它们。
测试
我使用了神奇的kahlan测试框架。
$ ./vendor/bin/kahlan
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。