Alexey
ну да. у тебя же приложение как стартует так и открывает коннект. И он живет пока сервис живет. И коннектов может быть не 1. И сервисов не 1
Herman
Если много сервисов подключены к одной бд это не микросервисы
Herman
С какого числа чего?
Artur
5 мая?
Ron Mount
5 мая?
🙂🙂
Alexey
на postgrespro курсы есть по DBA, там вроде поднимаются темы баунсеров
Alexey
а. оно почему-то не в DBA а в DEV. 7 тема https://postgrespro.ru/education/courses/DEV2
🄻🄰🄺🄸
Раз речь зашла по пгбаунсеры и постгрю. Как кокроучдб у кого-нибудь в продакшине поживает?
🄻🄰🄺🄸
Полноценное решение для распределённой базы данных. Поддерживает функциональность постгри ~ 9.5
🄻🄰🄺🄸
https://www.cockroachlabs.com/docs/stable/architecture/overview.html#goals-of-cockroachdb
🄻🄰🄺🄸
Ну она живучая как тараканы.
🄻🄰🄺🄸
(на словах) Мне интересно как оно в бою.
G
на локалке в кластере на докере норм работает. но перед тем, как запускать в прод, рекомендую изучить, как она дисковое пространство использует. там что-то типа бинлога с TTL записей на каждой ноде, который у меня на таблице в 100 записей разросся до 3 гигов, это по гигу на ноду.
G
как это число меняется при увеличении объёмов данных - не скажу, нагрузочного тестирования ещё не проводил
G
возможно, она заранее выделяет дисковое пространство. потому что откуда там гиг бинлога на 100 инсертов - ума не приложу.
Denis Pershin
возможно, она заранее выделяет дисковое пространство. потому что откуда там гиг бинлога на 100 инсертов - ума не приложу.
Это наверное рафт лог? А ты инсертил и удалял или просто 100 инсертов? У меня было около 1м записей на инсерт, он около 300мб составил на каждой ноде
G
Это наверное рафт лог? А ты инсертил и удалял или просто 100 инсертов? У меня было около 1м записей на инсерт, он около 300мб составил на каждой ноде
Просто 100 инсертов. Я тогда больше чтение тестировал. Специфика сервиса, производительность записи не так важна.
G
Но не успел нагенерить 1М, потому что прифигел от размера))
G
Я пока ещё в настройки не залезал. Может, там это регулируется.
G
Это не в смысле "cockroach гавно он жрёт место". Это в смысле "изучи вот именно этот вопрос" 😊
Denis Pershin
Так понятно, может у тебя там настройки как то не так выставились, репликейшен фактор слишком большой или ещё что, надо смотреть, у них есть demo режим, туда можно загрузить их бд и провести нагрузку их инструментами, посмотреть как растёт лог
Alexander
А у тебя как настроено? Ты можешь сделать чтобы в микро сервисе было n коннектов и пгбаунсер держал постоянно n? Может переподключается просто постоянно.
Alexander
Это да, но я бы донастроил и провёл тест, мб разница была бы нулевая. Неужели ум такой не пытливый?
[object Object]
Всем привет, не могу понять до конца как работает json, Мне нужно сделать структуру { "createdAt":"2022-04-20T08:17:13.625Z", "method":"test", "responseBody":{ "jsonrpc":"2.0", "id":123, "result":"123" } }
[object Object]
[object Object]
Но оно мне возвращает это
[object Object]
{"createdAt":"2022-04-20T08:17:13.625Z","method":"test","responseBody":"{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":\"123\"}\n"}
[object Object]
То есть json поломанный, и поле responseBody должно быть объектом а не строкой
Alexander
оберни stringifyBody в https://godocs.io/github.com/diamondburned/arikawa/utils/json#Raw
Alexander
может сработает
Alexander
бле, ссылка не на то по факту, сек
[object Object]
Я на го второй день пишу, так что если вопросы даунские соре
Alexander
https://docs.studygolang.com/pkg/encoding/json/#RawMessage
Alexander
просто json.RawMessage(stringifyBody)
[object Object]
Ахуеть работает
[object Object]
огромное спасибо
НеМаргарита
Всем доброго дня! Провожу небольшой опрос среди программистов насчет ресурсов которыми пользуются для повышения своей квалификации. Будет замечательно, если вы уделите мне пару минут) https://docs.google.com/forms/d/e/1FAIpQLSfNAFHTHipJ02esDVfYCWmkolkV-BZWLXKh1ZF9waUaAaKV-g/viewform
Ashwin
is anyone familiar with mocking in testify? i have some doubts
[object Object]
[object Object]
Последний вопрос, буду очень признатален если поможете, это Transporter для proxy.Transport = &transport{http.DefaultTransport}
[object Object]
Если раскоментировать код, то с респонсом какая-то срань происходит
[object Object]
то есть сам факт того что я этот ридер создаю
[object Object]
Даже если не паршу gzip
[object Object]
Ломает проксирование
Alexander
я еще пока не прочитал, но с гзипом такая фигня, что заголовок accept-encoding выставляется в гзип и автоматом разгзипывается, если ты не выставлял accept-encoding
Alexander
если сам разгизипуешь, не выставив заголовок, то происходит сам понимаешь что
Alexander
а зачем тебе тут свой транспорт реализовывать? еще и накладные расходы лишние. нет опять же возможности побайтово вычитывать, если большой ответ
Alexander
для того же джейсона можно создать ридер и сэкономить на памяти и тактах, не вычитывая все тело в слайс байт
Alexander
заменить контент и оценить его длину можно и потом
Alexander
Даже если не паршу gzip
еще кайфово не проверять ошибку при создании гзип ридера
[object Object]
Я заменил на proxy.ModifyResponse = modifyResponse
[object Object]
И там пытаюсь сделать тоже самое
[object Object]
То есть мне нужно в хедерс
Alexander
а что за proxy? я не очень понял
[object Object]
Указать accept-encoding: gzip?
[object Object]
proxy := httputil.NewSingleHostReverseProxy(remote) proxy.ModifyResponse = modifyResponse http.HandleFunc("/", handler(proxy)) err = http.ListenAndServe(":5006", nil)
Alexander
Указать accept-encoding: gzip?
зачем декодить, если оно итак расдекоденное приходит?
[object Object]
В моём случае нет
Alexander
ну то бишь, когда body читаешь
Alexander
хотя мб да, я чет с реверс прокси не продумал
Alexander
а ты пробовал логировать контент энкодинг? и что за сервер с которого ты проксируешь? некоторые плюют на accept-encoding и дают как хотят
Alexander
ну и скинь код modifyResponse с которым ломается, чтобы не гадать
Alexander
ну плюс, вычитывать весь контент при проксировании, чтобы отдать юзеру его размер - сомнительное преимущество. можно же отдавать пока сам читаешь
[object Object]
Проблема конкретно
[object Object]
В одном месте
Alexander
касательно подмены контента - можно создать свой ридер. но тут конечно придется поразмыслить
[object Object]
func parseGZipResponseBody(body io.Reader) string { gr, err := gzip.NewReader(body) if err != nil { panic(err) } defer gr.Close() data, err := ioutil.ReadAll(gr) if err != nil { panic(err) } return string(data) }
[object Object]
Проблема возникает тогда
[object Object]
Когда я вызываю data, err := ioutil.ReadAll(gr)
[object Object]
Если его закоментить
[object Object]
Всё ок
Alexander
а какая ошибка?
[object Object]
Alexander
ну это ошибка body самого похоже
Alexander
хотя уже не понимаю о чем речь
[object Object]
Может быть я могу по другому этот ебанный json записать
[object Object]