Неблокирующее чтение данных из tcp соединения
Пишу tcp сервер. Он рассчитан на большое количество соединений из которых надо одновременно читать данные. Обработка этих соединений выглядит примерно так:
for {
for _, conn := range connections {
buf := make([]byte, 4096)
_, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
}
// ...
}
}
Проблема в том, что conn.Read блочит весь код и не позволяет ему выполняться до того момента пока этот пользователь не отправит чего-либо. Могу ли я как-то проверить, что пришли какие-то данные и только в этом случае прочитать? Конечно я могу сделать много горутин. Но их будет много тысяч и память очень быстро кончится
Ответы (1 шт):
Про 64к я, конечно не прав.
Но всё равно делал бы на горутинах. Память нынче стоит копейки. Скажем, 16-ядерный сервер с 32 гб памяти можно арендовать в Амазоне за 0.4 доллара в час. То есть в месяц порядка $300
Почему это копейки? Потому что при большой нагрузке основные деньги придётся платить за трафик.
Предположим, ваш сервер обслуживает 100 тыс одновременных соединений. 32 гб памяти будет вполне достаточно, чтобы обработать их горутинами.
Пусть это будет онлайн игрушка с небольшим постоянным трафиком. Скажем, по килобайту в секунду. Тогда месячный трафик такого сервера составит 2.6 петабайта, за которые амазон захочет от 50 ТЫСЯЧ долларов. У них тариф по США 0.02 USD за Гб, по миру 0.09 USD за Гб.
Конечно, можно найти хостинги с более гуманной тарификацией. И тем не менее, месячная оплата за трафик будет тысячи долларов, а за виртуалку - полторы-две сотни.
Так что нет смысла экономить память, ИМХО.