Это самое лучшее что я видел, я посмотрел уроков 10 разных ничего никто нормально не объяснил. Тут и объяснили и пример показали, кароче топ, удачи в развитии канала Я подписан уже давно)
Отличное видео (и первое по Rabbit тоже). Спасибо за труд Хочу только уточнить по данным из Конфига и Env - в вашем случае данные берутся именно из конфига, а не из ENV. Чтобы брались из ENV надо в конфиге прописать 'host' => env('RABBITMQ_HOST')
А я посмотрел ваше видео с базой по Rabbitmq, ну думаю - надо бы где-то почитать, как это в связке с Laravel должно работать, а сегодня захожу на главную канала, а там... мааать честная 🙂
Ну просто гений на ютубере. Очень легко смотрится, все на наглядных примерах, кайф! Единственное, чего я не понял, это можно ли в реббит слать сообщения напрямую из javascript? (также, как мы это делаем в случае с REST, посредством ajax). Насколько я понял, он в основном предназначен для взаимодействия между серверными сервисами (backend to backend).
Не нашёл похожих вопросов в комментариях Допустим у нас 50 эндпоинтов апи в приложении и мы хотим внедрить раббит для целостности данных. Каждый эндпоинт, очевидно, реализует разную логику обработки данных. 1) Нам нужно для этого 50 очередей создать в раббите, которые будут висеть и ждать сообщений? 2) И как избежать конфликт имен очередей, если нам нужно одинаковую логику обработки делать, только в другом микросервисе? Ставить префикс имени микросервиса в названии очереди? Например такие очереди: 'mic1.addUser', 'mic2.addUser'. Получается так? 3) Создают ли новый обменник для каждого отдельного микросервиса, или все пихают в один? Интересно как на реальных проектах это работает ;) Спасибо)
Предлагаю автору ввиду его неоспоримой крутости открыть свое рекрутинговое it агентство) Я правильно понимаю что если consumer должен будет отдать какой-либо ответ то нужно сделать аналогичное обратное подключение? Брокер может использоваться только для подконтрольных сервисов или и для сторонних вроде почты или облака, если может то по какому принципу? Для углубления знаний о микросервисах было бы здорово реализовать небольшой проект с такой архитектурой в связке с брокером, чтобы как было сказано в одном из видео «все по взрослому»)
Благодарю:) Брокер просто передает данные по очереди. Иначе говоря, это такой же http запрос в rest api, но "в очереди". Поэтому передать мы можем данные и указать кто их будет брать. И уже у него можно прописать будет ли обращение на сторону или еще что. И отдает не консумер, а у него можно дернуть другую консолку, которая сделает публикацию "ответа". Иначе говоря, логику публикации лучше в консумер не прокидывать.
@@laravelcreative Для паблишера используется именно формат консольной команды? Получается что команда consume выступает в роли единой точки входа в api? А как быть дальше если сервис с бд например или ресурсный, редирект внутри api сервиса? В сообщении тогда нужно прописывать uri параметры и обратный адрес и как быть с запросами помимо гет? надеюсь все таки будет продолжение по rabbit) Вообще тема асинхронности очень интересна и ее практическая часть почти не освещена в интернете. Будет ли в дальнейшем контент по асинхронности, cqrs?
Брат, нужно сделать еще очередь, как ловить сообщения в очереди!!! Тема сисек не раскрыта полностью!!! Сделай продолжение! )))) Здоровье тебе и успехов в развитии канала!)
Заработало таки (не признавало is_open и версия ставилась 2.8).. попробовал запустить всё это в голой папке по композеру.json с "php-amqplib/php-amqplib": ">=3.0", так оно начало ругаться что не подключён php extension socket (никогда его не подключал), подключил, после чего ставилась уже не версия 2.8, а версия 3.5, на команду is_open уже не ругалось и работает всё как на видео.. до того был полный кошмар Норм видос, но всё-таки не хватает нескольких бестпракиксов на примере популярных прикладных задач с ларавелом...
Спасибо за видео! Все работает, но вот из очереди берет сразу все задания. Закинул 10к делаю запрос на получение и все 10к пропадают.... prefetch_count по разному пытался указывать, но ничего не меняется. Один из вариантов нагуглил такой: $channel->basic_qos(0, 2, true); // Устанавливаем prefetch_count равным 2
30:48@@laravelcreative - о том как получить параметры подключения из env и в итоге тупо оттуда копируешь - не получая параметры из env. + проще обращается к конфигу через хелпер config('rabbitmq.host')
@@laravelcreativeну типа в папке config ты файл создал для rabbitmq, и всё равно данные захардкодил, а не из env файла берёшь. Забей, всё сделал хорошо)
По стрелке видно что 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(); }
Есть $connection, есть непонятный $channel поверх $conection. Зачем эта вторая сущность? В конструкторе $channel разве нельзя прописать connection или в конструкторе connection создать полноценный объект channel? По типу, как сделано в других библиотеках: mysql_connect(): resource|false.
Вроде как каналы одного подключения работают с одним и тем же tcp соединением (что логично, соединение то одно). Можно создать несколько каналов для одного подключения
Это самое лучшее что я видел, я посмотрел уроков 10 разных ничего никто нормально не объяснил.
Тут и объяснили и пример показали, кароче топ, удачи в развитии канала
Я подписан уже давно)
Отличное видео (и первое по Rabbit тоже). Спасибо за труд
Хочу только уточнить по данным из Конфига и Env - в вашем случае данные берутся именно из конфига, а не из ENV.
Чтобы брались из ENV надо в конфиге прописать 'host' => env('RABBITMQ_HOST')
Да, забыл дописать:)
Ну это прям то, что доктор прописал! Спасибо за видео)
Спасибо большое за видео. Очень интересно.
Спасибо! Как всегда на высоте!
Благодарю:)
Всё как всегда на высшем уровне! Единственное конечно, что не понятно, как запустить в супервизоре. погуглил, но так и не нашел.
Благодарю:) Просто изучи тему supervisor как работает:) Там на 20 минут
Спасибо за видео!)
Огромное спасибо за продолжение! Очень вовремя!!! Даёшь продолжение :)
Благодарю:)
А я посмотрел ваше видео с базой по Rabbitmq, ну думаю - надо бы где-то почитать, как это в связке с Laravel должно работать, а сегодня захожу на главную канала, а там... мааать честная 🙂
Ну просто гений на ютубере. Очень легко смотрится, все на наглядных примерах, кайф!
Единственное, чего я не понял, это можно ли в реббит слать сообщения напрямую из javascript? (также, как мы это делаем в случае с REST, посредством ajax). Насколько я понял, он в основном предназначен для взаимодействия между серверными сервисами (backend to backend).
Не нашёл похожих вопросов в комментариях
Допустим у нас 50 эндпоинтов апи в приложении и мы хотим внедрить раббит для целостности данных.
Каждый эндпоинт, очевидно, реализует разную логику обработки данных.
1) Нам нужно для этого 50 очередей создать в раббите, которые будут висеть и ждать сообщений?
2) И как избежать конфликт имен очередей, если нам нужно одинаковую логику обработки делать, только в другом микросервисе? Ставить префикс имени микросервиса в названии очереди? Например такие очереди: 'mic1.addUser', 'mic2.addUser'. Получается так?
3) Создают ли новый обменник для каждого отдельного микросервиса, или все пихают в один?
Интересно как на реальных проектах это работает ;)
Спасибо)
Нашёл ответ?
То, что надо!
Благодарю:)
Найс! Полезное видео :)
Предлагаю автору ввиду его неоспоримой крутости открыть свое рекрутинговое it агентство)
Я правильно понимаю что если consumer должен будет отдать какой-либо ответ то нужно сделать аналогичное обратное подключение?
Брокер может использоваться только для подконтрольных сервисов или и для сторонних вроде почты или облака, если может то по какому принципу?
Для углубления знаний о микросервисах было бы здорово реализовать небольшой проект с такой архитектурой в связке с брокером, чтобы как было сказано в одном из видео «все по взрослому»)
Благодарю:) Брокер просто передает данные по очереди. Иначе говоря, это такой же http запрос в rest api, но "в очереди". Поэтому передать мы можем данные и указать кто их будет брать. И уже у него можно прописать будет ли обращение на сторону или еще что. И отдает не консумер, а у него можно дернуть другую консолку, которая сделает публикацию "ответа". Иначе говоря, логику публикации лучше в консумер не прокидывать.
@@laravelcreative
Для паблишера используется именно формат консольной команды?
Получается что команда consume выступает в роли единой точки входа в api? А как быть дальше если сервис с бд например или ресурсный, редирект внутри api сервиса? В сообщении тогда нужно прописывать uri параметры и обратный адрес и как быть с запросами помимо гет?
надеюсь все таки будет продолжение по rabbit)
Вообще тема асинхронности очень интересна и ее практическая часть почти не освещена в интернете.
Будет ли в дальнейшем контент по асинхронности, cqrs?
Брат, нужно сделать еще очередь, как ловить сообщения в очереди!!! Тема сисек не раскрыта полностью!!! Сделай продолжение! )))) Здоровье тебе и успехов в развитии канала!)
Спасибо. О какой очереди речь? :)
Thanks a lot! 🙏
Благодарю!:)
Заработало таки (не признавало is_open и версия ставилась 2.8).. попробовал запустить всё это в голой папке по композеру.json с "php-amqplib/php-amqplib": ">=3.0", так оно начало ругаться что не подключён php extension socket (никогда его не подключал), подключил, после чего ставилась уже не версия 2.8, а версия 3.5, на команду is_open уже не ругалось и работает всё как на видео.. до того был полный кошмар
Норм видос, но всё-таки не хватает нескольких бестпракиксов на примере популярных прикладных задач с ларавелом...
Благодарю:)
Спасибо автору за курс. Хотел бы спросить, есть ли у кого-то опыт как сделать то же самое, только через докер?
Подскажите, чтобы использовать этот паке php-amqplib внутри docker конетейнеров он будет работать?
Дякую!
Как обрабатывать сообщения из очереди? Добавлять их в другую очередь, из которой их заберет воркер этого микросервиса?
Если грубо сказать, то это чем-то напоминает веб-сокеты, когда есть канал, и при изменениях в канале - мы видим изменения?
Спасибо за видео! Все работает, но вот из очереди берет сразу все задания. Закинул 10к делаю запрос на получение и все 10к пропадают.... prefetch_count по разному пытался указывать, но ничего не меняется. Один из вариантов нагуглил такой: $channel->basic_qos(0, 2, true); // Устанавливаем prefetch_count равным 2
Вопрос, а что это за подключение висит на консьюмере? Это лонг пуллинг или периодичные запросы?
Оставь куда тебе задонатить можно. Или карту или донейшн алертсы какие-то и их виды
Можешь подписаться на бусти:)
@@laravelcreative не дает он что-то
а как реализовать ретрай если обработка не удалась в консюмере
Я так и не понял - нахера ты в env прописал - что бы ни где это не использовать?
Что именно?
30:48@@laravelcreative - о том как получить параметры подключения из env и в итоге тупо оттуда копируешь - не получая параметры из env. + проще обращается к конфигу через хелпер config('rabbitmq.host')
@@laravelcreativeну типа в папке config ты файл создал для rabbitmq, и всё равно данные захардкодил, а не из env файла берёшь. Забей, всё сделал хорошо)
Да не критично, согласен, просто указал на недочет. Автор молодец..@@user-fx8kx4jf8l
Хахахах, тоже не понял@@user-fx8kx4jf8l
По стрелке видно что 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();
}
Благодарю:)
Есть $connection, есть непонятный $channel поверх $conection. Зачем эта вторая сущность? В конструкторе $channel разве нельзя прописать connection или в конструкторе connection создать полноценный объект channel? По типу, как сделано в других библиотеках: mysql_connect(): resource|false.
Вроде как каналы одного подключения работают с одним и тем же tcp соединением (что логично, соединение то одно). Можно создать несколько каналов для одного подключения