
The
24.03.2018
20:48:20

Никита
24.03.2018
20:48:33
Окей, попробую

The
24.03.2018
20:49:20
я по дефолту и для MySQL так указываю. все коннекты нужно контролить.

Никита
25.03.2018
05:07:14
В общем проблема решилась (я надеюсь) установкой следующих параметров
dbConnection.SetConnMaxLifetime(5 * time.Minute)
dbConnection.SetMaxOpenConns(5)
dbConnection.SetMaxIdleConns(0)
Но я реально не понял ПОЧЕМУ это решило проблему. Кто нибудь может обьяснить? ?

Google

Никита
25.03.2018
05:08:13
Например, если увеличить макс кол-во открытых соединений, то проблема возвращается
Как это работает вообще

Kirill
25.03.2018
05:23:11
Видимо ты где-то не закрываешь подключения, и выставив lifetime, ты стал их закрывать
Остаётся только один вопрос
Насколько это хорошее решение

Никита
25.03.2018
05:37:43
Lifetime роли не играет
Я проверил
Если его убрать или увеличить, все также ок

Let Eat
25.03.2018
06:50:28

Никита
25.03.2018
06:57:35
Но я могу ошибаться

Alexey
25.03.2018
07:07:45

Алексей
25.03.2018
08:10:28

Google

Alexey
25.03.2018
10:10:32
Подготовленные запросы не нужно наготавливать для использования на протяжении всей программы. Их нужно использовать, например, в циклах, чтобы сиквел сервер один раз интерпретировал запрос, создал план выполнения себе и т.п. а далее получая данные только выполнял заготовленное.

DELETED
25.03.2018
12:20:02
https://github.com/nadoo/glider

Wingman
25.03.2018
15:12:36
Насколько правильно хранить объекты (персистентно хранящиеся в бд) и работать с ними - в памяти, в бд только записывая обновления?
Суть: куча объектов (оборудования), постоянно опрашивающегося на предмет кучи параметров. Это уже куча постоянных одинаковых запросов (на один объект - от пары десятков до сотен дочерних объектов) - но это хрен с ним, достаточно безболезненно для бд.
Еще это оборудование будет слать логи на сислог и снмп-трапы; какие-то события на оборудовании происходят постоянно, сейчас по нескольку сотен в секунду прилетает - и вот это уже похоже на бессмысленное дрочево БД: гораздо продуктивные было бы держать все в памяти
Сейчас еще в голову пришел вариант - простая обёртка над бд, кеширующая в памяти на энное время именно результат запросов (с ключем = мд5 строки запроса, например)
Кто как похожие кейсы решает?

Maxim
25.03.2018
15:35:46

Zver
25.03.2018
15:36:14


Maxim
25.03.2018
15:37:49

Wingman
25.03.2018
15:40:46

Maxim
25.03.2018
15:41:54
Лишняя прослойка получается
В случае если у вас одно приложение. Но такое редко бывает. Вы же будете масштабироваться) Общий кеш на шаренной памяти же не будете делать)
Насчет редко загнул наверно

Wingman
25.03.2018
15:42:38

Daniel
25.03.2018
15:42:40
Но и рсубд + кеш та еще мудянка

Maxim
25.03.2018
15:43:11

Daniel
25.03.2018
15:43:13
Оо почему?)
Или кеш работает синхронно с базой, и запись идет с ее скоростью
Или ты не знаешь, все ли записалось

Wingman
25.03.2018
15:44:46
Оо почему?)
От целей зависит
Например, прилетает мне лог от неизвестно кого
Смотрю в кеш: нет такого устройства, лезу в бд - там его тоже нет, дропаю
Если таких пакетов от неизвестных источников будет много - от кеша толку ноль
Т.е. в моем случае надо иметь однозначный список объектов либо в бд, либо еще где

Maxim
25.03.2018
15:49:28
Рассчитываю все, что нужно любым другим потребителям, отдавать по апи
Мы не много о разном говорим, источник данных один. А приложений которые предоставляет апи может быть много отдельных. Например сервера в разных стойках для резервации. 3 бд инстанса мастер слейв для чтения + слейв без лага для того чтобы в критичной ситуации стать мастером. Плюс три application сервера(контейнера) чтобы при падении хоста у вас ничего не упало. В таком случае кешировать в памяти приложения не получится. Нужен общедоступный кеш)
Но если вам не нужна отказоустойчивая конфигураци то можно и памяти)

Wingman
25.03.2018
15:50:44

Google

Maxim
25.03.2018
15:50:57
Да вы извращенец))

Wingman
25.03.2018
15:50:59
А в нем уже они в Памяти)
Ну я гипотетически )

Maxim
25.03.2018
15:51:21
Ну а чем тот же редис кластер не нравится?)
Он же тоже самое делает)
Хранит в памяти, при желании может быть и персистентным) Единственно немного времени на сериализацию будете тратить

Wingman
25.03.2018
15:52:33
Когда последний раз имел дело с редисом лет 5 назад, он был дико падучим и рассыпчатым
Хз как сейчас, но осадок остался)

Maxim
25.03.2018
15:52:54

Wingman
25.03.2018
15:53:13
Мб не 5, а 6..7
Не помню уже

Maxim
25.03.2018
15:56:26
Кластер вот относительно недавно у них появился был не стабилен какое-то время. Сейчас более менее. По крайней мере 6(3 master 3 slave) инстансов на одном из микросервисов уже год работают без падений)
А не кластерное решение давно вроде работает стабильно, это штука древняя как г мамонта) И нагрузки хорошие держит и масштабируется на раз два)

Zaur
25.03.2018
17:14:45
ребят, а как можно как-нибудь так сделать?
var params = make(map[string]interface{})
params["abc"] = struct{
a int
b int
}потом взять и сделать так
params[abs].a = 212есть, конечно, идеи сделать это всё через getParam / setParam(path ...string)
но вдруг есть что-то более правильное

Vladimir
25.03.2018
17:16:18

Kirill
25.03.2018
17:19:14

Алексей
25.03.2018
17:30:08

Maxim
25.03.2018
17:33:41

Алексей
25.03.2018
17:35:33

Maxim
25.03.2018
17:38:20

Google

Алексей
25.03.2018
17:40:30

Zaur
25.03.2018
17:41:41

Maxim
25.03.2018
17:44:25
По крайней мере раньше так было, может с тех пор что-то изменилось в лучшую сторону)

Alexandr
25.03.2018
19:25:52
Всем привет. А ещё конференции есть? )

Kirill
25.03.2018
19:32:36
есть митапы

Alexandr
25.03.2018
19:32:58
да я имею ввиду предстоящие мероприятия чтоб сходить

Kirill
25.03.2018
19:34:21
https://t.me/itiviru
вот тут что-то планируется

Alexandr
25.03.2018
19:39:01

Wingman
25.03.2018
20:06:52
задумался =\
Есть некие объекты и у них есть различные профили (профиль авторизации, профиль настроек, и т.д.)
Объекты хранятся в памяти.
Сначала хотел также хранить профили в памяти и к каждому объекту цеплять _указатель_ на нужные профили: таким образом при каком-либо изменении профилей объекты трогать не нужно, всё "само обновится"
А потом подумал, что программа будет постоянно и непрерывно дёргать и лочить мьютексы одних и тех же профилей (объектов очень много, с ними постоянно что-то делается, а инстансов профилей мало: при каждом действии с каждым из тысяч объектов будут по нескольку раз лочиться-анлочиться мьютексы его профилей)
что правильнее в такой ситуации делать?
можно использовать RWMutex, тогда хотя бы постоянного рид-локов не будет, но всё равно постоянное и очень высокочастотное дёргание мьютексов одних и тех же обьектов - это нормально? :)

Мерлин
25.03.2018
20:13:47

Wingman
25.03.2018
20:14:15
Про это я уже выше спрашивал %)


Мерлин
25.03.2018
20:15:56
Примерно тут
Имхо кэшами нужно обманываться только когда вы упретесь в производительность базы
До этого момента это лишь добавит невероятно много геморроя

Google

Vladimir
25.03.2018
20:16:34

Wingman
25.03.2018
20:20:29

Мерлин
25.03.2018
20:21:32

Wingman
25.03.2018
20:29:36
Если на каждый дергать бд без Кеша, будут тыщи qps

Alexander
25.03.2018
20:33:38
Это не обязательно "убьет" БД, т.к. там тоже есть кэш запросов. Но даже если и будет проблема с бд, то по крайней мере это будет некой baseline для дальнейших улучшений
Могу только еще раз подтвердить слова Мерль - без бенчмарков нечего оптимизировать

Wingman
25.03.2018
20:36:18
А если кешировать именно запросы в какой-нибудь обертке над бд? И хранить в мапе с ключем "хеш запроса" минут по 5?
Тоже не оч вариант?

Alexander
25.03.2018
20:38:13
СтОит сначала проверить, что может сделать сама бд для такого кэша. В mysql он точно есть. И проблема инвалидации там решена
Make it work, make it right, make it fast

Aleksandr
25.03.2018
20:52:09
Да и депрекейтед с 8.0

Wingman
25.03.2018
20:52:52
и вообще у меня пг %)