Laravel Rabbitmq курс. Брокеры сообщения php laravel. php-amqplib в php и laravel

Поделиться
HTML-код
  • Опубликовано: 26 июн 2024
  • Стань спонсором(бусти аккаунт), доступ к собеседованиям:
    boosty.to/laravelcreative
    Мои платные курсы:
    laravelcreative.ru/course
    План развития с нуля до middle+:
    laravelcreative.ru/other/plan
    Группа вк:
    laravelcreative
    СОДЕРЖАНИЕ
    00:00:00 Введение
    00:01:08 Создаем проекты, устанавливаем amqplib и делаем настройки
    00:09:30 Создаем publisher
    00:14:33 Создаем consumer
    00:18:00 Отправляем строку
    00:22:37 Отправляем строку через свой обменник с привязкой к очереди
    00:27:00 Отправляем массив
    00:29:30 Прописываем параметры подключения в .env
    00:32:43 Как в реальных проектах добавляют обменники, привязки и очереди

Комментарии • 47

  • @donlinoleum831
    @donlinoleum831 25 дней назад +1

    Ну это прям то, что доктор прописал! Спасибо за видео)

  • @disconnect3763
    @disconnect3763 Месяц назад +2

    Спасибо большое за видео. Очень интересно.

  • @cupuyc1989
    @cupuyc1989 28 дней назад +1

    Найс! Полезное видео :)

  • @palach_666
    @palach_666 6 месяцев назад +3

    Это самое лучшее что я видел, я посмотрел уроков 10 разных ничего никто нормально не объяснил.
    Тут и объяснили и пример показали, кароче топ, удачи в развитии канала
    Я подписан уже давно)

  • @user-xd8wr2lv4t
    @user-xd8wr2lv4t 7 месяцев назад +3

    Спасибо за видео!)

  • @dfkkg3453
    @dfkkg3453 9 месяцев назад +4

    Спасибо! Как всегда на высоте!

  • @dmitryvarnavskikh5648
    @dmitryvarnavskikh5648 Месяц назад +1

    Не нашёл похожих вопросов в комментариях
    Допустим у нас 50 эндпоинтов апи в приложении и мы хотим внедрить раббит для целостности данных.
    Каждый эндпоинт, очевидно, реализует разную логику обработки данных.
    1) Нам нужно для этого 50 очередей создать в раббите, которые будут висеть и ждать сообщений?
    2) И как избежать конфликт имен очередей, если нам нужно одинаковую логику обработки делать, только в другом микросервисе? Ставить префикс имени микросервиса в названии очереди? Например такие очереди: 'mic1.addUser', 'mic2.addUser'. Получается так?
    3) Создают ли новый обменник для каждого отдельного микросервиса, или все пихают в один?
    Интересно как на реальных проектах это работает ;)
    Спасибо)

  • @vimitali7630
    @vimitali7630 9 месяцев назад +1

    Огромное спасибо за продолжение! Очень вовремя!!! Даёшь продолжение :)

  • @andreysokolov2335
    @andreysokolov2335 8 месяцев назад +3

    Отличное видео (и первое по Rabbit тоже). Спасибо за труд
    Хочу только уточнить по данным из Конфига и Env - в вашем случае данные берутся именно из конфига, а не из ENV.
    Чтобы брались из ENV надо в конфиге прописать 'host' => env('RABBITMQ_HOST')

  • @user-cp8ou1ot5z
    @user-cp8ou1ot5z 9 месяцев назад +2

    Всё как всегда на высшем уровне! Единственное конечно, что не понятно, как запустить в супервизоре. погуглил, но так и не нашел.

    • @laravelcreative
      @laravelcreative  9 месяцев назад +1

      Благодарю:) Просто изучи тему supervisor как работает:) Там на 20 минут

  • @temka9719
    @temka9719 9 месяцев назад +2

    То, что надо!

  • @igorsss5810
    @igorsss5810 8 месяцев назад

    А я посмотрел ваше видео с базой по Rabbitmq, ну думаю - надо бы где-то почитать, как это в связке с Laravel должно работать, а сегодня захожу на главную канала, а там... мааать честная 🙂

  • @Andrew-cl8xb
    @Andrew-cl8xb 9 месяцев назад +1

    Thanks a lot! 🙏

  • @vxarlanchuk
    @vxarlanchuk 8 месяцев назад

    Ну просто гений на ютубере. Очень легко смотрится, все на наглядных примерах, кайф!
    Единственное, чего я не понял, это можно ли в реббит слать сообщения напрямую из javascript? (также, как мы это делаем в случае с REST, посредством ajax). Насколько я понял, он в основном предназначен для взаимодействия между серверными сервисами (backend to backend).

  • @user-sj6xz1mh3x
    @user-sj6xz1mh3x 8 месяцев назад

    Дякую!

  • @user-bf7di7dt7q
    @user-bf7di7dt7q 9 месяцев назад +1

    Предлагаю автору ввиду его неоспоримой крутости открыть свое рекрутинговое it агентство)
    Я правильно понимаю что если consumer должен будет отдать какой-либо ответ то нужно сделать аналогичное обратное подключение?
    Брокер может использоваться только для подконтрольных сервисов или и для сторонних вроде почты или облака, если может то по какому принципу?
    Для углубления знаний о микросервисах было бы здорово реализовать небольшой проект с такой архитектурой в связке с брокером, чтобы как было сказано в одном из видео «все по взрослому»)

    • @laravelcreative
      @laravelcreative  9 месяцев назад +1

      Благодарю:) Брокер просто передает данные по очереди. Иначе говоря, это такой же http запрос в rest api, но "в очереди". Поэтому передать мы можем данные и указать кто их будет брать. И уже у него можно прописать будет ли обращение на сторону или еще что. И отдает не консумер, а у него можно дернуть другую консолку, которая сделает публикацию "ответа". Иначе говоря, логику публикации лучше в консумер не прокидывать.

    • @user-bf7di7dt7q
      @user-bf7di7dt7q 9 месяцев назад

      @@laravelcreative
      Для паблишера используется именно формат консольной команды?
      Получается что команда consume выступает в роли единой точки входа в api? А как быть дальше если сервис с бд например или ресурсный, редирект внутри api сервиса? В сообщении тогда нужно прописывать uri параметры и обратный адрес и как быть с запросами помимо гет?
      надеюсь все таки будет продолжение по rabbit)
      Вообще тема асинхронности очень интересна и ее практическая часть почти не освещена в интернете.
      Будет ли в дальнейшем контент по асинхронности, cqrs?

  • @user-bb1ew9ky7d
    @user-bb1ew9ky7d 4 месяца назад

    Если грубо сказать, то это чем-то напоминает веб-сокеты, когда есть канал, и при изменениях в канале - мы видим изменения?

  • @user-bk5ms4ss5b
    @user-bk5ms4ss5b 4 месяца назад

    Спасибо автору за курс. Хотел бы спросить, есть ли у кого-то опыт как сделать то же самое, только через докер?

  • @user-cp8ou1ot5z
    @user-cp8ou1ot5z 9 месяцев назад

    Брат, нужно сделать еще очередь, как ловить сообщения в очереди!!! Тема сисек не раскрыта полностью!!! Сделай продолжение! )))) Здоровье тебе и успехов в развитии канала!)

    • @laravelcreative
      @laravelcreative  9 месяцев назад +1

      Спасибо. О какой очереди речь? :)

  • @spitzer4077
    @spitzer4077 9 месяцев назад +1

    Заработало таки (не признавало is_open и версия ставилась 2.8).. попробовал запустить всё это в голой папке по композеру.json с "php-amqplib/php-amqplib": ">=3.0", так оно начало ругаться что не подключён php extension socket (никогда его не подключал), подключил, после чего ставилась уже не версия 2.8, а версия 3.5, на команду is_open уже не ругалось и работает всё как на видео.. до того был полный кошмар
    Норм видос, но всё-таки не хватает нескольких бестпракиксов на примере популярных прикладных задач с ларавелом...

  • @user-yf8if2qy5t
    @user-yf8if2qy5t Месяц назад

    Подскажите, чтобы использовать этот паке php-amqplib внутри docker конетейнеров он будет работать?

  • @midgardresident
    @midgardresident 6 месяцев назад

    Как обрабатывать сообщения из очереди? Добавлять их в другую очередь, из которой их заберет воркер этого микросервиса?

  • @eugaleksandr
    @eugaleksandr 4 месяца назад

    Вопрос, а что это за подключение висит на консьюмере? Это лонг пуллинг или периодичные запросы?

  • @tyaplyap4842
    @tyaplyap4842 6 месяцев назад

    а как реализовать ретрай если обработка не удалась в консюмере

  • @PavelUlyanov
    @PavelUlyanov 7 месяцев назад

    Спасибо за видео! Все работает, но вот из очереди берет сразу все задания. Закинул 10к делаю запрос на получение и все 10к пропадают.... prefetch_count по разному пытался указывать, но ничего не меняется. Один из вариантов нагуглил такой: $channel->basic_qos(0, 2, true); // Устанавливаем prefetch_count равным 2

  • @user-qb8dl8ig7c
    @user-qb8dl8ig7c 8 месяцев назад +1

    Оставь куда тебе задонатить можно. Или карту или донейшн алертсы какие-то и их виды

    • @laravelcreative
      @laravelcreative  8 месяцев назад +2

      Можешь подписаться на бусти:)

    • @user-qb8dl8ig7c
      @user-qb8dl8ig7c 8 месяцев назад

      @@laravelcreative не дает он что-то

  • @webgeekstudio975
    @webgeekstudio975 9 месяцев назад +2

    Я так и не понял - нахера ты в env прописал - что бы ни где это не использовать?

    • @laravelcreative
      @laravelcreative  9 месяцев назад +1

      Что именно?

    • @webgeekstudio975
      @webgeekstudio975 9 месяцев назад

      30:48@@laravelcreative - о том как получить параметры подключения из env и в итоге тупо оттуда копируешь - не получая параметры из env. + проще обращается к конфигу через хелпер config('rabbitmq.host')

    • @user-fx8kx4jf8l
      @user-fx8kx4jf8l 8 месяцев назад +2

      ​@@laravelcreativeну типа в папке config ты файл создал для rabbitmq, и всё равно данные захардкодил, а не из env файла берёшь. Забей, всё сделал хорошо)

    • @webgeekstudio975
      @webgeekstudio975 8 месяцев назад +1

      Да не критично, согласен, просто указал на недочет. Автор молодец..@@user-fx8kx4jf8l

  • @nurkhanzhaksylyk4133
    @nurkhanzhaksylyk4133 9 месяцев назад

    По стрелке видно что Consumer ссылается на queue (Документация во 2 разделе Work Queues). Соответственно можно создать еще 1 consummer который ссылается на ту же очередь указав такие же конфигурации. Пример: public function handle()
    {
    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
    $channel = $connection->channel();
    $channel->exchange_declare('exchange_name', 'direct', false, true, false);
    $channel->queue_declare('queue_name', false, true, false, false);
    $channel->queue_bind('queue_name', 'exchange_name', 'user_key');
    echo ' [*] Waiting for messages. To exit, press CTRL+C', "
    ";
    $callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "
    ";
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    };
    $channel->basic_qos(null, 1, null);
    $channel->basic_consume('queue_name', '', false, false, false, false, $callback);
    while ($channel->is_consuming()) {
    try {
    $channel->wait();
    } catch (\Exception $e) {
    // Обработка ошибки (вывод сообщения или логирование)
    echo 'An error occurred: ' . $e->getMessage() . "
    ";
    }
    }
    $channel->close();
    $connection->close();
    }

  • @vdbxxx
    @vdbxxx 3 месяца назад

    Есть $connection, есть непонятный $channel поверх $conection. Зачем эта вторая сущность? В конструкторе $channel разве нельзя прописать connection или в конструкторе connection создать полноценный объект channel? По типу, как сделано в других библиотеках: mysql_connect(): resource|false.