Size: a a a

Golang Developers — русскоговорящее сообщество

2020 October 22

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
ok
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
чуваки, есть ли какой-то best practice по тому, сколько рекомендуется плодить горутин для одного запроса. такой пример: у меня есть 100 сервисов, в которые нужно асинхронно сходить, однако на мою ручку может лечь 1к рпс. следовательно одновременно будет около, 100к горутин, что не есть хорошо. в таких случая рекомендуюется использовать пул из воркеров. вопрос в том, сколько воркеров делать?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Saimon Arzin
чуваки, есть ли какой-то best practice по тому, сколько рекомендуется плодить горутин для одного запроса. такой пример: у меня есть 100 сервисов, в которые нужно асинхронно сходить, однако на мою ручку может лечь 1к рпс. следовательно одновременно будет около, 100к горутин, что не есть хорошо. в таких случая рекомендуюется использовать пул из воркеров. вопрос в том, сколько воркеров делать?
почему не хорошо?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Вопрос в другом должен быть, мешают ли тебе 100к воркеров?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
И если ответ да, тогда используй пул
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Анатолий
Вопрос в другом должен быть, мешают ли тебе 100к воркеров?
да, так как хочется чтобы не только одна ручка грела кристал, а еще какая-то работа выполнялась
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
я не понял сообщения )
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
работа будет выполняться
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Анатолий
И если ответ да, тогда используй пул
вопрос в другом. по каким критериям стоит ограничивать количество воркеров? ну то есть, как выбрать оптимальное количество воркеров в пуле?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
если тебе их нужно контролировать или ресурсы поджимают
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Saimon Arzin
чуваки, есть ли какой-то best practice по тому, сколько рекомендуется плодить горутин для одного запроса. такой пример: у меня есть 100 сервисов, в которые нужно асинхронно сходить, однако на мою ручку может лечь 1к рпс. следовательно одновременно будет около, 100к горутин, что не есть хорошо. в таких случая рекомендуюется использовать пул из воркеров. вопрос в том, сколько воркеров делать?
Не то что бы best practice, но есть принцип YAGNI.
Если его прикрутить к вашему вопросу, то будет звучать примерно так: напишите программу, чтоб она работала, а вот когда реально упрётесь в количество горутин, тогда приходите с этим вопросом.

Пока что звучит странно.
Вы говорите, что сходить надо асинхронно, но при этом 100 сервисов для 1к запросов у вас порождают 100к горутин?
Так это не асинхронно. Асинхронно — это когда вы запрос приняли, отложили куда-то таску, потом пришёл какой-то воркер и таску, в которой надо в 100 сервисов сходить, выполнил.

Если же вы под асинхронностью понимаете одновременный обход этих 100 сервисов, то опять-таки возникает вопрос: результат надо отдать как и когда? Синхронно или асинхронно?
От этого и нужно начинать плясать.

Но для начала всё-таки рекомендую начать с первого абзаца.
Вероятней всего вы занимаетесь преждевременной оптимизацией, которая bad practice.
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
подбирать можно империческим путем
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
самый простой вариант - количество ядер = количество рутин в пуле
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
:) это если лень смотреть/считать/вычислять
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Анатолий
самый простой вариант - количество ядер = количество рутин в пуле
Ну это ж вообще весь смысл горутин теряется)
Если б там математика какая-нибудь была, то ладно ещё, а так ведь абсолютно неблокирующие операции (запросы к этим 100 сервисам) — было бы на чём экономить)
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
x-foby
Не то что бы best practice, но есть принцип YAGNI.
Если его прикрутить к вашему вопросу, то будет звучать примерно так: напишите программу, чтоб она работала, а вот когда реально упрётесь в количество горутин, тогда приходите с этим вопросом.

Пока что звучит странно.
Вы говорите, что сходить надо асинхронно, но при этом 100 сервисов для 1к запросов у вас порождают 100к горутин?
Так это не асинхронно. Асинхронно — это когда вы запрос приняли, отложили куда-то таску, потом пришёл какой-то воркер и таску, в которой надо в 100 сервисов сходить, выполнил.

Если же вы под асинхронностью понимаете одновременный обход этих 100 сервисов, то опять-таки возникает вопрос: результат надо отдать как и когда? Синхронно или асинхронно?
От этого и нужно начинать плясать.

Но для начала всё-таки рекомендую начать с первого абзаца.
Вероятней всего вы занимаетесь преждевременной оптимизацией, которая bad practice.
понял, благодарю
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
x-foby
Ну это ж вообще весь смысл горутин теряется)
Если б там математика какая-нибудь была, то ладно ещё, а так ведь абсолютно неблокирующие операции (запросы к этим 100 сервисам) — было бы на чём экономить)
Ну человеку нужно было число )
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Анатолий
Ну человеку нужно было число )
Ну блин))))
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Анатолий
Ну человеку нужно было число )
да меня не только число интересовал, а сам подход, как обосновать тот и иной выбор. необходимо ли вообще что-то ограничивать
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Saimon Arzin
да меня не только число интересовал, а сам подход, как обосновать тот и иной выбор. необходимо ли вообще что-то ограничивать
Смотрите, всё ведь просто.
Если у вас ожидается 1к запросов в секунду, и на каждый запрос вам надо ходить в 100 сервисов, то вы пулом ни количество запросов, ни количество сервисов не уменьшите.

То есть, порождая 100 горутин на запрос, вы получите максимально быстрое выполнение и, если железо выдержит, то проблем вам это не доставит.
Если же железо не будет держать эту нагрузку, то ограничивая количество горутин пулом, вы будете увеличивать время обработки каждого запроса, то есть начнёте создавать очередь, соответственно и не сможете держать 1к рпс.

Если резюмировать, то мы придём к тому что пул вам ничего не даст: потому что если вам в секунду нужно тысячу раз сходить в 100 сервисов, то что бы вы не делали, задача не изменится — вам всё равно нужно будет сходить тысячу раз в секунду в 100 сервисов.

Вы говорили выше что-то про кристалл, но процессор тут не причём, единственное, что вы действительно сможете сэкономить, используя пул, — это память.
Но, опять же, если у вас стоит задача ходить тысячу раз в секунду в 100 сервисов, то вам в любом случае нужно соответствующее задаче железо.

Отталкивайтесь всегда от задачи.
источник