从零开始搭建聊天系统之MQ队列与Horizon托管方案

2019-03-21  本文已影响0人  隔岸坐看云卷云舒

必备条件:
1.lumen5.5+版本,低于5.5或者等于5.5会出现问题
2.已经安装好了RabbitMQ,如没有安装请翻阅的本博客的安装RabbitMQ文章
3.已经安装了composer

第一步:
安装依赖与发布资源

composer require vladimir-yuldashev/laravel-queue-rabbitmq
composer require  kinsolee/horizon-lumen
composer require  noitran/lumen-horizon-rabbitmq
composer require laravelista/lumen-vendor-publish
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

第二步:
修改引导文件

$app->register(\Laravel\Horizon\HorizonServiceProvider::class);
$app->register(Noitran\Lumen\Horizon\HorizonServiceProvider::class);
$app->register(VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class);

第三步
修改config/queue.php文件

'rabbitmq' => [

            'driver' => 'rabbitmq',

            'dsn' => env('RABBITMQ_DSN', null),


            'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class,

            'host' => env('RABBITMQ_HOST', '127.0.0.1'),
            'port' => env('RABBITMQ_PORT', 5672),

            'vhost' => env('RABBITMQ_VHOST', '/'),
            'login' => env('RABBITMQ_LOGIN', 'smj227227'),
            'password' => env('RABBITMQ_PASSWORD', '227227'),

            'queue' => env('RABBITMQ_QUEUE', 'default'),

            'options' => [

                'exchange' => [

                    'name' => env('RABBITMQ_EXCHANGE_NAME'),
                    'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),
                    'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_DIRECT),
                    'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
                    'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),
                    'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
                    'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'),
                ],

                'queue' => [

                    'declare' => env('RABBITMQ_QUEUE_DECLARE', true),
                     'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true),

                    /*
                     * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
                     */

                    'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
                    'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
                    'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
                    'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
                    'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'),
                ],
            ],

            /*
             * Determine the number of seconds to sleep if there's an error communicating with rabbitmq
             * If set to false, it'll throw an exception rather than doing the sleep for X seconds.
             */

            'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5),

            /*
             * Optional SSL params if an SSL connection is used
             * Using an SSL connection will also require to configure your RabbitMQ to enable SSL. More details can be founds here: https://www.rabbitmq.com/ssl.html
             */

            'ssl_params' => [
                'ssl_on' => env('RABBITMQ_SSL', false),
                'cafile' => env('RABBITMQ_SSL_CAFILE', null),
                'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
                'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
                'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
                'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
            ],

        ],

第四步:
测试发布消息

<?php
/*
 *author:shumingjian
 *time 2019/3/18 5:05 PM
 *All rights reserved
*/


namespace App\Http\Controllers\Mq\RabbitMQ;


use App\Http\Controllers\Controller;
use App\Jobs\Msg;
use App\Jobs\RabbitMQJob;


class MsgController extends Controller
{
 public function test(){
     for ($i=0;$i<=1000000;$i++){
         $json = json_encode(['a'=>$i]);
         $json1 = json_encode(['a'=>'abc'.$i]);
         //\Amqp::publish('test',$json,['queue'=>'test123']);
         dispatch(new Msg($json))->onQueue('default');
         //dispatch(new RabbitMQJob($json1))->onQueue('bbb');
     }
 }
}

第六步:
作为customer,我们必须需要消费
创建Job文件

<?php
/*
    *author:shumingjian
    *time 2019/3/21 1:31 PM
    *All rights reserved
*/


namespace App\Jobs;


class Msg extends Job
{
    public $data ;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function handle(){
        $data = json_decode($this->data,true);
        print_r($data);
    }
}

第七步:
启动Horizon,执行命令

php artisan  horizon

结果应该如图所示:


WechatIMG366.jpeg
上一篇下一篇

猜你喜欢

热点阅读