ipunkt/laravel-rabbitmq

此包已被废弃且不再维护。作者建议使用 enqueue/enqueue 包。

这是一个为 Laravel 服务的入门包

0.3.0 2018-04-16 15:01 UTC

This package is auto-updated.

Last update: 2022-02-01 13:11:05 UTC


README

此包已被废弃。请考虑切换到使用其 Laravel 实现的 enqueue:https://github.com/php-enqueue/enqueue-dev/blob/master/docs/laravel/quick_tour.md

RabbitMQ for Laravel

我们提供了一个单独的包用于 RabbitMQ 的使用,因为我们想用它在任何语言的微服务之间进行通信。现有的包绑定到 Laravel,所以我们有整个数据——包括类名等——都在消息体中。我们的包只通过 RabbitMQ 发送原始数据。

Latest Stable Version Latest Unstable Version License Total Downloads

此包提供了发送部分以及监听部分。发送部分将消息同步发送到消息队列。监听器将路由键映射到配置的事件监听器。

分支信息

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返回truefalse来完成的。返回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日志记录器。