laravel6使用RabbitMQ作为消息中间件

安装amqp扩展

确保已安装rabbitmq-c-dev。我是alpine镜像下的使用apk add rabbmit-c-dev安装

cd ~
wget http://pecl.php.net/get/amqp-1.10.2.tgz
tar -zxf amqp-1.10.2.tgz
cd amqp-1.10.2
phpize
./configure
make && make install
cd ~
rm -rf amqp-1.10.2*

重启php,php -m查看是否成功安装amqp。

laravel安装vladimir-yuldashev/laravel-queue-rabbitmq

vladimir-yuldashev/laravel-queue-rabbitmq选择对应laravel的版本进行安装

安装vladimir-yuldashev/laravel-queue-rabbitmq

composer require vladimir-yuldashev/laravel-queue-rabbitmq

这里需确保所有的依赖已安装。查看地址

修改config/queue.php文件在connections中追加

    'rabbitmq' => [

       'driver' => 'rabbitmq',
       'queue' => env('RABBITMQ_QUEUE', 'default'),
       'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class,

       'hosts' => [
           [
               'host' => env('RABBITMQ_HOST', '127.0.0.1'),
               'port' => env('RABBITMQ_PORT', 5672),
               'user' => env('RABBITMQ_USER', 'guest'),
               'password' => env('RABBITMQ_PASSWORD', 'guest'),
               'vhost' => env('RABBITMQ_VHOST', '/'),
           ],
       ],

       'options' => [
           'ssl_options' => [
               '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),
           ],
       ],

       /*
        * Set to "horizon" if you wish to use Laravel Horizon.
        */
       'worker' => env('RABBITMQ_WORKER', 'default'),

    ],

编写示例

mysql准备user表只有,user_id,user_name

创建任务类php artisan make:job Queue

<?php

namespace App\Jobs;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class Queue implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        sleep(2);
        $user = new User();
        $user->insert(['user_name' => rand(100000, 999999)]);
        print_r('success');
    }
}

创建控制器php artisan make:controller Queue。添加index方法

<?php

namespace App\Http\Controllers;

use App\Jobs\Queue as JobsQueue;
use Illuminate\Http\Request;

class Queue extends Controller
{
    /**
     * 使用队列插入数据
     *
     * @return string
     */
    public function index(Request $request)
    {
        $this->dispatch(new JobsQueue($request));
        return 'success';
    }

    /**
     * 直接插入数据
     *
     * @return string
     */
    public function insert()
    {
        sleep(2);
        $user = new User();
        $user->insert(['user_name' => rand(100000, 999999)]);
        return 'success';
    }
}

添加api路由

Route::get('queue', 'Queue@index');
Route::get('index', 'Queue@insert');

执行命令进行消费php artisan queue:work。访问http://base6.com/api/queue

/var/www/html/blog6 # php artisan queue:work rabbitmq
[2020-05-24 08:55:40][Sx4qYuD8jtTWmEB1IIkPJEviWliUIlNr] Processing: App\Jobs\Queue
sucess[2020-05-24 08:55:43][Sx4qYuD8jtTWmEB1IIkPJEviWliUIlNr] Processed:  App\Jobs\Queue

使用ab测试50请求10并发下的表现

➜  php ab -n50 -c10  http://base6.com/api/index
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking base6.com (be patient).....done


Server Software:        nginx/1.16.0
Server Hostname:        base6.com
Server Port:            80

Document Path:          /api/index
Document Length:        1552 bytes

Concurrency Level:      10
Time taken for tests:   65.539 seconds
Complete requests:      50
Failed requests:        0
Non-2xx responses:      50
Total transferred:      87750 bytes
HTML transferred:       77600 bytes
Requests per second:    0.76 [#/sec] (mean)
Time per request:       13107.809 [ms] (mean)
Time per request:       1310.781 [ms] (mean, across all concurrent requests)
Transfer rate:          1.31 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:  1524 12221 3036.0  12793   16753
Waiting:     1513 12219 3036.6  12792   16752
Total:       1524 12221 3036.0  12793   16753

Percentage of the requests served within a certain time (ms)
  50%  12793
  66%  13870
  75%  14549
  80%  14649
  90%  15053
  95%  15838
  98%  16753
  99%  16753
 100%  16753 (longest request)

➜  php ab -n50 -c10  http://base6.com/api/insert
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking base6.com (be patient).....done


Server Software:        nginx/1.16.0
Server Hostname:        base6.com
Server Port:            80

Document Path:          /api/insert
Document Length:        7 bytes

Concurrency Level:      10
Time taken for tests:   84.344 seconds
Complete requests:      50
Failed requests:        0
Total transferred:      14550 bytes
HTML transferred:       350 bytes
Requests per second:    0.59 [#/sec] (mean)
Time per request:       16868.876 [ms] (mean)
Time per request:       1686.888 [ms] (mean, across all concurrent requests)
Transfer rate:          0.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:  3929 14874 3234.5  16209   17922
Waiting:     3916 14873 3235.3  16208   17921
Total:       3929 14874 3234.4  16210   17922

Percentage of the requests served within a certain time (ms)
  50%  16210
  66%  16522
  75%  16762
  80%  17010
  90%  17692
  95%  17772
  98%  17922
  99%  17922
 100%  17922 (longest request)

因为本机配置有限。直接操作和使用队列都增加2秒的延迟,用于比交队列的使用效果

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容