kastilyo/rabbit-hole

RabbitHole RabbitMQ 库

v0.0.2 2017-04-12 02:45 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:00:08 UTC


README

Code Climate

Test Coverage

这是一个深受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)。有关更多信息,请参阅许可证文件