Обновить
256K+

Go *

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

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

Почему RBAC недостаточно: опыт построения тарифно-зависимой системы доступа в SaaS или о чём молчат в статьях компаний

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

Тема разграничения доступности действий в рамках конкретного тенанта выходит далеко за рамки ERP домена и требует особо пристальной реализации. Это особенно применимо для коммерческих систем (коей и является Kroncl - название системы), в которых классический RBAC требует определённых доработок, включающих адаптацию к упрощённой features-based access control (в народе - FBAC, является своего рода реализацией ABAC). Кроме того, технологические компании крайне редко (уникальные случаи всё же есть) посвящают публичные статьи внутреннему устройству своих систем тарификации, что крайне печально, ведь это буквально могли быть рассказы о том, как архитектурные решения напрямую влияют на маркетинг и как следствие доходность компании.

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

Читать далее

Новости

Динамический ресайзинг изображений (Image Previewer)

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

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

Читать далее

Проектируем сервис HTTP-запросов: Kafka, PostgreSQL, Redis-очередь и миллионы логических партиций

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

Ни одна «одна технология» не закрывает это без слоёв. Сначала — почему в стеке именно Kafka, PostgreSQL и Redis; дальше — как мы спроектировали сервис Requester: контекст, движение данных, внутренние воркеры, graceful shutdown, детали rate limit / retry / cache / отложенных задач, wake-up, тестирование и узкое место с большими payload в Redis.

Читать далее

Деконструкция GO: CPU, RAM и что там происходит. Системные вызовы. Часть 1.5

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

Итак, финал части 1! По крайней мере основного разбора без дополнений. Собственно, сегодня мы разберем то, чем в основном с точки зрения ядра ОС и CPU являются все вот эти ваши бэкенды – системные вызовы и всё, что вокруг них.

На самом деле механизм немного замудренный и “в лоб” сразу все эти системные вызовы мы разбирать не будем, потому что вокруг них существует ещё несколько концепций.

Итак, начнем!

User mode, Kernel mode

Процессор исполняет код в разных уровнях привилегий.

Это механизм защиты, который не позволяет пользовательским программам напрямую управлять системой. Зачем? Для безопасности. Чтобы чей-нибудь опасный ассемблерный вайбкод случайно всё не поломал!

Да и вообще, если бы любая программа могла выполнять любые инструкции CPU, она могла бы:

• Читать память других процессов

• Управлять устройствами

• Изменять таблицы страниц

• Выключать систему

Чтобы этого не происходило, CPU разделяет код по уровням доступа.

Хотя в архитектуре x86 существует 4 уровня привилегий:

Ring 0 – kernel mode

Ring 1 – драйверы

Ring 2 – системные службы и файлы

Ring 3 – user mode

По факту, Ring 1 и Ring 2 – это легаси, которое американские деды проектировали с научной красотой, но без реальной производственной необходимости. В реальной жизни используются только 2 уровня – Ring 0 и Ring 3 для бОльшей совместимости софта с другими ОС, упрощения поддержки, да и вообще переключение уровней доступа дорогое(100-150 тактов CPU), соответственно, чем больше колец, тем хуже производительность.

Получается, что

В user mode выполняется обычный код программ.

Читать далее

Auto AI Router: высокопроизводительный прокси-роутер для LLM API на Go

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

Auto AI Router — лёгкий прокси-роутер на Go, который принимает запросы в формате OpenAI API и прозрачно распределяет их между несколькими провайдерами и ключами с балансировкой нагрузки, защитой от банов и контролем RPM-лимитов.

Читать далее (многобукав)

10 кругов ада управленческого учёта малого бизнеса РФ на Go+pgx. От идеи до зависимости

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

Автор прекрасно понимает, что тема ERP/CRM систем обсасана со всех сторон ещё десятилетие назад. Огромное количество разработчиков и по сей день зарабатывают на внедрении систем на подобии 1C:ERP в предприятия. Однако поспешу обрадовать читателя, сегодня я попытаюсь описать процесс создания своего рода аналога такой системы на довольно необычном для этой сферы стеке и углубиться в тонкости её устройства.

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

Читать далее

Приоритет выше закона физики: как мы победили «шумных соседей» в Kafka на 301 млн сообщений

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

Привет, Habr!

Меня зовут Магомед, я руководитель команды «Платформа платежей и коммуникаций» в Lenta tech («Группа Лента»). В статье хочу разобрать задачу приоритезации уведомлений в Kafka на высоких нагрузках. Речь пойдет о платформе коммуникаций, которая обрабатывает SMS, push, email и мессенджеры и за месяц отправляет более 301 млн сообщений.

Читать далее

Реактивные серверы, или как перестать писать JavaScript и начать жить

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

Обзор Phoenix LiveView и его друзей из других стеков: Rails Hotwire, Laravel Livewire и Go Live/HLive

Все эти фреймворки позволяют создавать динамические страницы без ручного вызова API (и без AJAX :)

Неужели совсем без JS?!

Я хотел оживить голема, но получил галлюцинирующего идиота

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

В игре Warcraft есть такая тварь — железный голем. Здоровенная кукла, слепленная из глины и металла, которую оживляют магическим словом. Тупой, но мощный исполнитель. Сказали бить — бьёт. Сказали охранять — стоит насмерть.

Я захотел такого же, но в коде.

Телом пусть будет Telegram-бот. А мозгом — нейросеть. Не просто очередной «чат с ИИ», а настоящий кодинг-агент. Чтобы кидаешь ему проект, а он: «Тут у тебя SQL-инъекция, тут гонка данных, тут ты импорт забыл, и вообще у тебя в зависимостях дыра». Идея казалась простой: берём aiogram, прикручиваем DeepSeek, пишем промпт «ты senior-разработчик, разбери этот код» — и готово.

Первая версия была готова за вечер.

Я кинул Голему свой проект. Он задумался на пару секунд и выдал:

Читать далее

Особенности и ловушки модели памяти в Go: тайны синхронизации. Часть 2

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

Описание модели памяти Go начинается со слов «если вы читаете этот документ — вы излишне умный, остановитесь». Многие и правда остановились, но не автор этой статьи. 

Привет, Хабр! Я — Игорь Панасюк, и это вторая часть материала по мотивам моего выступления на GolangConf, где я рассказывал о модели памяти Go. В первой мы разобрались с  отношением happens before, формализмом, посмотрели практические примеры и многое другое. Сегодня поговорим о линеаризуемости исполнения, барьерах памяти (можно ли опустить абстракцию модели памяти), гарантии для программ с data race и использовании продвинутых техник.

Читать далее

Swiss Table в Go: что изменилось в map

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

Когда я впервые увидел новости про Swiss Table в Go, у меня была простая мысль: "Окей, звучит неплохо, но что это реально меняет для обычного разработчика?" Снаружи почти ничего. Мы всё так же пишем map[string]int, читаем, записываем, удаляем значения и обходим map через range. Но внутри рантайма map теперь устроена иначе, и это как раз тот случай, когда изменение под капотом может заметно повлиять на производительность без переписывания бизнес-логики.

Начиная с Go 1.24, встроенная map использует новую реализацию на базе Swiss Table. Это не сторонняя структура данных и не новый синтаксис языка, а замена внутреннего механизма хранения пар "ключ - значение". В релизных материалах команда Go прямо пишет, что новая map стала одной из причин снижения накладных расходов рантайма в среднем на 2-3% на наборе репрезентативных тестов. При этом они отдельно предупреждают: результат зависит от конкретного приложения.

Читать далее

Деконструкция GO: CPU, RAM и что там происходит. Оптимизации на CPU. Часть 1.4

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

Первые великие оптимизаторы появились уже на таком низком уровне, как железо. По факту, задача выжимки ресурсов в программировании есть на любом уровне. В этой статье мы разберем оптимизации на уровне CPU такие как NUMA, prefetch, TLB и alignment.

Статья получится немного неоднородной и больше про “высокие материи”, что в принципе намекает на то, что разбор “железной” составляющей скоро подойдет к концу!

Вводная

Как мы рассматривали некогда ранее обращение на RAM – это достаточно дорого. CPU пытается это “скрыть”, чтобы работа казалась куда более быстрой.

Одним из таких механизмов, естественно, является иерархия кэшей!

Но вот не возникало ли у вас вообще вопроса – “А почему память – это в принципе проблема? Почему дорого?”. Все очень просто – доступ к памяти медленный

Тактовая частота например моего ноута – 2,70 ГГц, то есть 2,7 миллиарда циклов/операций в секунду

Доступ к ОЗУ имеет задержку аж в 150–350 циклов! То есть за это время мы могли бы выполнить 200 операций. 

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

Prefetch

В предыдущей серии мы рассматривали модель исполнения процессорных инструкций. Когда инструкции поступают, CPU, а точнее его механизм hardware prefetcher, загружает данные в кэш из предположения, что они скоро понадобятся.

На всякий случай зафиксируем:

Читать далее

Фикстуры в Go: как перестать писать инфраструктуру в автотестах

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

В Go нет фикстур, и в интеграционных тестах это быстро превращается в копипаст. Разбираем, как вынести инфраструктуру из автотестов и управлять жизненным циклом ресурсов.

Читать далее

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

Деконструкция GO: CPU, RAM и что там происходит. Reordering, atomics, locks, fences. Часть 1.3

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

С постановкой проблем в прошлой статье мы почти закончили и вывели самое важное – природу состояния гонки и состязания за кэш. В этой статье мы также разберем оптимизацию, порождающую часть проблем синхронизации – instructions reordering, а также механизмы решения вышеуказанных проблем.

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

Напоминаю, что эта статья – часть большого цикла разбора языка программирования Golang End 2 End. Но если вы уверены, что понимаете природу многозадачности, многопоточности, проблемы оных, а также то, как выполняются инструкции и пришли разбираться в самых примитивных механизмах синхронизации, то велком

Instructions reordering

Обычно мы считаем, что CPU добросовестно выполняет свои инструкции последовательно. Ровно так, как мы ему сказали. Но это не всегда верно!

Допустим есть код

Читать далее

DDD в Go без красивых схем: как один платеж получил три курса валют

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

В какой-то момент у нас один платеж начал жить с тремя курсами валют: checkout показывал сумму из Redis, payment-service ходил в API, а ledger писал проводку по снапшоту из Postgres. Расхождения были 2-5 тенге, иногда до 180. Разбираю, как это дебажили, какие костыли ставили и где DDD реально помог, без красивых схем.

Читать статью

Приватная Cвязь на Go и Flutter

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

Пока все обсуждают очередные сливы баз и особенности модерации в популярных «безопасных» мессенджерах, решил попробовать пойти другим путем. В этой статье рассказываю, как я скрестил Flutter и Go через CGO, прикрутил libp2p для создания P2P-сети и реализовал честное E2EE шифрование (Double Ratchet для личек и MLS для групп). Никакой централизации, никаких единых точек отказа. Делюсь результатами эксперимента.

Читать далее

Clean Architecture + DDD в Go: как не превратить проект в 200 файлов ни о чём

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

Прежде чем погружаться в архитектуру, давайте посмотрим на контекст, в котором всё это происходит.

По данным исследования McKinsey 2022 года, технический долг составляет до 40% всего технологического портфеля компаний. И это не просто цифра в отчёте. Согласно опросу 2024 года среди технических руководителей, у более чем 50% компаний технический долг занимает свыше четверти всего IT-бюджета, блокируя внедрение новых функций. (Источник: vFunction, 2025)

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

Теперь о Go. По данным Go Developer Survey 2024, главной проблемой команд, работающих с Go, названо поддержание единых стандартов кода — в том числе из-за разного уровня опыта участников и привнесения не-идиоматических паттернов из других языков. (Источник: go.dev/blog/survey2024-h2-results)

Это напрямую про нашу тему: люди приходят из Java, Python, C# и приносят с собой архитектурные привычки, которые в Go не работают. Clean Architecture и DDD — не исключение. Их часто реализуют "как в Java", а потом жалуются, что Go — многословный и неудобный язык.

Давайте разберёмся, как делать это правильно.

Как мы сюда попали?

Представьте: вы начинаете новый Go‑сервис. Читаете статьи, смотрите видео, решаете «делать по‑взрослому». Создаёте структуру:

Читать далее

Деконструкция GO: CPU, RAM и что там происходит. Многозадачность, многопоточность, кэши, проблемы. Часть 1.2

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

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

В части 1.1 мы рассмотрели базовые инструкции, которые выполняет наш CPU и которыми в конечном счете и являются наши прекрасные строчки на Go. Но возникает закономерный вопрос: “Окей, мы поняли как работает на одном ядре, но Go у нас во многом про многопоточку, соответственно как это будет работать на нескольких потоках?”

Если что, то это часть большого цикла по разбору Go! Данная статья – это подводка уже к тому, с чем мы имеем дело в Go достаточно часто(барьеры памяти, атомики, сисколы)

В этот раз будет без Go Assembler, но с +- реальными примерами, если что-то непонятно будет, то на Хабре есть классный ИИ-помощник.

Читать далее

Модно не значит правильно — про pgx, метрики и OpenTelemetry

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

Один вопрос про pgx — и три инструмента которые легко перепутать. QueryTracer не замена декоратору, декоратор не устарел, а выбор драйвера — неожиданно важное решение для observability. Какую комбинацию драйвера и обёртки выбрать — зависит от того что вы хотите видеть. В статье взгляд на комбинации драйверов и оболочек для анализа запросов в PostgreSQL. Разбираем на реальном проекте — с кодом, ошибками и выводами.

Лучше один раз разобраться, чем каждый раз сомневаться в выборе.

Читать далее

Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1

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

Go-код никогда не исполняется напрямую.

Любая строка Go превращается в машинные инструкции, которые выполняет CPU.

В этой статье мы разберём:

1) Какие инструкции генерирует компилятор Go

2) Как выглядит Go assembler

3) И что на самом деле выполняет процессор

Думаю с обзором и общими положениями мы закончили, поэтому начнем с фундамента – что происходит в CPU когда мы запускаем наше Go-приложение. Конкретно в этой статье разберем основные инструкции, которые может выдать для нашего CPU компилятор Go, что они из себя представляют и как соотносятся с кодом Go. Сразу оговорюсь, что это НЕ гайд по Go Assembler, а разбор того, что из себя представляет Go End 2 End. Попытка докопаться до истины

Напомню, что сам CPU определяет:

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