What's in an (Alias) Name?
https://go.dev/blog/alias-names
В версии Go 1.24, которая запланирована на начало февраля 2025 года, появится возможность объявлять generic alias type (пока можете почитать proposal).
В этой статье авторы Go объясняют что это и зачем. Заодно тут есть небольшой ликбез по обычному alias type.
Как обычно, буду честен — на мой взгляд, эта фича вряд ли пригодится многим из вас. Автор статьи позиционирует её как средство для рефакторинга пакетов, в которых есть дженерики — а много у вас таких пакетов?🙃
Но, в любом случае, потратить 10-15 минут своего времени на ознакомление с новой фичей своего инструмента считаю полезным занятием. Тем более, когда сами авторы стараются и пишут для нас подобные разборы.
————
В комментариях было бы особенно интересно увидеть людей, которые эту фичу очень ждут. Расскажите, почему?
#go_official #go_1_23
https://go.dev/blog/alias-names
В версии Go 1.24, которая запланирована на начало февраля 2025 года, появится возможность объявлять generic alias type (пока можете почитать proposal).
В этой статье авторы Go объясняют что это и зачем. Заодно тут есть небольшой ликбез по обычному alias type.
Как обычно, буду честен — на мой взгляд, эта фича вряд ли пригодится многим из вас. Автор статьи позиционирует её как средство для рефакторинга пакетов, в которых есть дженерики — а много у вас таких пакетов?
Но, в любом случае, потратить 10-15 минут своего времени на ознакомление с новой фичей своего инструмента считаю полезным занятием. Тем более, когда сами авторы стараются и пишут для нас подобные разборы.
————
В комментариях было бы особенно интересно увидеть людей, которые эту фичу очень ждут. Расскажите, почему?
#go_official #go_1_23
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
What's in an (Alias) Name? - The Go Programming Language
A description of generic alias types, a planned feature for Go 1.24
👍13❤7 2
Codebase Refactoring (with help from Go)
https://go.dev/talks/2016/refactor.article
Читая предыдущую статью, наткнулся на очень интересную работу Расса Кокса про рефакторинг кода на Go. Странно, что я не видел её раньше, большое упущение😩
Статья хорошая, полезная. Вообще, её стоило бы прочитать перед рассказом про алиасы.
#рефакторинг #russ_cox
https://go.dev/talks/2016/refactor.article
Читая предыдущую статью, наткнулся на очень интересную работу Расса Кокса про рефакторинг кода на Go. Странно, что я не видел её раньше, большое упущение
Статья хорошая, полезная. Вообще, её стоило бы прочитать перед рассказом про алиасы.
#рефакторинг #russ_cox
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
Codebase Refactoring (with help from Go) - The Go Programming Language
2👍14🔥3 2
Корутины: stackful vs stackless
https://habr.com/ru/articles/850970/
Статья не совсем по Go, она более общая (хотя, Go там тоже упоминается). Но тем лучше — чтобы лучше понимать, как что-то устроено в твоём языке, очень полезно поглядеть, как это сделано у соседей и сравнить.
Статья довольно короткая и написано очень хорошо, понятно, как я люблю.
#article
https://habr.com/ru/articles/850970/
Статья не совсем по Go, она более общая (хотя, Go там тоже упоминается). Но тем лучше — чтобы лучше понимать, как что-то устроено в твоём языке, очень полезно поглядеть, как это сделано у соседей и сравнить.
Статья довольно короткая и написано очень хорошо, понятно, как я люблю.
#article
Хабр
Корутины: stackful vs stackless
В этой статье я хочу объяснить разницу между stackless и stackful корутинами: чем они отличаются, какие у них плюсы и минусы, а также в общих чертах рассказать, как в некоторых...
🔥19 15👍4
Функциональные опции в Go
https://habr.com/ru/articles/842594/
🤓 Я как-то писал в своём основном канале про паттерн Functional Options — этот подход мне нравится, и я часто его вижу. А если он вам даже и не нравится, то познакомится всё равно стоит, т.к. встречать вы его наверняка тоже будете часто.
Если же хочется погрузиться глубже, то вот вам свежая подробная статья на Хабре на эту тему (не моя!). Написано очень хорошо, мне понравилось — читается легко и приятно.
————
Предвосхищая ваши комментарии, про Configurable Object я тоже писал🤓
#article
https://habr.com/ru/articles/842594/
Если же хочется погрузиться глубже, то вот вам свежая подробная статья на Хабре на эту тему (не моя!). Написано очень хорошо, мне понравилось — читается легко и приятно.
————
Предвосхищая ваши комментарии, про Configurable Object я тоже писал
#article
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Функциональные опции в Go
Функциональные опции в Go. Комикс required? Optional! Салют! Меня зовут Дима, я руковожу командой разработки ядра цифровой медицины в Республике Узбекистан. Сегодня я хочу поделиться своими знаниями о...
👍13🔥7
Golang Дайджест
Функциональные опции в Go https://habr.com/ru/articles/842594/ 🤓 Я как-то писал в своём основном канале про паттерн Functional Options — этот подход мне нравится, и я часто его вижу. А если он вам даже и не нравится, то познакомится всё равно стоит, т.к.…
Паттерны многопоточности в Go
https://habr.com/ru/articles/852556/
Ещё одна хорошая статья от того же автора. Хорошая тема — одно дело понимать, как работают горутины, другое — уметь ими правильно пользоваться в разных ситуациях. Благо, за нас уже придумали хорошие решения различных типовых задач и оформили это в виде паттернов. И эта статья — очень неплохой способ с ними познакомиться.
————
UPD: автор статьи здесь также присутствует, можете обращаться к нему в комментариях к этому посту:
#article
https://habr.com/ru/articles/852556/
Ещё одна хорошая статья от того же автора. Хорошая тема — одно дело понимать, как работают горутины, другое — уметь ими правильно пользоваться в разных ситуациях. Благо, за нас уже придумали хорошие решения различных типовых задач и оформили это в виде паттернов. И эта статья — очень неплохой способ с ними познакомиться.
————
UPD: автор статьи здесь также присутствует, можете обращаться к нему в комментариях к этому посту:
Если есть еще какие-то паттерны о которых я забыл, напишите. Дополню статью
#article
Хабр
Паттерны многопоточности в Go
Привет! Ты читаешь эту статью, а значит интересуешься Go и хочешь прокачать свои навыки в многопоточности. Наверняка ты уже знаком и активно пользуешь примитивы многопоточного программирования...
👍31🔥16 5
GO Scheduler: теперь не кооперативный?
https://habr.com/ru/articles/502506/
Да, это довольно старая статья, которая описывает изменения в работе планировщика Go в версии 1.14, которые касались вытеснения горутин.
Статья довольно сложная, но полезная. Поможет лучше осознать, что же там такого интересно произошло в 1.14
Если очень кратко:
Раньше горутину могла прервать только она сама, снаружи можно было лишь поставить флаг о желании её прервать, но проверяла его она сама. Из-за довольно легко можно было написать код, из-за которого горутина никогда не будет вытеснена, а это может привести к дедлоку программы.
В версии же 1.14 появился механизм, который позволяет прерывать такие вот жадные горутины с помощью сигнала SIGURG. Теперь если горутина работает более 10мс, планировщик может легко её прервать.
————
Но в статье это разобрано НАМНОГО подробней, мягко говоря. Настолько хорошего разбора я пока нигде не встречал.
https://habr.com/ru/articles/502506/
Да, это довольно старая статья, которая описывает изменения в работе планировщика Go в версии 1.14, которые касались вытеснения горутин.
Статья довольно сложная, но полезная. Поможет лучше осознать, что же там такого интересно произошло в 1.14
Если очень кратко:
Раньше горутину могла прервать только она сама, снаружи можно было лишь поставить флаг о желании её прервать, но проверяла его она сама. Из-за довольно легко можно было написать код, из-за которого горутина никогда не будет вытеснена, а это может привести к дедлоку программы.
В версии же 1.14 появился механизм, который позволяет прерывать такие вот жадные горутины с помощью сигнала SIGURG. Теперь если горутина работает более 10мс, планировщик может легко её прервать.
————
Но в статье это разобрано НАМНОГО подробней, мягко говоря. Настолько хорошего разбора я пока нигде не встречал.
Хабр
GO Scheduler: теперь не кооперативный?
Если вы читали release notes для версии GO 1.14, то возможно заметили несколько довольно интересных изменений в рантайме языка. Вот и меня очень заинтересовал пункт: «Goroutines are now asynchronously...
👍28🔥11 6❤5
Golang Дайджест
Range Over Function Types https://go.dev/blog/range-functions Подробный пост в официальном блоге разработчиков Go о том, зачем добавили итераторы в Go 1.23, что они из себя представляют, как их использовать, приводят примеры. #go_official #go_1_23
Ranging over functions in Go 1.23
https://eli.thegreenplace.net/2024/ranging-over-functions-in-go-123/
Ещё один неплохой пост про
#go_1_23
https://eli.thegreenplace.net/2024/ranging-over-functions-in-go-123/
Ещё один неплохой пост про
range
по функциям, который ввели в Go v1.23: что это и как пользоваться.#go_1_23
🔥9❤3🤯1
Погружение в интерфейсы Go
https://habr.com/ru/articles/856272/
Отличная комплексная статья по интерфейсам. Автор прошелся практически по всем аспектам, которые касаются темы:
- Что такое интерфейс
- Какая у него внутренняя структура
- Какие связанные вопросы могут задать на собеседованиях
- Пустой интерфейс
- Type Assertion
- Встраивание интерфейсов
- Где лучше размещать интерфейсы❤️
И другое
Читается при этом интересно, приятно. Очень крутая работа, рекомендую
https://habr.com/ru/articles/856272/
Отличная комплексная статья по интерфейсам. Автор прошелся практически по всем аспектам, которые касаются темы:
- Что такое интерфейс
- Какая у него внутренняя структура
- Какие связанные вопросы могут задать на собеседованиях
- Пустой интерфейс
- Type Assertion
- Встраивание интерфейсов
- Где лучше размещать интерфейсы
И другое
Читается при этом интересно, приятно. Очень крутая работа, рекомендую
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Погружение в интерфейсы Go
Интерфейсы — одна из самых сложных тем для начинающих в Go. Я решил тщательно разобраться с этой темой и одновременно написать эту статью. После прочтения этой статьи вы сможете ответить на следующие...
🔥20❤7👍3
GoLang исполнилось 15 лет 🍾
https://go.dev/blog/15years
А в этом посте авторы рассказывают, как он похорошел за последние 5 лет.
https://go.dev/blog/15years
А в этом посте авторы рассказывают, как он похорошел за последние 5 лет.
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
Go Turns 15 - The Go Programming Language
Happy 15th birthday, Go!
❤48👍15🔥11🤯1
Forwarded from Николай Тузов
В каком треде runtime Go проверяет Network Poller?
Anonymous Quiz
13%
В тредах Процессоров (P из модели GMP). То есть, в тех же тредах, в которых выполняются горутины.
40%
В отдельном треде, который не используется Процессорами (P)
6%
И там, и там
12%
Понимаю о чём речь, но не знаю точный ответ
29%
Не понимаю о чём речь
👍12🤯5
Golang Conf 2024
Наверняка многие и так знают, но на всякий случай напоминаю — скоро будет HighLoad++ и в рамках него также Golang Conf 2024.
Когда: 2 и 3 декабря
Я смотрю HL++ практически всегда, без пропусков. И особенно люблю, когда в рамках него проводится ещё и крутая конференция по Go — ещё больше интересных докладов, и не надо их искать среди всех других.
А в этот раз у GoLang Conf будет целых два зала и отдельная секция Хардкор (ассемблер, внутренности, декомпиляция и т.п. Этой секции я особенно рад)
Также будут обсуждаться нововведения в Go v1.23.
Из особенно примечательного лично для меня:
- Секреты высокой производительности в многоядерных системах, Никита Галушко
- Конкурентность в Go: от железа к коду, Максим Горозий
- Ну и, конечно, на котиков Олега посмотрю обязательно✨
Программу, расписание и онлайн-билеты можно найти на сайте.
#партнерский_пост, но рекомендация честная❤
Наверняка многие и так знают, но на всякий случай напоминаю — скоро будет HighLoad++ и в рамках него также Golang Conf 2024.
Когда: 2 и 3 декабря
Я смотрю HL++ практически всегда, без пропусков. И особенно люблю, когда в рамках него проводится ещё и крутая конференция по Go — ещё больше интересных докладов, и не надо их искать среди всех других.
А в этот раз у GoLang Conf будет целых два зала и отдельная секция Хардкор (ассемблер, внутренности, декомпиляция и т.п. Этой секции я особенно рад)
Также будут обсуждаться нововведения в Go v1.23.
Из особенно примечательного лично для меня:
- Секреты высокой производительности в многоядерных системах, Никита Галушко
- Конкурентность в Go: от железа к коду, Максим Горозий
- Ну и, конечно, на котиков Олега посмотрю обязательно
Программу, расписание и онлайн-билеты можно найти на сайте.
#партнерский_пост, но рекомендация честная
Please open Telegram to view this post
VIEW IN TELEGRAM
golangconf.ru
Профессиональная конференция для Go‑разработчиков 2024
👍14❤3
Forwarded from Go Update
🔥 weak: new package providing weak pointers 🔥
Соскучались по интересным изменениям? Их есть у меня!
Начиная с Go 1.24 у нас появится пакет который даст там т.н. "слабые указатели". Суть этих указателей заключается в том, что сборщик мусора вправе в любой момент времени собрать данные на которые они указывают. Т.е. сделать их указатели невалидными.
Простой пример кода:
На самом деле эти указатели появились еще с приходом пакета unique о котором я писал ранее. Но затащить два пакета в рамках одного proposal'а нельзя, поэтому пришлось ждать Go 1.24. Go Core Team (и в особенности Расс Кокс) очень долго сопротивлялись добавлению этого вида указателей в язык, т.н. они ломают абстракцию со сборщиком мусора и имеют очень неочевидные механики взаимодействия с
Основной плюс этого пакета в том, что разработчикам кешей стало намного легче собирать мусор. Даже человек, который слабо помнит алгоритмы, теперь может реализовать LRU кеши элементарно на мапах. Как именно? А вот это я покажу в сообщении о следующем за этим изменении.
Соскучались по интересным изменениям? Их есть у меня!
Начиная с Go 1.24 у нас появится пакет который даст там т.н. "слабые указатели". Суть этих указателей заключается в том, что сборщик мусора вправе в любой момент времени собрать данные на которые они указывают. Т.е. сделать их указатели невалидными.
Простой пример кода:
weakPtr := weak.Make(&SomeStruct{someData})
runtime.GC()
println(weakPtr.Pointer() == nil) // может быть true, а может и false
На самом деле эти указатели появились еще с приходом пакета unique о котором я писал ранее. Но затащить два пакета в рамках одного proposal'а нельзя, поэтому пришлось ждать Go 1.24. Go Core Team (и в особенности Расс Кокс) очень долго сопротивлялись добавлению этого вида указателей в язык, т.н. они ломают абстракцию со сборщиком мусора и имеют очень неочевидные механики взаимодействия с
finalizers
. Однако после добавление пакета unique отрицать необходимость (хоть и редкую) такой вещи стало невозможно, поэтому было принято решение дать ее использовать всем.Основной плюс этого пакета в том, что разработчикам кешей стало намного легче собирать мусор. Даже человек, который слабо помнит алгоритмы, теперь может реализовать LRU кеши элементарно на мапах. Как именно? А вот это я покажу в сообщении о следующем за этим изменении.
pkg.go.dev
weak package - internal/weak - Go Packages
The weak package is a package for managing weak pointers.
🔥24🤔15❤4🤯3
Как писать качественные unit-тесты
https://habr.com/ru/articles/854546/
Немного про unit-тесты и как их прокачать: что такое мутационные тесты и зачем они нужны, что такое стабы и моки, в чем опасность использования моков и др.
Если вы уже умеете писать unit-тесты, но дальнейшие шаги пока не делали, статья вам будет полезна.
https://habr.com/ru/articles/854546/
Немного про unit-тесты и как их прокачать: что такое мутационные тесты и зачем они нужны, что такое стабы и моки, в чем опасность использования моков и др.
Если вы уже умеете писать unit-тесты, но дальнейшие шаги пока не делали, статья вам будет полезна.
Хабр
Как писать качественные unit-тесты: процент покрытия, мутанты и работа с моками
Привет, Хабр! Меня зовут Марина, я Backend-инженер в компании Авито. Сегодня я хочу поделиться собственными рекомендациями, к которым удалось прийти при работе над качеством тестового покрытия...
🔥19
Развлекаемся с итераторами в Go
Перевод и оригинал
Очередной пост про итераторы в Go. Не воспринимайте его как руководство к действию, такого посыла там и нет. Скорее как повод порассуждать.
В чём суть. Автор недоволен громоздкими конструкциями по типу:
И хочет сделать как в JS:
Поэтому он реализовал методы: From (создание итератора), Collect (сбор в слайс), Each (обход), Reverse (разворот), Map (преобразование) и Filter.
Получается, конечно, красиво, но автор сам же признаёт:
А я напомню, что желание красоты, без учёта других потребностей, когда-то привело людей к CoffeeScript.
#iterators #go_1_23
Перевод и оригинал
Очередной пост про итераторы в Go. Не воспринимайте его как руководство к действию, такого посыла там и нет. Скорее как повод порассуждать.
В чём суть. Автор недоволен громоздкими конструкциями по типу:
// В пакете slices нет функций Map, Filter или ForEach
// Это просто пример
slices.ForEach(
slices.Filter(
slices.Map(
slices.Reverse(slices.All([]int{1,2,3,4})),
func(i int) int { return i * i},
),
func(i int) bool { return i % 2 == 0 }
),
func(i int) { fmt.Println(i) }
)
И хочет сделать как в JS:
From([]int{1,2,3,4}).
Reverse().
Map(func(i int) int { return i * i }).
Filter(func(i int) bool { return i%2 == 0 })
Поэтому он реализовал методы: From (создание итератора), Collect (сбор в слайс), Each (обход), Reverse (разворот), Map (преобразование) и Filter.
Получается, конечно, красиво, но автор сам же признаёт:
я понимаю почему команда Go реализовала итераторы по другому
А я напомню, что желание красоты, без учёта других потребностей, когда-то привело людей к CoffeeScript.
#iterators #go_1_23
Хабр
Развлекаемся с итераторами в Go
Релиз версии Go 1.23 добавил поддержку итераторов и пакет iter . Теперь можно перебирать константы, контейнеры ( map , slice , array , string ) и функции. Сначала создание итератора показалось...
👍8🤔3
Автоматизация напоминаний клиентам
https://habr.com/ru/companies/exolve/articles/861346/
Туториал по созданию системы автоматических напоминаний. Как обучающий материал, вполне неплохо.
Но для более серьёзного использования выглядит плохо. Ниже я объясняю почему, плюс подписчик в комментах добавил ещё замечаний, за что ему отдельная благодарность.
В чём суть: клиент соглашается на что-то во время разговора, и через месяц автоматически получает SMS-напоминание.
Технически это реализовано через связку звонка и транскрибации (Exolve API), анализа текста, планирования и отправки SMS. Всё на Go + SQLite.
————
Теперь позволю себе немного покритиковать текст:
1) При поиске согласия не учитывается контекст: просто ищутся слова "да", "согласен", "конечно" где угодно в тексте. Но диалог может быть таким:
- Вам интересно?
- Да, но сейчас не готов
Или:
- Раньше было да, а сейчас нет
И система посчитает это за согласие
2) Отправка SMS планируется в памяти, с помощью
Нужно хранить задачи на отправку (не только общую инфу) в базе и использовать какой-то планировщик.
3) Отсутствие учёта часовых поясов: SMS отправляются ровно через месяц без учёта времени клиента. Можно разбудить человека в 3 часа ночи.
Также стоило бы написать пару слов по поводу аутентификации веб-хука.
Я понимаю, что это может быть очень упрощённый пример, но в таком случае стоило хотя бы оговорку сделать.
#automation #sqlite
https://habr.com/ru/companies/exolve/articles/861346/
Туториал по созданию системы автоматических напоминаний. Как обучающий материал, вполне неплохо.
Но для более серьёзного использования выглядит плохо. Ниже я объясняю почему, плюс подписчик в комментах добавил ещё замечаний, за что ему отдельная благодарность.
В чём суть: клиент соглашается на что-то во время разговора, и через месяц автоматически получает SMS-напоминание.
Технически это реализовано через связку звонка и транскрибации (Exolve API), анализа текста, планирования и отправки SMS. Всё на Go + SQLite.
————
Теперь позволю себе немного покритиковать текст:
1) При поиске согласия не учитывается контекст: просто ищутся слова "да", "согласен", "конечно" где угодно в тексте. Но диалог может быть таким:
- Вам интересно?
- Да, но сейчас не готов
Или:
- Раньше было да, а сейчас нет
И система посчитает это за согласие
2) Отправка SMS планируется в памяти, с помощью
time.AfterFunc
: если сервис перезапустится, все запланированные сообщения пропадут.Нужно хранить задачи на отправку (не только общую инфу) в базе и использовать какой-то планировщик.
3) Отсутствие учёта часовых поясов: SMS отправляются ровно через месяц без учёта времени клиента. Можно разбудить человека в 3 часа ночи.
Также стоило бы написать пару слов по поводу аутентификации веб-хука.
Я понимаю, что это может быть очень упрощённый пример, но в таком случае стоило хотя бы оговорку сделать.
#automation #sqlite
Хабр
«Напомните через месяц?»: как автоматизировать напоминания клиентам с Golang, SQLite и вебхуками
Привет, Хабр! Представим ситуацию: вы клиент. Разговор с менеджером завершён, он предложил вам что-то полезное — услугу, продукт или подписку — и, допустим, вы соглашаетесь: «Почему бы и нет, отличная...
👍20
Go 1.23: Interactive release notes
https://antonz.org/go-1-23/
Ещё немного про v1.23. Недавно мне скинули вот такую крутую страничку, где про новведения не только можно почитать, но и потыкать не отходя от кассы. Очень удобно.
Ну и текст написан хорошо.
Лучи добра и уважения автору❤️
#go_1_23
https://antonz.org/go-1-23/
Ещё немного про v1.23. Недавно мне скинули вот такую крутую страничку, где про новведения не только можно почитать, но и потыкать не отходя от кассы. Очень удобно.
Ну и текст написан хорошо.
Лучи добра и уважения автору
#go_1_23
Please open Telegram to view this post
VIEW IN TELEGRAM
antonz.org
Go 1.23 interactive tour
Iterators, timers and canonical values.
👍20🔥7❤3🤯1
Netpoll: пишем сервера, которые не умирают от нагрузки
https://habr.com/ru/companies/otus/articles/859964/
Небольшой обзор библиотеки Netpoll и гайд по использованию. Сразу отмечу, что статья хороша именно как обзор, а не как серьезный технический текст, т.к. автор статьи будто бы пытается нам её продать, делая громкие заявления, вроде таких:
Это заявление весьма преувеличено — "низкоуровневый доступ к системе" через epoll/kqueue здесь подаётся как уникальное преимущество Netpoll, хотя стандартный runtime Go тоже использует netpoller с epoll/kqueue для эффективной работы с сетевыми соединениями, да и горутины в Go достаточно легковесны (~2KB), чтобы обрабатывать множество соединений при достаточной памяти. В общем, тысяча соединений - совсем не тот порог, где net начинает "задыхаться"
Но при этом сама библиотека Netpoll и правда интересна, пусть и для каких-то особых кейсов. Она предоставляет событийно-ориентированную альтернативу стандартному подходу Go с горутинами для сетевых соединений.
Ключевые особенности:
- Не создаёт горутину на соединение — ключевое, на мой взгляд
- Напрямую работает с epoll/kqueue
- Предоставляет zero-copy API для работы с данными — т.е. позволяет работать с памятью напрямую, избегая лишнего копирования
Реальные преимущества могут быть в специфических сценариях с очень большим числом соединений и строгими требованиями к latency. Но нужны конкретные бенчмарки - в статье их, к сожалению, нет.
Для большинства задач стандартная библиотека net + встроенный netpoller будут отлично работать, вопреки драматичным заявлениям в статье о проблемах после "тысячи соединений". Хотя, автор от части тоже это признаёт, вопрос лишь в границе этого разделения:
Сама статья скорее практическая — автор показывает, как настроить Listener и EventLoop, работать с nocopy API, создать клиент и настроить мониторинг через Prometheus.
————
В любом случае, автору статьи спасибо, что подсветил эту библиотеку и передал основную суть, а также за примеры использования. Раньше я с ней не сталкивался, так что было интересно ознакомиться❤️
Буду рад, если кто-то поделится своими бенчмарками или опытом использования Netpoll в реальных проектах.
#networking #performance #netpoll
https://habr.com/ru/companies/otus/articles/859964/
Небольшой обзор библиотеки Netpoll и гайд по использованию. Сразу отмечу, что статья хороша именно как обзор, а не как серьезный технический текст, т.к. автор статьи будто бы пытается нам её продать, делая громкие заявления, вроде таких:
Если вы уже успели поиграться со стандартной библиотекой net, то знаете: она классная... до поры до времени. Как только подключений становится больше тысячи, начинается боль: блокировки, миллионы горутин и изматывающее профилирование.
А вот Netpoll решает всё это за счёт асинхронности и низкоуровневого доступа к системе. Она использует epoll на Linux и kqueue на macOS
Это заявление весьма преувеличено — "низкоуровневый доступ к системе" через epoll/kqueue здесь подаётся как уникальное преимущество Netpoll, хотя стандартный runtime Go тоже использует netpoller с epoll/kqueue для эффективной работы с сетевыми соединениями, да и горутины в Go достаточно легковесны (~2KB), чтобы обрабатывать множество соединений при достаточной памяти. В общем, тысяча соединений - совсем не тот порог, где net начинает "задыхаться"
Но при этом сама библиотека Netpoll и правда интересна, пусть и для каких-то особых кейсов. Она предоставляет событийно-ориентированную альтернативу стандартному подходу Go с горутинами для сетевых соединений.
Ключевые особенности:
- Не создаёт горутину на соединение — ключевое, на мой взгляд
- Напрямую работает с epoll/kqueue
- Предоставляет zero-copy API для работы с данными — т.е. позволяет работать с памятью напрямую, избегая лишнего копирования
Реальные преимущества могут быть в специфических сценариях с очень большим числом соединений и строгими требованиями к latency. Но нужны конкретные бенчмарки - в статье их, к сожалению, нет.
Для большинства задач стандартная библиотека net + встроенный netpoller будут отлично работать, вопреки драматичным заявлениям в статье о проблемах после "тысячи соединений". Хотя, автор от части тоже это признаёт, вопрос лишь в границе этого разделения:
Но не всё так идеально. Если вы пишете простой REST API, Netpoll вам вряд ли нужен. Зато если у вас чаты, игровые серверы, вебсокеты или TCP-прокси — это для вас.
Сама статья скорее практическая — автор показывает, как настроить Listener и EventLoop, работать с nocopy API, создать клиент и настроить мониторинг через Prometheus.
————
В любом случае, автору статьи спасибо, что подсветил эту библиотеку и передал основную суть, а также за примеры использования. Раньше я с ней не сталкивался, так что было интересно ознакомиться
Буду рад, если кто-то поделится своими бенчмарками или опытом использования Netpoll в реальных проектах.
#networking #performance #netpoll
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Netpoll: пишем сервера, которые не умирают от нагрузки
Вы знаете, что обычные сетевые библиотеки Go начинают « тяжело дышать », если их нагрузить десятками тысяч соединений? Неважно, делали вы HTTP API или свой TCP сервер — дефолтные инструменты вроде net...
👍26
Golang Дайджест
Netpoll: пишем сервера, которые не умирают от нагрузки https://habr.com/ru/companies/otus/articles/859964/ Небольшой обзор библиотеки Netpoll и гайд по использованию. Сразу отмечу, что статья хороша именно как обзор, а не как серьезный технический текст…
Интересное из комментов
Как пишет nuklearlord, это не первая попытка создать event-driven сетевую библиотеку для Go, предлагая альтернативу стандартному подходу "One Conn One Goroutine":
- evio first commit - Jul 4, 2017
- gnet first commit - Sep 7, 2019
- cloudwego/netpoll first commit - Feb 25, 2021
И интересный комментарий от Алексея Акуловича:
————
Также если вам интересна эта тема, стоит обратить внимание на доклад Алексея Акуловича на GopherCon Russia 2018 про ускорение TCP путём избавления от слоёв абстракций в stdlib Go. Там не было готовой либы, только примеры в репе, но объяснялось где и на чем теряем, и какие альтернативы.
#networking #performance #netpoll
Как пишет nuklearlord, это не первая попытка создать event-driven сетевую библиотеку для Go, предлагая альтернативу стандартному подходу "One Conn One Goroutine":
- evio first commit - Jul 4, 2017
- gnet first commit - Sep 7, 2019
- cloudwego/netpoll first commit - Feb 25, 2021
nuklearlord:
Между тем ключевой вопрос - как прикрутить TLS, не могут решить годами (в том числе потому, что стек TLS в Go нужно переписывать под асинхрон):
https://github.com/tidwall/evio/issues/28 "TLS support ?" - Nov 13, 2018
https://github.com/panjf2000/gnet/issues/16 "TLS support ?" - Sep 24, 2019
И без вот этого TLS не получится написать высокопроизводительные аналоги nginx или unbound... И про "focus on scenarios like Redis, HAProxy" тоже самое, TLS там же тоже не нужен...
И интересный комментарий от Алексея Акуловича:
AterCattus:
У меня тоже в 2017 была первая попытка (весьма успешная) самописной оберки поверх epool, ибо встренное ну никуда не годилось. Потом еще несколько реинкарнаций.
Но в наше время как раз таки сменился фокус на grpc, ибо по работе примерно все общение сервисов на нем, а реализация в google.golang.org/grpc отвратительна по эффективности (на GoFunc рассказывал подробности и что можно сделать).
P.S. У Go несколько лет назад (сейчас, емнип, уже исправили) при работе http2 на каждое соединение уходило по три горутины. Весело было, когда нужно хотя бы 100к коннектов держать.
————
Также если вам интересна эта тема, стоит обратить внимание на доклад Алексея Акуловича на GopherCon Russia 2018 про ускорение TCP путём избавления от слоёв абстракций в stdlib Go. Там не было готовой либы, только примеры в репе, но объяснялось где и на чем теряем, и какие альтернативы.
#networking #performance #netpoll
👍19🔥8❤4
Сколько памяти нужно в 2024 году для выполнения миллиона конкурентных задач?
https://habr.com/ru/articles/862482/
Забавное исследование, но комментировать я его, пожалуй, не буду🌚
https://habr.com/ru/articles/862482/
Забавное исследование, но комментировать я его, пожалуй, не буду
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯18🤔7👍4❤1
Готовим слайсы в Go: подробно о динамических массивах, строчках и ускорении
https://habr.com/ru/companies/yadro/articles/874480/
Ещё одна неплохая и очень подробная статья про слайсы с глубоким погружением.
Что разобрано:
- Внутреннее устройство слайсов и как растёт их capacity. Также затронут интересный момент про округление вместимости из-за особенностей хранения объектов в хипе, про который редко пишут
- Разные способы создания слайсов и когда какой вариант лучше (пустой слайс,
- Передача слайсов в функции: по значению vs по указателю
- Работа со строками, конкатенация и оптимизации компилятора
- Подробный разбор
- Тонкости копирования при
- Использование
- Сравнение разных способов конкатенации строк на больших и маленьких объёмах данных
И много ещё интересного.
Особенно порадовали бенчмарки в конце с неожиданными результатами — strings.Join() может работать эффективнее чем bytes.Buffer.
В общем, рекомендую к прочтению👾
#performance #slices #strings #article
https://habr.com/ru/companies/yadro/articles/874480/
Ещё одна неплохая и очень подробная статья про слайсы с глубоким погружением.
Что разобрано:
- Внутреннее устройство слайсов и как растёт их capacity. Также затронут интересный момент про округление вместимости из-за особенностей хранения объектов в хипе, про который редко пишут
- Разные способы создания слайсов и когда какой вариант лучше (пустой слайс,
make(len)
, make(0, cap)
и т.д.).- Передача слайсов в функции: по значению vs по указателю
- Работа со строками, конкатенация и оптимизации компилятора
- Подробный разбор
bytes.Buffer
vs strings.Builder
и их особенностей- Тонкости копирования при
[]byte → string
и обратно- Использование
sync.Pool
для переиспользования памяти — как не забыть "вернуть" объект в пул и почему со strings.Builder
это не работает- Сравнение разных способов конкатенации строк на больших и маленьких объёмах данных
И много ещё интересного.
Особенно порадовали бенчмарки в конце с неожиданными результатами — strings.Join() может работать эффективнее чем bytes.Buffer.
В общем, рекомендую к прочтению
#performance #slices #strings #article
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Готовим слайсы в Go: подробно о динамических массивах, строчках и ускорении
Привет, Хабр! Меня зовут Владислав Белогрудов, я работаю в команде разработки интерфейсов и сервисов управления в YADRO. Мой текущий проект — информационная система на Go. В рамках проекта я...
🔥21👍11❤9