adamhutchison/laravel-mq-manager

此包已被放弃且不再维护。未建议替代包。

laravel中用于跨微服务消息传递的MQ Manager

1.0.1 2019-12-09 19:32 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 启动和监控(与队列工作者相同的方式),以便从不同的微服务中检测模型事件。