Golang Portal
8.03K subscribers
415 photos
26 videos
7 files
446 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Golang-разработчика

Связь: @devmangx
Download Telegram
Leak and Seek: A Go Runtime Mystery

Статья описывает расследование команды Cyolo, связанное с утечкой памяти в приложении на языке Go. После сообщений клиентов о проблемах с производительностью команда обнаружила, что утечка связана с объектами SqliteRows, SqliteStmt и SqliteConn в драйвере SQLite3.

Они исследовали возможность циклических ссылок и проблемы с механизмом финализаторов в Go, но выяснили, что причиной была блокировка горутины финализатора из-за функции Close в пакете go-smb2, выполняющей потенциально блокирующие операции ввода-вывода.

Это приводило к задержке освобождения памяти и утечке ресурсов. В результате команда предложила улучшения для мониторинга финализаторов и сообщила о найденных проблемах сообществу Go

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92😁2
Продолжайте работу с контекстами с помощью context.WithoutCancel()

Мы уже знаем, что при отмене родительского контекста отменяются и все его дочерние контексты, верно?
Но иногда это поведение нежелательно.

Есть случаи, когда нужно, чтобы определённые операции продолжались, даже если родительский контекст был отменён.

Представьте, что вы обрабатываете HTTP-запрос, и при его отмене (например, из-за таймаута или разрыва соединения с клиентом) всё ещё необходимо залогировать информацию о запросе и собрать метрики.

«Ха, просто создам новый контекст для этих операций»


Это возможно, но новый контекст не содержит значений из исходного контекста события, которые важны, например, для логирования или сбора метрик.

Передача значений возможна только через дочерний контекст.
Возвращаясь к примеру с HTTP-запросом, решение следующее:

context.WithoutCancel позволяет создать дочерний контекст, который не будет отменён при отмене родительского. Это обеспечивает завершение нужных операций даже после отмены запроса.

Кстати, эта функция появилась в Go 1.21. ✌️

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113
⚙️ Go-пакет, совместимый с http.Client и полностью заменяющий его, который под капотом использует настоящий headless-браузер (Chrome через chromedp) для загрузки и взаимодействия с веб-страницами

https://github.com/gleicon/browserhttp

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Избегайте использования math/rand, вместо этого используйте crypto/rand для генерации ключей

Когда вы работаете над проектами, где нужно генерировать ключи — например, для шифрования или создания уникальных идентификаторов — качество и безопасность этих ключей имеют большое значение.

Почему не math/rand?

Пакет math/rand генерирует псевдослучайные числа.

Это означает, что если известен способ генерации чисел (seed), можно предсказать их значения.
Даже если использовать в качестве seed текущее время (например, time.Now().UnixNano()), уровень непредсказуемости (энтропии) остаётся низким, потому что время между запусками не сильно отличается.

Почему crypto/rand?

Пакет crypto/rand предоставляет способ генерации криптографически стойких случайных чисел.

Он спроектирован таким образом, чтобы быть непредсказуемым, используя источники случайности от операционной системы, которые гораздо сложнее предугадать.
crypto/rand подходит для шифрования, аутентификации и других операций, чувствительных к безопасности.

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍202
⚙️ Библиотека обработки ошибок на Go с читаемыми трассировками стека и гибкой поддержкой форматирования

https://github.com/rotisserie/eris

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Не допускайте сбоя: паттерн повторной попытки (Retry Pattern) в Go

Статья объясняет, как реализовать паттерн повторных попыток (retry) в Go для обработки временных сбоев — например, сетевых ошибок.

Описываются разные стратегии (фиксированная задержка, экспоненциальный бэкофф с джиттером) и дается пример универсального retry-механизма.

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
11👎1
API маршрутизатор для серверов #MCP, написанный на Go

https://github.com/chatmcp/mcprouter

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
Получаем указатели проще с помощью дженериков

Небольшой совет для тех, кто пишет на Go и часто сталкивается с необходимостью получить указатель на значение.

Раньше вы, возможно, делали так (1 картинка)

Или пытались уместить всё в одну строчку, используя небольшой трюк (2 картинка)

Такой способ рабочий, но выглядит громоздко, особенно если приходится делать это часто для разных типов данных.

Теперь давайте посмотрим на более простой и современный способ с дженериками (3 картинка)

Эта небольшая функция позволяет создавать указатель для любого типа значения, не повторяя один и тот же код снова и снова.

Просто передайте своё значение в функцию Ptr, и вы получите нужный указатель (4 картинка)

Такой подход делает код чище и избавляет от лишнего дублирования.

Больше не нужно писать отдельные функции или вручную обрабатывать указатели для каждого типа. Держите код простым и сосредоточьтесь на главном.

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6👎4🤔2
Инструмент, который сканирует указанные организации или учетные записи пользователей на GitHub в поиске публичных Go-модулей, парсит их прямые зависимости из файлов go.mod и генерирует граф зависимостей в формате DOT или топологически отсортированный список

https://github.com/ldemailly/depgraph

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Мы переезжаем на новую архитектуру и ищем для этого Go-разработчиков. Требования простые:

• Вы хорошо пишете код.
• Вас не пугает мысль, что десятки миллионов людей будут пользоваться вашим кодом каждый день.
• Вы умеете играть в Go.

Узнать про стек, задачи, команду и условия можно будет на специальном митапе для Go-разработчиков 24 апреля. Будет два варианта встречи:

Офлайн: В нашем питерском офисе у Красного моста. Будет мило, с неформальным общением и возможностью потрогать живых VK-разрабов.

Онлайн: Прямая трансляция для тех, кто любит Питер, но живёт не там.

❗️ВАЖНО: Чтобы попасть (и офлайн, и онлайн), нужно зарегистрироваться по ссылке.
👍5
Стриминг больших файлов между микросервисами: Реализация на Go

Этот проект демонстрирует практическую реализацию на Go для эффективной передачи больших файлов или объёмных payload'ов между микросервисами. Он напрямую отвечает на задачу, озвученную Сумитом Мукхиджей в этом твите:

"Вашему микросервису нужно передавать большие объёмы данных (например, файлы, изображения) между сервисами. Как вы спроектируете коммуникацию, чтобы избежать узких мест в производительности и эффективно обрабатывать большие payload'ы?"


Реализация предлагает решение на основе стандартного HTTP-протокола, с акцентом на следующие аспекты:

🔹Эффективное использование памяти: исключается загрузка целого файла в память как на клиенте, так и на сервере.

🔹Эффективность по пропускной способности: применяется выборочное сжатие для подходящих типов контента с целью снижения сетевого трафика.

🔹Устойчивость: реализована поддержка возобновляемых загрузок для корректной обработки сетевых сбоев.

🔹Производительность: используется буферизация ввода/вывода и возможности стандартной библиотеки Go для оптимизации операций.

Полный исходный код реализации доступен здесь

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍5😁2
⚙️ Альтернатива демонa auditd, поставляемому со многими дистрибутивами Linux

https://github.com/slackhq/go-audit

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🤔1
Объяснение CPU requests и limits в контейнерах с настройкой GOMAXPROCS

Одна из самых интересных статей, которые я читал в последнее время

В ней объясняется:

🔹Как на самом деле работают CPU requests и limits, включая внутренние механизмы

🔹Почему установка GOMAXPROCS важна для Go-приложений, работающих в контейнеризованных средах

🔹Как на самом деле работает uber-go/automaxprocs

🔹Какие метрики можно использовать, чтобы определить, подвергается ли контейнер throttling'у

И многое другое

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75🔥2
Писать неудобный код — сложно, но приходится

Когда я делаю ревью, я всегда убеждаю писать такой код, который может быть неудобно реализовывать, но который удобно использовать и сложно неправильно применить.

Например, чтобы обновить документ в базе данных — почему бы просто не передать клиенту map[string]any, чтобы он сам обновил, что ему нужно?
Лично я такое не приемлю, особенно в командной работе.

Я бы ограничил, какие поля может обновлять клиент, и валидировал бы всё перед записью в базу, даже если для этого нужно больше кода, больше функций.

Я не хочу давать клиенту лишние шансы ошибиться.

Использование any, map[string]interface{}, возврат пустых error, глобальные переменные, сваливание всех хелперов в shared/utils, создание монолитных общих интерфейсов, игнорирование ошибок (или возвращаемых значений) без комментариев, написание огромных функций без разбиения, использование context.Background() ради скорости, возврат 3–4 значений, хардкод вместо констант, наплевательское отношение к дизайну и зависимостям между пакетами, сваливание всех моделей в models/model.go

Я не утверждаю, что всё это всегда плохо — как обычно, всё зависит от контекста.

Опытные разработчики знают, когда можно отойти от правил, но никогда не злоупотребляют этим.

Каждая из этих практик сама по себе может быть не критична, но в сумме они могут привести к серьёзным проблемам в будущем.

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
👍147🔥3
⚙️ Функционально насыщенный, быстрый и гибкий контроллер входящего трафика, нативный для Kubernetes, и шлюз API следующего поколения, построенный на базе Envoy, реализованный на Go.

https://github.com/solo-io/gloo

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54