Category : golang

golang
Когда успешная миграция сломалась, а партиционирование превратилось в cross-cluster move

Привет! На связи вновь команда Геосервисов. Как вы помните, в прошлой статье я делился нашим опытом партиционирования и выводами, к которым мы пришли. Но на этом история не закончилась. Что же было дальше? Партиционирование завершилось успешно. VACUUM сократился с 6+ часов до ~20 минут. Запросы ускорились. Мы думали, что всё позади. Через неделю после swap проверили реплику — и обнаружили, что она пуста.Обнаружение: реплика пустаяБыла обычная пятница. Проверяли репликацию lag, всё было в поряд…

  • воскресенье, 1 марта 2026 г. в 00:00:12
golang
Создаём микросервис обработки изображений на Go с gRPC

В этой статье мы рассмотрим создание микросервиса обработки изображений на golang с использованием технологии gRPC. Цель статьи - показать как может выглядеть такой сервис и что он может в себя включать. В результате мы получим полностью рабочий сервис по обработке изображений, который принимает данные, сохраняет исходную картинку, сжимает её, накладывает на неё ватермарку, изменяет размер изображения, и конвертирует его в нужный формат.Разберём возможные варианты взаимодействия клиента с серве…

  • воскресенье, 1 марта 2026 г. в 00:00:11
golang
Контейнер под капотом, или Как четыре syscall'а изменили подход к эксплуатации ПО

Привет, Хабр! Меня зовут Олег, я работаю в VK Cloud в команде Key Management Service. Есть у меня такая привычка: когда пользуюсь каким-то инструментом изо дня в день, то рано или поздно хочется залезть внутрь и посмотреть, как оно там устроено. С контейнерами так и вышло: docker run, docker build — всё это прекрасно работает, но что именно происходит, когда мы «запускаем контейнер»?В этой статье разберём контейнеры не на уровне «вот вам YAML, отправляйте в прод», а чуть глубже — на уровне сист…

  • суббота, 28 февраля 2026 г. в 00:00:15
golang
Зачем тестовому фреймворку 17 функций?

Если посчитать публичный API Ginkgo, получается внушительный список. Describe, Context, When, It, Specify, By, BeforeEach, AfterEach, BeforeAll, AfterAll, JustBeforeEach, JustAfterEach, BeforeSuite, AfterSuite, SynchronizedBeforeSuite, SynchronizedAfterSuite, DeferCleanup. Семнадцать функций, и это без F- и P-вариантов для focus и pending.GoConvey проще, но и у него набирается не меньше: Convey, So, ShouldEqual, SkipConvey, FocusConvey, Reset и собственный DSL для assertion-ов.Я не считаю, что …

  • суббота, 28 февраля 2026 г. в 00:00:14
golang
Documentation-Driven Development: как мы генерируем Go-код из OpenAPI-спецификаций

Привет, Хабр. Я Матвей Лихота, старший Go-разработчик из МТС Web Services. По моему опыту, документация, которую пишут руками отдельно от кода, устаревает уже в момент следующего коммита. Из-за этого мы в команде тратили до 20% времени на поддержание актуальности swagger-документации в десятке микросервисов. И когда ошибки интеграции уже стали привычным фоном, мы все-таки решились и перевернули всё с ног на голову: внедрили Documentation-Driven Development (DDD) — подход в разработке, когда про…

  • пятница, 27 февраля 2026 г. в 00:00:13
golang
Партиционирование PostgreSQL: опыт команды Геосервисов

Всем привет! Поводом для написания этой статьи послужила ситуация, с которой мы в команде Геосервисов столкнулись.Когда наша база данных нормализованных OSM-данных достигла размеров в 600+ ГБ, VACUUM стал занимать 6+ часов. Мы начали приближаться к пределу хранилища (600 GB из 1 TB), а производительность запросов деградировала. Стало очевидным — партиционирование неизбежно.Масштаб задачи:760M nodes (179 GB data + 170 GB indexes)800M ways (120 GB data + 42 GB indexes)5B way_nodes (~150 GB)Изнача…

  • пятница, 27 февраля 2026 г. в 00:00:12
golang
B4 — обход DPI с веб-интерфейсом

B4 - инструмент обхода разноуровневых DPI на Go с удобной веб-мордой. Работает на уровне ядра Linux через NFQUEUE - перехватывает сетевые пакеты и применяет к ним техники обхода.Написан с нуля на Go - хех, это не очередной форк/обертка zapret или других существующих решений. Zapret - мощный CLI-инструмент с тонкой ручной настройкой. B4 - другой подход: веб-интерфейс, полная интеграция v2ray geodat-файлов и автоматический подбор стратегий и применение изменений на лету без перезапуска.Мне хотело…

  • четверг, 26 февраля 2026 г. в 00:00:22
golang
Паттерны конкурентности в Go. Подробный разбор. Часть 1. Worker pool

Здесь пойдет речь именно о простых примерах реализации паттернов, годных для начального понимания и использования на собеседованиях. Это будут не полноценные production-шаблоны, а схематичные примеры с подробным описанием - что и зачем.Worker poolВероятно, самый популярный паттерн на собеседованиях. Задача: Написать код, параллельно обрабатывающий некий массив входных данных фиксированным количеством "воркеров" и складывающий результаты в выходной массив.Часто можно встретить в статьях …

  • четверг, 26 февраля 2026 г. в 00:00:21
golang
Я два месяца платил 300к человеку, который тихо скармливал мои задачи в ChatGPT

У меня небольшая продуктовая команда, 12 человек, пилим B2B-логистику. Go, React, PostgreSQL, всё на кубере. Предметка скучная снаружи, но внутри — ад: у каждого перевозчика свой API, и каждый API как будто писали в пятницу вечером. У СДЭК поле tariff_code в одном эндпоинте строка, а в другом число, я до сих пор не понимаю почему, и никто там не понимает, я спрашивал.Ну и вот, осенью 2025-го у нас ушёл мидл. Типичная история — нашёл +80к в каком-то финтехе, ему там обещали «плоскую структуру и …

  • четверг, 26 февраля 2026 г. в 00:00:20