【问题标题】:Laravel transient queues and messagesLaravel 瞬态队列和消息
【发布时间】:2019-12-22 18:50:07
【问题描述】:

我正在使用 rabbitmq 为带有 package 的消息队列开发 Laravel 5.1.46 (LTS)

.env

QUEUE_DRIVER=rabbitmq

config/queue.php

'rabbitmq' => [
        'driver' => 'rabbitmq',

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

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

        // name of the default queue,
        'queue' => env('RABBITMQ_QUEUE'),

        // create the exchange if not exists
        'exchange_declare' => true,

        // create the queue if not exists and bind to the exchange
        'queue_declare_bind' => true,

        'queue_params' => [
            'passive' => false,
            'durable' => true,  // false
            'exclusive' => false,
            'auto_delete' => false,
        ],

        'exchange_params' => [

            // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
            'type' => env('RABBITMQ_EXCHANGE_TYPE', 'direct'),

            'passive' => false,

            // the exchange will survive server restarts
            'durable' => true,  // fakse

            'auto_delete' => false,
        ]

我总共有 8 个队列。队列名称存储在 .env 文件中。

QUEUE_ONE=queue-one
QUEUE_TWO=queue-two
.
.
.
QUEUE_EIGHT=queue-eight

在派遣工作时,

dispatch(new Job1())->onQueue(env('QUEUE_ONE'))

队列和消息是持久的/持久的。

由于一些性能问题,我需要更改一些队列及其消息的持久性。所以,

  • 5 个队列及其消息将是瞬态的(非持久性的)
  • 3 个队列及其消息将是持久的

如何在 Laravel 和 rabbitmq 中实现?

注意: 我知道,我可以设置

durable = false

但它适用于所有队列,

【问题讨论】:

  • 您共享的配置只定义了 1 个队列。
  • 队列名称存储在 .env 文件中
  • .env文件中的队列是怎么存储的,能举个例子吗?你是如何在它们之间切换的?
  • @Reduxx 更新了我的问题。请检查

标签: laravel rabbitmq queue message-queue


【解决方案1】:
// config/queue.php
'rabbitmq_durable' => [
    'driver' => 'rabbitmq',
    // ...
    'queue_params' => [
        'passive' => false,
        'durable' => true,
        'exclusive' => false,
        'auto_delete' => false,
    ],
    // ...
],
'rabbitmq_not_durable' => [
    'driver' => 'rabbitmq',
    // ...
    'queue_params' => [
        'passive' => false,
        'durable' => false,
        'exclusive' => false,
        'auto_delete' => false,
    ],
    // ...
]

Laravel 5.1

要在 Laravel 5.1 上使用不同的配置和不同的连接,你必须使用 Queue fascade:

Queue::connection('rabbitmq_durable')->pushOn('queue_1', TestJob::class);
Queue::connection('rabbitmq_not_durable')->pushOn('queue_6', TestJob::class);

Laravel 5.2+

要在 Laravel 5.2 及更高版本上使用不同的配置和不同的连接,您可以使用 onConnection() 方法,如下所示:

TestJob::dispatch()->onQueue('queue_one')->onConnection('rabbitmq_durable');
TestJob::dispatch()->onQueue('queue_six')->onConnection('rabbitmq_not_durable');

【讨论】:

  • 我不确定这是否可行,因为我们在 config/queue.php 中只有一个“rabbitmq”键。此外,框架将如何了解“rabbitmq” i.q “rabbitmq_queue_1”、“rabbitmq_queue_2”以外的连接
  • 你需要添加额外的键,laravel 会自动查看每个键并搜索 'queue' 并根据找到的队列决定使用哪个连接。如果找不到,会回退到默认连接
  • 你的意思是 laravel 在我们的例子中搜索 'queue' 即 'queue' => env('QUEUE_ONE') 并且在这个队列上调度一个 jon 时它将使用 rabbitmq_queue_1 连接?
  • 是的,这就是我的意思:)
  • 你试过了吗?在我这边没用,再次创建了持久队列
猜你喜欢
  • 2022-10-26
  • 2015-11-06
  • 2011-08-06
  • 2013-05-16
  • 2010-10-21
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多