adamhutchison / laravel-mq-manager
laravel中用于跨微服务消息传递的MQ Manager
Requires
- php-amqplib/php-amqplib: ^2.10
Requires (Dev)
- laravel/framework: ^6.5
This package is auto-updated.
Last update: 2023-02-02 09:40:55 UTC
README
消息队列管理器(MQ Manager)是一个包,允许基于laravel框架构建的微服务异步发送跨服务消息。
默认情况下,MQ Manager使用以下连接凭据使用RabbitMQ作为消息代理
host:localhost
port:5672
username:guest
password:guest
可以通过以下环境值手动设置
-
MQ_MANAGER_HOST
-
MQ_MANAGER_PORT
-
MQ_MANAGER_USERNAME
-
MQ_MANAGER_PASSWORD
安装
可以使用composer安装此包
composer require adamhutchison/laravel-mq-manager
然后运行以下命令
php artisan mq-manager:install
这将发布mqmanager.php
配置文件到应用的配置文件夹
然后在应用的.env
文件中设置以下环境变量
-
MQ_MANAGER_QUEUE
- 定义您希望消息发布的默认队列,默认为queue
-
MQ_MANAGER_SERVICE
- 指定您希望用于驱动跨服务消息传递的MQ服务驱动程序,该包使用rabbitmq
,我们打算未来添加ActiveMQ。
基本用法
发送消息
默认情况下,MQ Manager将尝试将消息发送到在MQ_MANAGER_QUEUE
环境变量中定义的队列,但是您也可以将自定义队列名称作为第二个参数传递给MQManager
类上的sendMessage()
方法。
重要的是要知道MQManager
类是一个单例,应该使用Laravel的服务容器来解析,而不是使用new运算符
基本示例
// Sends message 'Hello world to the queue deined by MQ_MANAGER_QUEUE env value app(MQManager::class)->sendMessage('Hello World'); // Sends message to a custom queue app(MQManager::class)->sendMessage('Hello World', 'some_custom_queue');
接收消息
您可以使用MQManager
类上的listen()
方法监听由其他服务发送的消息。默认情况下,MQ Manager将监听由MQManager
类上的registerQueueListener()
方法注册的队列发送的消息。此方法期望两个参数,第一个是队列的名称,第二个是消息将被传递到的闭包。
app(MQManager::class)->registerQueueListener('test_queue', function($message){ echo $message->getBody(); });
您也可以将自定义队列和闭包传递给listen方法。在这种情况下,仅监听发送到指定队列的消息,将忽略在mqmanager.php
配置中订阅的所有队列。
基本示例
// Listen for messages on queues defined in mqconfig.subscribed_queues array app(MQManager::class)->listen(); // listen for messages sent to a custom queue and handle using a callback app(MQManager::class)->listen('custom_queue', function($message){ echo $message->body; });
为模型事件自动发送消息
MQ Manager包括允许在模型创建、更新或删除时自动发送消息的功能。只需将MQManager\Events\ModelTraits\SendsMQMessages
添加到任何希望广播消息的模型中。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use MQManager\ModelTraits\ModelTraits\SendsMQMessages; class Job extends Model { use SendsMQMessages; }
MQ Messenger将向在.env文件中定义的队列发送以下格式的消息
{ "event_type": "created", "model": "App\\SomeModel", "data": { "id": 1, "model_field_1": "value", "some_other_model_field": "value2" } }
监听模型事件
MQ 管理器提供了以下 artisan 命令用于监听模型事件:php artisan mq-manager:listen
。这个 artisan 命令可以通过 supervisor 启动和监控(与队列工作者相同的方式),以便从不同的微服务中检测模型事件。