@gogolang

Страница 872 из 1630
Daniel
28.02.2018
11:58:52
а! я неоднократно пробовал показывать. не понимают-с. дикари-с.

Vladimir
28.02.2018
11:59:20
а! я неоднократно пробовал показывать. не понимают-с. дикари-с.
Ну вроде понял. К тому же я вроде бы не далек от истины в своих спекуляциях

Daniel
28.02.2018
12:00:26
Можете проверить :)
я бы глянул на код без prepare для начала

Google
Alexey
28.02.2018
12:01:33
чет я в это не верю. prepare такого смешного запроса не может занимать 1985 секунд
Там два запроса, один выполняется по количеству строк, второй количество строк умноженное на количество параметров

я бы глянул на код без prepare для начала
https://github.com/Supme/gonder/commit/74c333a1e3373bc254a557248b965a1ff5898e61#diff-26c6a333209552b6b6f6cef1dc42fe8e

Первая версия

m
28.02.2018
12:06:12
В het/http есть функция плавного завершения https://golang.org/pkg/net/http/#Server.Shutdown . Как бы предполагается, что мы хотим закончить обслуживать все имеющиеся соединения и только потом выйти. Но вот вопрос: как при этом запустить другой процесс, который бы принимал новые соединения? Есть ли либы, позволяющие запускаться на том же порту новому процессу, а старому ещё долго (часы) продолжать обслуживать старые соединения?

Илья
28.02.2018
12:06:13
так у вас транзакции не было

?

Daniel
28.02.2018
12:07:44
так у вас транзакции не было
именно. я думаю, дело не в prepare, а в транзакции

m
28.02.2018
12:08:24
Ну, или смотреть в сторону master/slave архитектуры
А как это решит проблему невозможности слушать на том же порту?

Alexey
28.02.2018
12:08:57
чет я в это не верю. prepare такого смешного запроса не может занимать 1985 секунд
Тут дело такое: простое query это тоже подготовка запроса и потом запуск с переданными параметрами. База при подготовке запроса интерпритирует его себе, готовит план выполнения, потом мы просто передаём данные э этому

Andrey
28.02.2018
12:09:08
В het/http есть функция плавного завершения https://golang.org/pkg/net/http/#Server.Shutdown . Как бы предполагается, что мы хотим закончить обслуживать все имеющиеся соединения и только потом выйти. Но вот вопрос: как при этом запустить другой процесс, который бы принимал новые соединения? Есть ли либы, позволяющие запускаться на том же порту новому процессу, а старому ещё долго (часы) продолжать обслуживать старые соединения?
предполагается, что у вас веб сервисы за лоадбалансером. Процедура такая 1) Поднимаете новый сервис, ЛБ начинает передавать трафик на него и продолжает передавать на старый 2) Отдаёте команду shutdown старому, он перестаёт принимать новые соединения и ЛБ шлёт трафик только на новый 3) старый до обрабатывает старые соединения и завершается

Alexey
28.02.2018
12:09:31
именно. я думаю, дело не в prepare, а в транзакции
Да там потом и транзакции были

Andrey
28.02.2018
12:09:42
> Есть ли либы, позволяющие запускаться на том же порту новому процессу, а старому ещё долго (часы) продолжать обслуживать старые соединения? такого нет

Google
m
28.02.2018
12:11:43
см https://github.com/gobwas/graceful, Сергей там навернул передачу дексрипторов при graceful рестарте
Спасибо, это то что надо. А то я сделал свой аналог https://github.com/rcrowley/goagain/ , но оно не пашет. И хрен знает почему.

там сокеты по их дескриптору передаются наверное.

Daniel
28.02.2018
12:12:15
а вот скажите - как вы собираетесь graceful утилизировать в век keepalive

Daniel
28.02.2018
12:12:58
так не закроется же соединение никогда

m
28.02.2018
12:13:21
Вообще-то они закрываются.

Daniel
28.02.2018
12:13:34
откуда ты знаешь?

m
28.02.2018
12:13:43
проверял ?

Daniel
28.02.2018
12:14:19
я вот не проверял, но письма от страдальцев, у которых на reload nginx висит часами, читал

m
28.02.2018
12:14:35
часами != никогда.

Daniel
28.02.2018
12:14:59
по мне, так часами === никогда

Andrey
28.02.2018
12:15:01
за время жизни вселенной точно закроется

m
28.02.2018
12:15:32
при релоаде nginx-у SIGHUP посылается и всё. так что управление возвращается в консоль, если что.

Daniel
28.02.2018
12:15:48
спасибо, кэп

но от этого только хуже

m
28.02.2018
12:16:18
В реальности это юзеры, которые активно использую сайт. Как уйдут, так соединение и закроется.

Google
m
28.02.2018
12:16:51
но от этого только хуже
а что именно плохо?

Daniel
28.02.2018
12:16:53
а что именно плохо?
ты реально понять не можешь, с хера ли новая конфигурация не применилась

m
28.02.2018
12:17:29
ну прибивай воркеров через час.

Daniel
28.02.2018
12:17:47
почему не сразу?

m
28.02.2018
12:18:17
сразу плохо: может прилететь пол страницы юзеру.

Daniel
28.02.2018
12:18:34
и так может, только ты еще час ждал

m
28.02.2018
12:19:25
спор из области, что курить вредно, но я же курю и жив.

Daniel
28.02.2018
12:19:37
не, я не спорю

я вопрос задаю

и пока ответы все какие-то невнятные :)

Igor
28.02.2018
12:20:13
http://nginx.org/en/docs/ngx_core_module.html#worker_shutdown_timeout

Daniel
28.02.2018
12:20:50
еще раз - почему не прибить воркера сразу? зачем ждать?

m
28.02.2018
12:22:05
ответ: чтобы юзер, качающий 100500 мегабайтный файл мог не нажимать на его перезакачку в браузере.

а недогруженный css или js или картинка делают сайт некрасивым.

и браузер не пытается из докачать, кстати.

Daniel
28.02.2018
12:23:56
ответ: чтобы юзер, качающий 100500 мегабайтный файл мог не нажимать на его перезакачку в браузере.
но нет же способа оборвать соединение ровно тогда, когда он его докачает.

раньше он сам бы соединение закрыл по окончании

но сегодня-то - нет, не закроет

m
28.02.2018
12:25:13
браузер закроет соединени.

Google
m
28.02.2018
12:25:30
как докачает и подождёт 10 минут вроде

Alexander
28.02.2018
12:25:39
keepalive соединение не живёт бесконечно. Обычно закрывается в течение минуты после последней передачи.

Daniel
28.02.2018
12:26:03
как докачает и подождёт 10 минут вроде
если новый запрос в него не отправит

m
28.02.2018
12:26:15
Всё верно.

Alexander
28.02.2018
12:27:12
Тогда плохо. Но это не тот вариант, что со скачиваеним файла в 100500 мегабайт.

И вообще такое надо на вебсокетах делать :)

Daniel
28.02.2018
12:27:46
с вебсокетами та же херня

Admin
ERROR: S client not available

Илья
28.02.2018
12:28:43
в вебсокетах хотя бы можно на уровне протокола сказать - restart

со стороны сервера

Alexander
28.02.2018
12:28:50
да. Используйте load balancer'ы для переключения на живую и авто-восстановление вебсокетов для кикнутых клиентов

Daniel
28.02.2018
12:29:11
это да, но уже далеко от graceful

можно еще keepalive поддерживать только на балансере, а на бекендах обойтись без него

тогда на бекендах будет работать graceful

но это расход сокетов втрое и лейтенси повышенная

Andrew
28.02.2018
13:17:52
Коллеги, посоветуйте. Нужно запустить через конвейер от трёх и более программ. Если самому соединять их через io.Pipe, получается уж очень громоздко. Есть ли либа или способ упростить данный процесс?

Andrey
28.02.2018
13:33:33
type cmd ... func (* cmd) Exec ... commands := []cmd{"ls", "grep .txt", "sort"} for i, _ := range commands[:len(commands)-1] { r, w := io.Pipe() commands[i].Stdout = w commands[i+1].Stdin = r commands[i].Exec() } commands[len(commands)-1].Exec()

вроде не очень громоздко

cmd - псевдотип, для наглядности

Google
m
28.02.2018
14:28:14
Написал смену юзера и группы, но что-то как был процесс под рутом, так и остался. Что я делаю не так? func setUserAndGroup(u, g string) error { if u != "" { uid, err := strconv.Atoi(u) if err == nil { return err } err = syscall.Setuid(uid) if err == nil { return err } } if g != "" { gid, err := strconv.Atoi(g) if err == nil { return err } err = syscall.Setgid(gid) if err == nil { return err } } return nil }

Daniel
28.02.2018
14:29:15
скажи - ты забыл, что смена юзера нормально не работает в go?

m
28.02.2018
14:29:30
я и не знал

Daniel
28.02.2018
14:29:39
к тому моменту, ак ты его менять пытаешься, несколько тредов уже запущены

и им никто ничего не сменит

m
28.02.2018
14:30:26
был уверен, что оно к процессу относится, а не к тредам...

а есть какие-то варианты обхода этого?

Daniel
28.02.2018
14:31:17
а тред на линуксе - это процесс

нет

запускаться сразу от нужного пользователя - вот и все

или под рутом в докере

m
28.02.2018
14:32:06
ох... Ну почему опять надо что-то городить... устал уже. ?

Daniel
28.02.2018
14:32:35
https://github.com/golang/go/issues/1435 - ссылка про это

Nik
28.02.2018
14:32:54
https://github.com/golang/go/issues/1435 - ссылка про это
а если запускать из оснновного терда на старте

Daniel
28.02.2018
14:33:09
а как это сделать?

Nik
28.02.2018
14:33:36
Я был уверен, что на старте, пока я не сделал go func у меня один тред

m
28.02.2018
14:34:06
тред то основной, но горутина всегда может перескочить в другой тред.

Nik
28.02.2018
14:34:17
а другого треда то и не существует

он пока один

Страница 872 из 1630