💣 defer: Три ловушки, в которые попадают даже сеньоры
Команда defer - это лучшее, что случалось с управлением ресурсами. Написал Lock(), тут же добавил defer Unlock(), и спишь спокойно. Больше никаких забытых закрытых файлов или коннектов к БД на ветках возврата с ошибкой.
Но под этой элегантностью скрывается несколько неочевидных механизмов, которые регулярно взрывают продакшен.
Давайте заглян…
♻️ sync.Pool: Как перестать кормить Garbage Collector'а
Представьте, что вы работаете в кофейне. Приходит клиент, вы покупаете новую керамическую кружку, наливаете кофе, отдаете клиенту. Он выпивает кофе и... выбрасывает кружку в мусорку. А вы идете покупать новую.
Звучит как бред? Но именно так ведет себя ваш код, когда вы создаете буферы make([]byte, 4096) внутри HTTP-хендлера, который обрабат…
🌊 io.Reader и io.Writer: Лего для взрослых (и спасение от OOM)
Знакомый сценарий: микросервис скачивает отчет из внешней системы. Когда вы его писали, отчет весил 5 МБ. Через полгода бизнес вырос, отчет весит 5 ГБ. Ваш под в Kubernetes ловит OOM (Out Of Memory) и бесславно умирает.
Что делает в такой ситуации джуниор? Пытается увеличить лимиты памяти в Helm-чартах.
Почему так вышло? Потому что к…
Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟
В продолжение темы про аллокации в куче. Если ваш высоконагруженный бэкенд создает тысячи временных объектов в секунду (например, буферы для сборки ответов на HTTP-запросы или парсинга JSON), сборщик мусора (GC) начинает задыхаться, сжигая драгоценное процессорное время.
Чтобы не выделять память каждый раз заново, в Go есть встроенны…
Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protobuf и OpenTelemetry
Современная микросервисная архитектура требует стандартизированных подходов к транспорту, сериализации данных и мониторингу. Понимание данного набора технологий необходимо для проектирования, эксплуатации и отладки распределенных систем.
HTTP(S)
Фундаментальный протокол взаимодействия. Базовые знан…
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода
Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, боремся с аллокациями. Но что, если я скажу, что в новых версиях Go (начиная с 1.21) можно ускорить приложение на 5-10%, просто подкинув компилятору один файлик?
Profile-Guided Optimization (PGO).
В чем проблема обычного компилятора?
При стандартной сборке к…
🚀 Базовые паттерны проектирования в Go: Пишем чистый код
Go не является классическим объектно-ориентированным языком. Здесь нет классов и наследования в привычном понимании, поэтому многие "книжные" паттерны (GoF) реализуются иначе. В Go делается упор на композицию, неявные интерфейсы и функции высшего порядка.
Давайте разберем основные паттерны, которые чаще всего встречаются в продакшен-коде н…