Я Тимур Баян, занимаюсь разработкой почти всю свою жизнь, ещё со студенческих лет. Программирование и разработка у меня в крови! Я люблю решать нерешаемые проблемы, делать людям жизнь легче, тестить гипотезы, создавать крутые продукты. Так меня позвали работать в Уралсиб помогать управлять уже не одной, а сразу тремя командами. Сложностей я не боюсь, так что ныряем в задачи с головой!Дано: три очень разные команды разработки, каждая со своим стеком технологий. С самого второго дня на меня понес…
Лень — двигатель прогресса. Я очень ленив, поэтому прогресс должен был выйти впечатляющим. Спойлер: он и вышел, но с ленью что-то пошло не так.Сколько раз можно написать «поле обязательно»Проект, в который я пришёл, был большой и почтенный, а валидация в нём жила внутри хендлеров. Выглядело это примерно так — и, подозреваю, вы такое видели:func (h *handler) CreateInvite(w http.ResponseWriter, r *http.Request) { var req InviteRequest if err := json.NewDecoder(r.Body).Decode(&req); er…
Привет, Хабр!График памяти, вроде — ровный. runtime/metrics показывает те же 600 МиБ, что и месяц назад, heap-профиль не растёт, утечек нет. А kubectl describe pod пишет OOMKilled, и рестарты идут каждые пару часов. Оба числа правдивые, просто меряют разное: рантайм считает память, которую сам попросил у системы и за которой следит, а ядро перед убийством смотрит на RSS — сколько страниц реально лежит в физической памяти.Расхождение это ровесник самого Go в контейнерах. Новое тут другое: за пос…
ВведениеПривет, Хабр! Сегодня поговорим о контексте: о его тонкостях и ошибках, которые возникают при его использовании.Что такое контекст?context.Context - это механизм для управления временем жизни операций, который появился в 2016 году в стандартной библиотеке начиная с Go 1.7. При этом то, что чаще всего называют контекстом (сам тип) является интерфейсом:type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key any) any }Исходя из …
В процессе работы над f4, современной репродукцией Far Manager на Go, мне пришлось столкнуться с кучей ограничений экосистемы и написать массу вспомогательных библиотек, добавив недостающие кусочки паззла. Встроенный mp3 плеер f4 (да, он уже есть, пусть и на стадии PoC, вызывается по Ctrl+Shft+M) на скрине не просто так — это чуть ли не единственный плеер для *nix, нормально работающий с русскими кодировками id3v1 тэгов, для чего в том числе как раз потребовалась отдельная библиотека. Обзор все…
Есть класс фич, которые выглядят на одну строчку в тикете и на неделю в реализации. «Хочу, чтобы статус-страница жила на моём домене» — из таких. Клиент добавляет CNAME status.client.ru → status.your-service.com, и дальше начинается интересное: кто выпустит сертификат для чужого домена, кто его продлит, как не дать одному пользователю положить всю схему мусорными доменами и почему X-Forwarded-For может превратить внутренний эндпоинт в публичный.Я делал это для сервиса мониторинга — у него есть …
В Go 1.27 пакет encoding/json остался тем же по API и перестал быть тем же внутри: теперь это тонкий слой совместимости поверх нового encoding/json/v2. Обещание Go 1 выполняется честно, старый код компилируется и ведёт себя как раньше, но цифры под ним поменялись, причём в обе стороны. Я собрал go1.27.0 из исходников, взял старый go1.24.7 для контроля и прогнал одинаковые бенчмарки в четырёх конфигурациях. Разбор ниже: где выиграли, где потеряли полтора раза на ровном месте, что именно уже изме…
Итак в прошлый раз я рассказал вам про свой проект в целом ,сегодня же мы будем разбирать бекендГлубокий разбор архитектуры Zettaverse AgentHubКастомная валидация структуры flow_json и построение DAGАрхитектура DAG-оркестрацииВ основе AgentHub лежит Directed Acyclic Graph (DAG) - направленный ациклический граф, где узлы представляют собой задачи агентов, а рёбра - зависимости между ними . Это позволяет декомпозировать сложные задачи на подзадачи, назначать каждой специализированного агента и па…
Финал серии про горутины и рантайм Go. Здесь то, что происходит за пределами уютного мира G/M/P: системные вызовы, сеть, сборщик мусора. Плюс полный круг планировщика, после которого вывод GODEBUG=schedtrace читается как обычный лог, и все свежее из Go 1.22-1.27: рантайм, который начал делать работу за программиста.План серии:Почему потоки ОС не масштабируются и как Go придумал GMP.Переезжающий стек, сигнал SIGURG и жизнь горутины.syscall, netpoll, полный круг планировщика и свежий Go.Короткий …