Nikolay
Юра
И никак ты его не выпилишь
Nikolay
Павел
Павел
Юра
Проблем удаления тесно связана с темой loose coupling
Юра
В идеале ты типо должен иметь возможность удалить
Павел
Nikolay
Юра
Ну на практике вот выясняем возможно ли это или это просто болтовня умных писателей всяких книг
Юра
Юра
Ивенты решают одну проблему, и добавляют другие
Юра
Поэтому короче не бывает идеальных проектов
Юра
Такой вот итог )
Юра
Та же симфа со своими абстракциями в старой версии секьюрити это просто трындец же полный. Да и сейчас тоже там хватает абстракций всяких
Konstantin
Юра
Апи платформ кстати на ивентах же вся
Павел
Юра
Хукт ивенты суть в том что код который что-то делает вызывается неявно
Юра
И дебажитл такое то ещё удовольствие
Юра
Плюс можно напортачить с приоритетом и отхватить баги которые тоже сложно обнаружить
Konstantin
Konstantin
типа если ... то прокинем ивент дальше. или нет!
Павел
Konstantin
Павел
Мы ивент кинули в очередь, какой то может быть приоритет, там все слушают))
Юра
Был у меня кейс где они поменяли приоритет своего сериалайзера или что-то такое. И все сломалось
Юра
Пол дня ушло чтобы понять че случилось
Юра
Они просто впихнули это в минорное обновление
Юра
Хотя изменение приоритета чего бы там ни было, это уже BC
Юра
Ибо это часть публичного апи
Юра
Ну делайте просто норм семвер и норм ченджлог )
Юра
И не будет к вам вопросов )
The Ant
Павел
Приветствую. Хэлпаните плиз с тривиальной задачкой, но не делал просто.
Есть инстансы приложения. У каждого есть свой кэш. Кэш нужно чистить по определнным ивентам на всех инстансах.
Правильно ли я понимаю, что нужен fanout exchange в котором прописать количество очередей по количеству инстансов, а каждый инстанс должен слушать только свою очередь?
Ну т.е. messenger:consume --queues=queue_name_N на каждом инстансе?
Konstantin
а кеш локальный что ли (в файлах?)?
Konstantin
господи какая чушь
Konstantin
протоколы согласования (когерентности) распределенных кешей - это действительно сложная задача, которая решается мягко говоря нетривиально
Konstantin
если не одна из самых сложных задач в distributed-мире
Павел
Приехали :(
Konstantin
редис сам прекрасно кластеризуется. если на пальцах (это исключительно упрощенный пример), то он сам может собраться в определенный кластер, с дублированием, резервированием, разделением нагрузки, а вот приложение с ним работает будто это локальный сингл-инстанс базы на десятки терабайт
Konstantin
то есть операции из прикладного кода будут такими же - сделали $redis->del($key) а ключ магически удалился на всех инстанса одномоментно
Павел
Konstantin
бля)
Konstantin
у него качественная каша в голове, я не могу это ничем иным объяснить. https://redis.io/docs/manual/scaling/
Konstantin
однопоточность плоха только если у тебя одна команда съедает много времени (сложные операции с линейной сложностью O(N) над огромными листами, долгие lua-скрипты и всё такое). тогда последующие за этой командой встают в очередь и долго ее ждут, это правда не очень приятно. но это довольно сложно сделать, используя редис как кеш.
в остальном редис достаточно спокойно переживает 200-400 krps на среднем железе, несмотря на однопоточность
Павел
Konstantin
с независимыми кешами легко себе представить, что какой-то воркер не получил команду (рестартился в этот момент, или еще что) и не сбросил кеш своего инстанса. и тогда запросы за одними данными будут отвечать разными ответами в зависимости от того, на какую ноду упал запрос, это же сущий кошмар, который замучаешься дебажить
Павел
Konstantin
и если упретесь в него, резко станет херово всему приложению. то есть если у вас условных 200 krps, и вы их параллелите, у вас сейчас N инстансов с такой нагрузкой. которые суммарно все равно пережевывают эти 200к. если их соединить в кластер, этот кластер на тех же ресурсах потянет условных 700к, при тех же затратах
Павел
Konstantin
с независимыми кешами легко себе представить, что какой-то воркер не получил команду (рестартился в этот момент, или еще что) и не сбросил кеш своего инстанса. и тогда запросы за одними данными будут отвечать разными ответами в зависимости от того, на какую ноду упал запрос, это же сущий кошмар, который замучаешься дебажить
вот достаточный аргумент, на мой взгляд. распределенный кеш должен быть транзакционным: типа записали/сбросили или везде, или нигде, строго. для этого нужно строить систему с distributed transactions (а значит проектировать откат одной операции, если следующая сфейлилась), обмазываться сагами и вот этим всем. ну нахер, проще кластер 10 строчками настроить
Павел
The Ant
Konstantin
на чтение ведь тоже, там строгая линеаризуемость операций
Konstantin
и никакой eventually consistency нет. это нельзя никак иначе гарантировать, кроме однопоточности и/или глобальных блокировок (что суть та же однопоточность)
The Ant
врятле, иначе он не мог бы читать сотни тыщ рпс
Konstantin
да почему, он же просто в сокет байты срет из памяти
Konstantin
на больших нагрузках там ядро больше тюнить приходится и в драйвере пайплайнинг делать, самому редису довольно пофигу
Konstantin
то что он делает (в случае простого get-а) - это очень примитивная работа
Павел
Так, ну а если не получится переубедить. Мое решение с точки зрения использования фрейма норм? Или есть другие варианты
Konstantin
ребята, главное не ведитесь на буллшит и не ставьте "многопоточный редис, лишенный всех недостатков" - https://keydb.dev/
это прям драматически говенный софт, который даже в лабе разваливается на каждый чих
Юра
Главное что разваливается быстрее редиса
Юра
Киллер фича
Алексей
Ребят есть в системе очередей фишка передавать на кластер а распределять чтение на каждом сервере отдельно?
Алексей
Может какой ни будь флаг выставлять можно?