Обновить
325.09

Go *

Компилируемый, многопоточный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Один сервис — четыре стека: практический бенчмарк с SLO по p99 и Docker/JMeter

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели593

В статье я сравниваю четыре реализации одного и того же сервиса поверх PostgreSQL:

1. Spring MVC + JDBC

2. Spring WebFlux + R2DBC

3. Ktor + JDBC

4. Go + pgx

Все сервисы крутятся в Docker с одинаковыми ресурсными лимитами и прогоняются через один и тот же JMeter-план. Для каждого стека я ищу максимальный RPS при соблюдении SLO по p99-латентности.

Я подробно разбираю:

- как устроен стенд (Docker-compose, Postgres, Prometheus, Grafana, JMeter);

- как реализованы сервисы и чем различаются модели конкурентности;

- методологию нагрузочного тестирования и расчёта RPS@p99≤SLA;

- как реально ведут себя блокирующий стек, реактивный стек и Go под честной нагрузкой.

Читать далее

Новости

Как мы в Авито нашли баланс между качеством и скоростью разработки на примере фичи рекомендаций Автотеки

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели9K

Всем привет! Меня зовут Михаил Пашедко, я backend-разработчик в Авито в команде Автотека. В статье расскажу, как небольшой эксперимент на пару спринтов стал полноценным направлением разработки — и показал, как в зрелой компании можно запускать живые, «стартаперские» инициативы, не теряя при этом контроль над качеством.

Читать далее

Go 1.25: GOMAXPROCS учитывает CPU-лимиты в контейнерах

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели5.2K

До Go 1.25 рантайм по умолчанию выставлял GOMAXPROCS по числу логических CPU на ноде — и в контейнерах это регулярно приводило к странным эффектам: лишние потоки, перерасход квоты и жёсткий троттлинг cgroups с неприятной просадкой задержек, особенно в «хвосте». В статье разбираем, как устроено планирование горутин, чем CPU-лимиты в Kubernetes отличаются от ограничения параллелизма, и почему новый дефолт GOMAXPROCS делает поведение Go в продакшене заметно предсказуемее.

Разобраться глубже

1000 и один способ угробить программу из-за гонки данных в Go

Уровень сложностиПростой
Время на прочтение14 мин
Охват и читатели5.6K

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

Читать далее

Визуальный язык программирования в NebuLeet: эволюция и дизайн

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели12K

Пару лет я в соло разрабатывал максимально нишевую игру "для программистов" (NebuLeet) на довольно нишевых технологиях (Go + ebitengine), и вот теперь, после релиза, я хочу рассказать про одну из интересных особенностей этой игры - визуальном программировании логики игровых юнитов.

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

Вас ждёт увлекательная околокомпиляторная/языковая статья с игровым применением. Всё-таки, языки программирования для игр - это ведь отдельный жанр.

Читать далее

Разработчики всё ещё путают JWT, JWKS, OAuth2 и OpenID Connect — разбираем на примерах. Часть 1

Уровень сложностиПростой
Время на прочтение27 мин
Охват и читатели12K

JWT, SSO, OAuth, OpenID Connect — названия знакомые каждому разработчику. Но стоит спросить: «Зачем в продакшене нужен JWKS?» или «Чем отличается OAuth2 от OpenID Connect?» — уверенность сразу исчезает.

В этой статье мы разберём как устроен JWT и его подпись, зачем нужны access и refresh токены, что такое JWKS и в чём отличие OAuth от OpenID Connect.

Вместо скучных стандартов и спецификаций протоколов в статье будет один наглядный образ на примере отелей и пропусков. Это позволит не только запомнить, но и прочувствовать на реальных примерах, избавиться от хаоса и путаницы в голове, когда речь заходит об аутентификации и авторизации. Цель статьи — не дать «рецепт внедрения», а дать возможность понять, как это работает внутри и «пощупать» эти темы на Go

Читать далее

От Electron к Tauri: как я пересобрал архитектуру десктоп-приложения и почему Rust оказался к месту

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели10K

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

Сразу оговорюсь: это не попытка доказать, что «Electron — зло», а Rust — «спаситель». Это скорее дневник архитектора, который хотел собрать удобный продукт и по дороге несколько раз наступил на грабли. Некоторые грабли были с подогревом.

Читать далее

SQLSet — отделяем GO код от SQL-запросов

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели7.1K

Мухи — отдельно, котлеты — отдельно. Отделяем Go-код от SQL-запросов. Зачем это делать и как?Личный опыт миграции большого проекта на новую СУБД показал: смешивание SQL с кодом приложения создаёт проблемы. Представляю простую библиотеку SQLSet для хранения именованных SQL-запросов в отдельных файлах.

Читать далее

Zero Values и никакого undefined: Чему Go научит JS-разработчика (Часть 2)

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели10K

Синтаксис Go глазами того, кто последние пять лет писал на TypeScript.

В первой части мы разобрались с философией Go и настройкой рабочего окружения. Теперь к коду. Эта статья про синтаксис и ключевые концепции Go. Не ждите пересказа документации. Будут сравнения, будут подводные камни, будет код.

Читать далее

Почему Go, Rust и Zig такие разные: ценности, компромиссы и назначение языков

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели9.7K

Команда Go for Devs подготовила перевод статьи о трёх языках, которые всё чаще оказываются в одном ряду, но на самом деле решают принципиально разные задачи: Go, Rust и Zig. Автор несколько месяцев изучал каждый из них и попытался понять, какие ценности стоят за их устройством. Go выбирает минимализм и корпоративную предсказуемость, Rust — безопасность и максимальную выразительность, Zig — радикальный контроль и отказ от ООП-мышления. Получился честный и местами провокационный разбор того, зачем нужны эти языки и кому из разработчиков они подходят.

Читать далее

Чистим main.go: предсказуемый старт и надежный Graceful Shutdown

Время на прочтение4 мин
Охват и читатели6.1K

Сталкивались ли вы с болью при управлении порядком запуска и остановки зависимостей в вашем Go-сервисе?

Разработка больших сервисов неизбежно приводит к необходимости управлять множеством зависимостей. В этом контексте мы говорим о долгоживущих компонентах, чья работа обеспечивается отдельными горутинами: как правило, это блокирующий метод (например, Start), внутри которого крутится цикл обработки.

Примерный сценарий жизненного цикла сервиса выглядит так:

При запуске критически важно, чтобы пул соединений с БД, кэш и очереди были полностью готовы до того, как HTTP-сервер откроет порт и начнет принимать входящий трафик.

С graceful shutdown ситуация обратная: порядок должен быть строго зеркальным. Сначала нужно перестать принимать новые запросы, дождаться завершения текущих, остановить воркеры, и только потом разрывать соединения с инфраструктурой. Иначе мы получаем неприятные ошибки подключения и даже потерянные транзакции в момент деплоя.

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

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

Читать далее

Golang: Пакет для мульти-логирования на основе log/Slog

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели6.6K

Golang: Пакет для мульти-логирования на основе log/Slog

Привет Хабр! Это моя первая статья тут, я надеюсь получилось читабельно и интересно :-)

В статье я описываю свой небольшой проект мульти-логера, написанный на основе распространённого в go пакета log/Slog.

Читать далее

Минимальный набор практик для микросервиса

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели13K

Я собрал минимальный набор практик, без которых микросервис очень быстро превращается в «чёрный ящик»: логи, трассировка, метрики, конфигурация, feature flags, тестирование и чуть-чуть документации. Это не теория — это вещи, которые я выстрадал, пока делал Go-шаблон для коллег, переходящих после Ruby/PHP, и пытался сделать так, чтобы сервис было реально удобно запускать, отлаживать и поддерживать.

Внутри — простые объяснения, почему эти штуки окупаются, и примеры на Go: как разделить логи и связать их с trace_id, как руками добавить span, какие метрики имеет смысл считать, как организовать конфиг, зачем OpenFeature, почему testcontainers — это не боль, и почему Makefile иногда экономит больше времени, чем очередной «идеальный рефакторинг».

Читать далее

Ближайшие события

Скажи yay -S say

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели16K

Статья содержит описание работы утилиты для видео звонков из командной строки say. Рассказывается о том как всё устроено под капотом, как оптимизированно и почему всё работает так быстро с минимальным размером памяти и нагрузки на CPU.
Так же небольшой обзор утилиты see для просмотра фильмов опять же в окне терминала.

Читать далее

Ассемблер для гоферов. Структура и макросы. Часть 2

Время на прочтение8 мин
Охват и читатели13K

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

Читать далее

Бросаем Event Loop, переходим на Горутины: Go для JS-девелоперов (Часть 1)

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели11K

Если JS/TS это динамичный, асинхронный «ассемблер» для веба, построенный вокруг одного потока и цикла событий, то Go это строгий, параллельный «ассемблер» для облака, построенный на простоте, явности и истинном параллелизме.

Многие классические учебные материалы по Go, которые вы можете найти, уже устарели. Официальный документ "Effective Go", написанный в 2009 году, не охватывает ни модули, ни дженерики. Два аспекта, которые являются фундаментальными для современного Go. Аналогично, многие популярные книги, такие как "The Go Programming Language", были написаны до появления дженериков. Этот документ призван стать современной отправной точкой, ориентированной на версию Go 1.25+ и использующей ваши существующие знания JS/TS для ускорения обучения.

Читать далее

Структура кода в папке Domain по DDD

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели11K

В слое Domain 90% проектов с тактическим DDD забыли о самом главном. Сегодня мы вспомним то о чем забыли или узнаем то чего не знали.

Читать далее

Анализ утечек ресурсов в Go: реальные кейсы и их решение

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели6.4K

Команда Go for Devs подготовила перевод статьи о том, как GoLand помогает разработчикам вовремя находить и устранять утечки ресурсов. Файлы, соединения, HTTP-ответы, SQL-строки — всё это может незаметно накапливаться и ломать сервис под нагрузкой. В статье на реальных примерах показано, как одна пропущенная Close() приводит к сбоям, и почему встроенный анализ утечек становится незаменимым инструментом для стабильного продакшена.

Читать далее

Self-hosted связь со своей семьей

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели31K

Я сделал видеосвязь для семьи: один бинарник, домен, 200 рублей в месяц — и всё работает

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

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

Читать далее

Ассемблер для гоферов. Часть 1

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели18K

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

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

Читать далее
1
23 ...

Вклад авторов