Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟 В продолжение темы про аллокации в куче. Если ваш высоконагруженный бэкенд создает тысячи временных объектов в секунду (например, буферы для сборки ответов на HTTP-запросы или парсинга JSON), сборщик мусора (GC) начинает задыхаться, сжигая драгоценное процессорное время. Чтобы не выделять память каждый раз заново, в Go есть встроенный и мощный инструмент - sync.Pool. Что это такое? Это потокобезопасный механизм для хранения и переиспользования временных объектов. Как это работает: • Метод Get() достает объект из пула. Если пул пус…
Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protobuf и OpenTelemetry Современная микросервисная архитектура требует стандартизированных подходов к транспорту, сериализации данных и мониторингу. Понимание данного набора технологий необходимо для проектирования, эксплуатации и отладки распределенных систем. HTTP(S) Фундаментальный протокол взаимодействия. Базовые знания должны включать не только структуру запроса и ответа (заголовки, методы, коды состояния), но и механизмы работы на уровне сетевого стека: • Особенности установки защищенного соединения (TLS-хендшейк…
🚀 PGO: Как получить +10% к скорости, не написав ни строчки кода Все мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, боремся с аллокациями. Но что, если я скажу, что в новых версиях Go (начиная с 1.21) можно ускорить приложение на 5-10%, просто подкинув компилятору один файлик? Profile-Guided Optimization (PGO). В чем проблема обычного компилятора? При стандартной сборке компилятор опирается на эвристики. Он смотрит на функцию и гадает: "Наверное, эту функцию вызывают часто, давай-ка я её заинлайню (inline), чтобы сэкономить на вызове". Но компилятор не знает, как ваш ко…
🚀 Базовые паттерны проектирования в Go: Пишем чистый код Go не является классическим объектно-ориентированным языком. Здесь нет классов и наследования в привычном понимании, поэтому многие "книжные" паттерны (GoF) реализуются иначе. В Go делается упор на композицию, неявные интерфейсы и функции высшего порядка. Давайте разберем основные паттерны, которые чаще всего встречаются в продакшен-коде на Go. 🛠 Порождающие паттерны (Creational) Эти паттерны решают задачи безопасного и удобного создания объектов. • Factory (Фабрика): В Go фабрики обычно представляют собой функции, начинающиеся с New...…
⚙️ Go Runtime изнутри: GMP, GC, escape analysis и memory model Почему Go "просто работает" быстро без ручного управления потоками — разбираем механику под капотом. 1. GMP-модель планировщика Три сущности: - G (Goroutine) — сама горутина: стек (растёт от 2KB), инструкция, статус - M (Machine) — реальный OS-поток, который выполняет код - P (Processor) — логический процессор, держит локальную очередь горутин (runqueue) и служит "разрешением" на выполнение Ключевая идея: GOMAXPROCS задаёт число P, а не M. M может блокироваться на syscall — тогда P отвязывается от него и находит себе другой свобод…