Как использовать несколько экземпляров SQS (службы очередей) в Lumen?

#php #laravel #lumen

#php #laravel #lumen

Вопрос:

Я хотел отправлять сообщения в несколько очередей SQS параллельно или одно за другим, но это должно быть динамичным, и когда я запускаю worker, он должен извлекать сообщения из обеих очередей и дифференцировать.
Как я могу добиться этого в Lumen?
Обновить
Как использовать несколько worker для разных очередей с разными экземплярами amazon SQS?

Ответ №1:

Насколько я вижу, Lumen и Laravel используют один и тот же код для обработки очередей, так что вот кое-что, что может сработать, хотя я это не тестировал.

Запустите queue worker как:

  php artisan queue:work --queue=queue1,queue2 
  

Это будет означать, что задания в очереди 1 обрабатываются раньше заданий в очереди 2 (к сожалению, это единственный способ прослушивания нескольких очередей)

Затем в вашей работе:

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


   public function handle()
   {
       if ($this->job->getQueue() === 'queue1') {
          //Things
       } else {
          // different things
       }
   }
  

Если вам нужно использовать несколько подключений, вы не можете сделать это с помощью одного рабочего, однако вы можете использовать несколько рабочих одновременно. Сначала настройте свои подключения, например, в вашем config/queue.php

 'connections' => [
      'sqs' => [
        'driver' => 'sqs',
        'key' => 'your-public-key',
        'secret' => 'your-secret-key',
        'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
        'queue' => 'your-queue-name',
        'region' => 'us-east-1',
    ],
    'sqs2' => [
        'driver' => 'sqs',
        'key' => 'your-other-public-key',
        'secret' => 'your-other-secret-key',
        'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-other-account-id',
        'queue' => 'your-other-queue-name',
        'region' => 'us-east-1',
    ],
]
  

Если вы используете supervisor, настройте свою конфигурацию supervisor, если нет, вам придется запускать оба workers вручную. Вот конфигурация супервизора, которую вы можете использовать:

 [program:laravel-sqs-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --queue=queue1
autostart=true
autorestart=true
user=www-data 
numprocs=1
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

[program:laravel-sqs2-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs2 --queue=queue2
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
  

Измените пути и пользовательские настройки в соответствии с вашим приложением.

Комментарии:

1. На самом деле я хотел прослушать разные очереди из разных учетных записей Amazon, как я могу этого добиться?

2. Насколько я вижу, у одного работника нет возможности прослушивать несколько «подключений». Для этого вам следует запустить несколько workers.

3. Как использовать несколько worker одновременно, с разными URL очереди для SQS?

4. Хорошо, сначала настройте каждое соединение в вашей конфигурации (например, назовите их sqs1, sqs2), если вы используете supervisor (что я бы рекомендовал), ознакомьтесь с конфигурацией supervisor эта конфигурация предназначена для одного рабочего, но у вас может быть несколько конфигураций suck в файле конфигурации, поэтому на практике запускайте несколько рабочих

5. Спасибо вам за это, я проверю это. Пожалуйста, обновите свой ответ. 😉