Михаил
Это очень большая нагрузка
The Ant
В мессенджере все через транспорт делается, и оно основное. Очередь там как-то сбоку. Т.е. воркер можно на транспорт повесить, но не отдельно на очередь...
Михаил
Хотя писал игровой сервер там раунд робин нормально работал, но сами консъюмеры отправляли друг другу сообщения если не могли его обработать да и всё на сокетах было
Павел
Павел
Эт как? Есть пример?
Это не прод, просто для себя пробовал решить как раз эту задачу
Павел
Хотя можно направить и на определенную очередь, только на 1, а не на весь транспорт
Михаил
ну да
Михаил
сам брокер должен просто отдавать ему сообщения только с определёным id
The Ant
А опции откуда? Я смотрел исходники, вроде небыло ничо такого
Павел
сам брокер должен просто отдавать ему сообщения только с определёным id
Брокер ничего не должен, он тупой. Надо класть в очереди опредленные
The Ant
Походу не туда смотрел )
The Ant
Пасиб )
Павел
Походу не туда смотрел )
Ну в самой доке да, слабо раскрыто, но в симкасте есть точно
Павел
Походу не туда смотрел )
https://symfonycasts.com/screencast/messenger/dynamic-routing-key
Павел
Павел
Ну тольео интерфейм есть для забора юзера
Михаил
binsole messanger:consume async_default?
Михаил
а дальше природа сама разберётся?
Павел
binsole messanger:consume async_default?
- - queue можно указать чтобы как раз направлять 1 к 1
Павел
Но консюмер не работает именно с роутинг кеями
Павел
Роутинг кеи только чтобы положить в определенную очередь, все, на этом их роль кончается
Павел
Дальше есть только очереди и всё
Михаил
то есть у меня 4 пода, в поде есть бекграунд джобы. В рамках одного пода я могу гарантировать что у меня будет bin/console messanger:consume async_default —queue=message_direct_1 bin/console messanger:consume async_default —queue=message_direct_2 bin/console messanger:consume async_default —queue=message_direct_3 bin/console messanger:consume async_default —queue=message_direct_4 и в итоге у меня, допустим из message_direct_1 будут читать 4 пода что не решает проблему
Павел
Если сделать таких 4 инстанса, то будет да 4 консбмера читать из message_direct_1, но теряется весь смысл если говорить про избавление от гонки
Михаил
Ну вот я об этом же
Павел
Ну вот я об этом же
Так не надо читать 4 консюмерами одну очередь
Михаил
как сделать так чтоб при старте приложения каждый воркер знал от куда ему читать
Павел
bin/console messanger:consume async_default —queue=message_direct_1 bin/console messanger:consume async_default —queue=message_direct_2 bin/console messanger:consume async_default —queue=message_direct_3 bin/console messanger:consume async_default —queue=message_direct_4
The Ant
Так делать 1 очередь = 1 воркер, скейлить очереди
Михаил
так
Михаил
и у меня запускается 4 экземпляра такого приложения
Павел
и у меня запускается 4 экземпляра такого приложения
Но каждый читает только из свой очереди
Михаил
КАААААК?
Павел
КАААААК?
Я не понимаю... вы же указалли —queue=message_direct_1
Михаил
ofc
Михаил
щас
Павел
Это значит читать ТОЛЬКО из этой очерели
Михаил
С кубернетисом работали? или с докер свормом?
Павел
С кубернетисом работали? или с докер свормом?
Лично нет, но есть опыт в докере с распределенным кэшем в очередях
Михаил
Так, начнём с азов
Михаил
Есть такая вещь как упаковка приложения
Михаил
Я сделал приложение в котором есть код
Павел
В этом коде написано это
Так это ваши проблемы что вы там описали такой харкод
Павел
У вас должны быть поды воркеров и например там указаны очерели через env
Павел
и каждый под настраивается с своим env
Михаил
Воооо
Михаил
Вооот
Михаил
Уже хорошо
Павел
Автоскалирование, и каждый под читал тольео свою очередь
Павел
Номер пода - это номер в названии очереди
Михаил
Но как это сделать. Только через env?
Павел
Но как это сделать. Только через env?
Ну это больше к вопросу девоспирования, не подскажу. Может можно как то просто завести после команду внутри пода и ее прописать, может через env
Павел
Есть еще один кейс
Павел
Можно сделать отдельный траспорт на чтение
Павел
И в нем указать direct_%env%
Михаил
Номер пода - это номер в названии очереди
Вот в том то и проблема, не только консъюмеры должны узнавать об этом, но и продьюсеры
Павел
Только одну очередь
Павел
Т.е. в записи куча очередей,а в чтении только 1. Т.е. два транспорта
Павел
и тогда можно заводить вот так bin/console messanger:consume async_default
Павел
Без указания очереди, но env все равно должен быть внутри инстанса
Павел
вот тут об этом писал
Ну вот мой пример это решает, главное прокинуть в env номер пода
Павел
Но там проблема посерьезнее, нельзя просто так мнять кол-во, потому что будет расинхрон
Павел
Это опять к вопросу как правильно шардить БД
Михаил
иначе работать не будеь
Павел
Типа когда надо увелисить кол-во шардов
Павел
и в продьюсеры общее их кол-во
Заполняете конфин месенджера через php а не yaml смотрите кол-вл подов в env и в цикле настраиваете очереди
Павел
Только надо передплой или чистку кэша
Михаил
ну или энв читать по сокетам