Maxim
Но если вам не нужна отказоустойчивая конфигураци то можно и памяти)
Maxim
Да вы извращенец))
Wingman
А в нем уже они в Памяти)
Wingman
Ну я гипотетически )
Maxim
Ну а чем тот же редис кластер не нравится?)
Maxim
Он же тоже самое делает)
Maxim
Хранит в памяти, при желании может быть и персистентным) Единственно немного времени на сериализацию будете тратить
Wingman
Когда последний раз имел дело с редисом лет 5 назад, он был дико падучим и рассыпчатым
Wingman
Хз как сейчас, но осадок остался)
Wingman
Мб не 5, а 6..7
Wingman
Не помню уже
Maxim
Кластер вот относительно недавно у них появился был не стабилен какое-то время. Сейчас более менее. По крайней мере 6(3 master 3 slave) инстансов на одном из микросервисов уже год работают без падений) А не кластерное решение давно вроде работает стабильно, это штука древняя как г мамонта) И нагрузки хорошие держит и масштабируется на раз два)
Maxim
Или кеш работает синхронно с базой, и запись идет с ее скоростью
Ну кеш нужен для объектов которые реже обновляются чем читаются, тут ты получаешь профит, а если ты часто пишешь и обязательно персистентно, то это уже не задача кеша, правильно же?)
Заур
ребят, а как можно как-нибудь так сделать? var params = make(map[string]interface{}) params["abc"] = struct{ a int b int }потом взять и сделать так params[abs].a = 212есть, конечно, идеи сделать это всё через getParam / setParam(path ...string) но вдруг есть что-то более правильное
Vladimir
и я бы хотел, чтобы была такая либа, чтобы
Так ты описал практически qt
Alexey
В случае с кластером - ничего)
Чтобы построить кластер нужно минимум 6 нод?
Maxim
Чтобы построить кластер нужно минимум 6 нод?
3 мастера как я помню минимум) Но от такого толку нет. Хватит наводящих вопросов, давай колись где подколоть хочешь)
Alexey
3 мастера как я помню минимум) Но от такого толку нет. Хватит наводящих вопросов, давай колись где подколоть хочешь)
Да не, просто интересуюсь) слышал, что эта портянка ляжет, если хоть одна нода отвалится.
Maxim
Да не, просто интересуюсь) слышал, что эта портянка ляжет, если хоть одна нода отвалится.
Если только три мастера поднял то при падении одного кластер лежит. Поэтому чтобы иметь хоть немного отказоустойчивости - нужно минимум 6 нод. 3 мастера 3 слейва. Правда все равно при этом если на одном слоте упадет и мастер и слейв то кластер упадет 😆
Maxim
По крайней мере раньше так было, может с тех пор что-то изменилось в лучшую сторону)
Maxim
Да не, просто интересуюсь) слышал, что эта портянка ляжет, если хоть одна нода отвалится.
Прочитал сейчас вот тут https://habrahabr.ru/post/320902/ что можно и без куска кластера выживать с помощью cluster-require-full-coverage no, не знаю на практике как это, не я инфру поднимаю)
Kirya
Всем привет. А ещё конференции есть? )
пользуясь случаем. я заснял влог https://www.youtube.com/watch?v=lHqLtTetgUA
Kirya
есть митапы
Anonymous
да я имею ввиду предстоящие мероприятия чтоб сходить
Kirya
https://t.me/itiviru
Kirya
вот тут что-то планируется
Anonymous
Wingman
задумался =\ Есть некие объекты и у них есть различные профили (профиль авторизации, профиль настроек, и т.д.) Объекты хранятся в памяти. Сначала хотел также хранить профили в памяти и к каждому объекту цеплять _указатель_ на нужные профили: таким образом при каком-либо изменении профилей объекты трогать не нужно, всё "само обновится" А потом подумал, что программа будет постоянно и непрерывно дёргать и лочить мьютексы одних и тех же профилей (объектов очень много, с ними постоянно что-то делается, а инстансов профилей мало: при каждом действии с каждым из тысяч объектов будут по нескольку раз лочиться-анлочиться мьютексы его профилей) что правильнее в такой ситуации делать?
Wingman
можно использовать RWMutex, тогда хотя бы постоянного рид-локов не будет, но всё равно постоянное и очень высокочастотное дёргание мьютексов одних и тех же обьектов - это нормально? :)
Wingman
Про это я уже выше спрашивал %)
Wingman
Насколько правильно хранить объекты (персистентно хранящиеся в бд) и работать с ними - в памяти, в бд только записывая обновления? Суть: куча объектов (оборудования), постоянно опрашивающегося на предмет кучи параметров. Это уже куча постоянных одинаковых запросов (на один объект - от пары десятков до сотен дочерних объектов) - но это хрен с ним, достаточно безболезненно для бд. Еще это оборудование будет слать логи на сислог и снмп-трапы; какие-то события на оборудовании происходят постоянно, сейчас по нескольку сотен в секунду прилетает - и вот это уже похоже на бессмысленное дрочево БД: гораздо продуктивные было бы держать все в памяти Сейчас еще в голову пришел вариант - простая обёртка над бд, кеширующая в памяти на энное время именно результат запросов (с ключем = мд5 строки запроса, например) Кто как похожие кейсы решает?
Примерно тут
Мерль
Примерно тут
Имхо кэшами нужно обманываться только когда вы упретесь в производительность базы
Мерль
До этого момента это лишь добавит невероятно много геморроя
Wingman
Имхо кэшами нужно обманываться только когда вы упретесь в производительность базы
Почти гарантированно упрусь сразу, как дам полную нагрузку: если в лоб - то тысячи запросов/сек будут
Wingman
Слова и предположения — ничто, бенчмарки и метрики — всё
Я не предполагаю, я знаю поток сообщений, который нужно будет обрабатывать)
Wingman
Если на каждый дергать бд без Кеша, будут тыщи qps
Alexander
Это не обязательно "убьет" БД, т.к. там тоже есть кэш запросов. Но даже если и будет проблема с бд, то по крайней мере это будет некой baseline для дальнейших улучшений
Alexander
Могу только еще раз подтвердить слова Мерль - без бенчмарков нечего оптимизировать
Wingman
А если кешировать именно запросы в какой-нибудь обертке над бд? И хранить в мапе с ключем "хеш запроса" минут по 5? Тоже не оч вариант?
Wingman
Могу только еще раз подтвердить слова Мерль - без бенчмарков нечего оптимизировать
Ну, хотелось сразу спроектировать с меньшей нагрузкой на бд) Проще ведь это сделать сразу и просто держать нужное в Памяти, чем потом где то сбоку синей изолентой кеш прикручивать)
Alexander
СтОит сначала проверить, что может сделать сама бд для такого кэша. В mysql он точно есть. И проблема инвалидации там решена
Alexander
Ну, хотелось сразу спроектировать с меньшей нагрузкой на бд) Проще ведь это сделать сразу и просто держать нужное в Памяти, чем потом где то сбоку синей изолентой кеш прикручивать)
Хотя в go и не приветствуются многочисленные абстракции, но здесь напрашивается repository pattern. Чтоб можно было добавить кэш или вообще заменить сторадж на что-то другое
Alexander
Make it work, make it right, make it fast
Aleksandr
СтОит сначала проверить, что может сделать сама бд для такого кэша. В mysql он точно есть. И проблема инвалидации там решена
Раз за разом вижу отсылки к кэшу MySQL. Но это вообще-то кардинально другая субстанция, не могущая заменить кэш приложения, и не для того сделанная
Aleksandr
Да и депрекейтед с 8.0
Wingman
и вообще у меня пг %)
Wingman
на кеш бд сильно рассчитывать в любом случае не стоит
Aleksandr
Это как рассчитывать на силу трения об асфальт во время торможения, а не на тормоза
🏁Александр
и вообще у меня пг %)
а может вы код накидаете? 🙂
🏁Александр
я честно по описанию не совсем понял
Wingman
а может вы код накидаете? 🙂
код к вопросу про мьютексы?) а то мало ли, уже тема убежала)
🏁Александр
вы бы вообще прототип сделали, на тестовых сущностях
🏁Александр
бенч там к нему
🏁Александр
и пришли бы уже "вот тут у меня проблема" 🙂
Wingman
блин, я всего-то спросил "насколько плохо использовать и дёргать МНОГО мьютексов" :)
🏁Александр
мьютексы сами по себе не очень замедляют, в один поток если 🙂 там основная проблема что блокировка для паралельных
Wingman
да вот хз (*) The problem with less very often locked mutexes is that if you have too much locking in your application, it causes to much of the inter-CPU/core traffic to flush the mutex memory from the data cache of other CPUs to guarantee the cache coherency. The cache flushes are like light-weight interrupts and handled by CPUs transparently - but they do introduce so called stalls
🏁Александр
блин, я всего-то спросил "насколько плохо использовать и дёргать МНОГО мьютексов" :)
у вас я правильно понимаю что-то типо такого: type Entity struct { profile *profile }
🏁Александр
да?
Wingman
ну да
Wingman
балин, накидал и рефрешнул
🏁Александр
я конечно не большой спец по мьютексам, но с какого перепугу вложенный профиль будет вообще дергаться
🏁Александр
а зачем вам лочить?
Wingman
дык, чтобы не читать/писать в момент изменения кем-то ещё
🏁Александр
так вы трогаете то Object, а не AuthProfile
🏁Александр
или вы хотите трогать AuthProfile?
Wingman
вот тут я их трогаю :)
🏁Александр
а чорд