ipunkt / laravel-rabbitmq
Requires
- php: >=7.0.0
- illuminate/console: ^5.5
- illuminate/support: ^5.5
- php-amqplib/php-amqplib: ^2.6
Requires (Dev)
- laravel/framework: 5.5.*
- monolog/monolog: ^1.23
- phpunit/phpunit: ^7.0
README
此包已被废弃。请考虑切换到使用其 Laravel 实现的 enqueue:https://github.com/php-enqueue/enqueue-dev/blob/master/docs/laravel/quick_tour.md
RabbitMQ for Laravel
我们提供了一个单独的包用于 RabbitMQ 的使用,因为我们想用它在任何语言的微服务之间进行通信。现有的包绑定到 Laravel,所以我们有整个数据——包括类名等——都在消息体中。我们的包只通过 RabbitMQ 发送原始数据。
此包提供了发送部分以及监听部分。发送部分将消息同步发送到消息队列。监听器将路由键映射到配置的事件监听器。
分支信息
master 分支目前适用于 Laravel 5.6+。使用 5.4
分支适用于 Laravel <= 5.5。这是必要的,因为 Laravel 5.6 修改了日志接口。
快速开始
composer require ipunkt/laravel-rabbitmq
我们支持 Laravel 的包自动发现,因此您可以使用此包。
安装
在 composer.json 中添加以下行
"require": {
"ipunkt/laravel-rabbitmq": "*"
}
您可以通过输入 php artisan vendor:publish
并选择包提供者(或提供的标签之一)来发布所有提供的文件(但请注意,标签是全局的)。
配置
在 config/laravel-rabbitmq.php
中是 RabbitMQ 上可用队列的配置。我们不使用在 Laravel 中预装的 config/queues.php
中配置的任何值。
'YOUR-QUEUE-IDENTIFIER' => [ 'host' => 'YOUR-RABBITMQ-HOST', 'port' => 5672, 'user' => 'guest', 'password' => 'guest', 'name' => '', 'durable' => false, 'exchange' => [ 'exchange' => 'YOUR-EXCHANGE-NAME', 'type' => 'YOUR-EXCHANGE-TYPE', 'passive' => false, 'durable' => false, 'auto_delete' => false, 'internal' => false, 'nowait' => false, 'arguments' => null, 'ticket' => null, ], 'bindings' => [ // key => event name // ROUTING-KEY maps to an LARAVEL-EVENT-CLASS-NAME ], ], 'logging' => [ 'enable' => false, /** * Set this to false if you do not wish to log Exceptions or Throwables from `rabbitmq:listen` */ 'event-errors' => true, 'queue-identifier' => 'default', 'extra-context' => [], ],
使用
发布消息
在您的控制器或控制台命令中,您需要我们的 RabbitMQ
类实例
$rabbitMQ = new \Ipunkt\LaravelRabbitMQ\RabbitMQ();// or from DI container $rabbitMQ->onQueue('YOUR-QUEUE-IDENTIFIER') // Queue Identifier has to be configured within the laravel-rabbitmq.php ->data(['users' => $users]) // anything, gets json_encoded ->publish('ROUTING-KEY'); // publish to a routing key, the listener is subscribed to
订阅消息
对于订阅,我们提供了一个 artisan 命令
php artisan rabbitmq:listen YOUR-QUEUE-IDENTIFIER
我们建议消息发送者创建交换机。如果您反过来操作,监听器也可以创建交换机。您需要向 rabbitmq:listen
命令添加命令标志 --declare-exchange
。
在配置中,bindings
配置了路由键,它们与 Laravel 事件(使用 php artisan make:event ...
创建)进行了 1:1 映射。此事件将消息数据作为构造函数参数。
然后您可以在 EventListener 中定义一个或多个监听器(使用 php artisan make:listen ...
创建)。然后,一切都会顺利工作。
我们建议使用带有supervisor支持容器的rabbitmq:listen
命令,例如laravel附带queue:work命令。
在事件数据中接收路由键
如果使用了带有占位符的绑定,则可能需要解析路由键。
要接收触发事件的Event的路由键,请实现与您的Event一起使用的Ipunkt\LaravelRabbitMQ\TakesRoutingKey
。
要接收与触发事件的路线键匹配的事件绑定中占位符的值,请实现Ipunkt\LaravelRabbitMQ\TakesRoutingMatches
持久化消息
将队列的durable
设置为true会导致队列被创建为持久化。这意味着当rabbitmq:listen
未运行时,它将继续存在并接收消息。为了利用这一事实,name
也应设置为标识微服务的字符串。这将导致队列被命名而不是匿名,运行rabbitmq:listen
实际上会重新连接到队列并处理它接收的所有消息。
设置durable
还启用了消息的消费者确认。这意味着只有确认后,消息才会从队列中删除。这目前是通过从EventHandler返回true
或false
来完成的。返回true
确认消息已完成
返回false
确认消息未处理但不会影响此服务,因此仍然删除。返回任何其他内容,包括默认的null
或抛出异常,都不会确认消息,并将其返回到队列中。
注意RabbitMQ关于此持久化模式的说明
关于消息持久化的说明
将消息标记为持久化并不能完全保证消息不会丢失。尽管它告诉RabbitMQ将消息保存到磁盘,但仍然有一个很短的时间窗口,在这个时间窗口内,RabbitMQ已接受消息但尚未将其保存。此外,RabbitMQ不会为每个消息执行fsync(2) – 它可能只是保存到缓存而没有真正写入磁盘。持久化保证并不强,但对我们简单的任务队列来说已经足够了。如果您需要更强的保证,则可以使用发布者确认。
日志记录
如果日志设置为true,则将在laravel monolog实例中添加一个MessageHandler,该Handler将消息发送到指定的交换机。如果设置了extra-context
,则内容将添加到每条消息的上下文中。此用例是将'service' => 'currentmicroservice'
信息添加到所有消息中,以标识消息来自哪个服务。除非event-errors
设置为false,否则在rabbitmq:listen
中捕获的异常或Throwables将转发到laravel日志记录器。