Обновить

Бэкенд

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

Go подробно! Часть 1. Структура проекта

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

Привет!

Буду с вами честен, для меня читать сухие переводы документации или смотреть 40-часовые видеокурсы - то еще удовольствие. Поэтому я решил устроить эксперимент и разбирать Go прямо в публичном поле, шаг за шагом документируя весь процесс.

Я не новичок в разработке - повседневно пишу на Python и TypeScript, знаком с базовым devops. Но вот на территорию Go осознанно захожу впервые.

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

Этот цикл статей - мой интерактивный учебник, который я пишу в реальном времени параллельно с изучением языка. Я не Go-гуру и не архитектор с многолетним опытом в этом стеке.

Поэтому если вы опытный Go-разработчик и видите в тексте неточность или косяк - буду искренне рад конструктивным подсказкам в комментариях.

Читать далее

Полностью нечестное сравнение std::expected в C++23 и core::result::Result в Rust

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

Привет, Хабр!

Воодушевившись статьёй std::expected в C++23: гайд по миграции с исключений на функциональный error handling, представляю собственную с переписанными примерами на Rust. Код в статье итеративно переписывается и улучшается.

Читать далее

sizeof(Mutex<()>) упал с 40 байт до 5: что внутри std::sync::Mutex после Rust 1.62

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

sizeof(Mutex<()>) в Rust 1.61 на Linux был 40 байт. В Rust 1.62 он стал 5 (точнее, 8 с учётом выравнивания, но базовый overhead 5).

За уменьшением размера в восемь раз стоит полная переписка стандартного Mutex с pthread на futex напрямую, ускорение uncontended locks в 2-3 раза, и десятилетие, которое стандартный Mutex провёл в роли «возьми parking_lot, std::sync::Mutex медленный».

Сегодня заглянем под капот всей этой темы, разберём, что лежит внутри std::sync::Mutex после 1.62, какой алгоритм там используется, почему он на самом деле быстрее pthread, как устроен fairness (точнее, его отсутствие), зачем нужен poisoning, и в каких случаях parking_lot всё ещё имеет смысл тащить в зависимости. Заодно вернёмся к моей старой async-статье и поясним конкретнее, почему в async-задачах std::sync::Mutex это проблема, и при чём тут вообще futex.

Читать далее

Создание харнесса для код-агентов под enterprise-фреймворк на Java

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

Вайб-кодинг, или AI-assisted development, отлично работает на уровне прототипа: агент получает текстовое ТЗ и быстро собирает первый рабочий вариант. Но в корпоративной разработке этого мало.

Проблема начинается там, где нужно не просто написать код, а собрать полноценное корпоративное приложение. В Джеймикс между «экран открылся» и «система действительно работает как надо» лежит пропасть.

В какой-то момент мы задались вопросом: можно ли научить ИИ-агента проходить этот путь самостоятельно? Можно, если собрать вокруг него харнесс (англ. harness). Именно о нем статья.

В Джеймикс мы строим этот мост как инженерный харнесс: набор скиллов, инструментов и проверок, который помогает довести работающий прототип до реально работающей системы. Для его строительства мы используем агентную платформу KodaCode (далее — Koda) в собственной разработке на Джеймикс и регулярно гоняем ее на бенчмарках. Если оценивать по делу, Jmix-задачи агент решает уверенно. Разброс от сессии к сессии есть, мы видим его в собственных прогонах, и строгие pass/fail-бенчмарки его даже преувеличивают. Поэтому ставка не на идеального агента: обвязка и контроль не дают этому разбросу попасть в ваш продакшен. Это SKILLS.md под Джеймикс, преднастроенные инструменты и проверки на выходе. 

Ниже разберем шесть составляющих такого харнесса. Мы собрали их в KodaCode для Jmix-проектов: пакет навыков, преднастроенные инструменты и проверки на выходе. Это можно собрать самостоятельно, но на практике такой путь занимает месяцы проб и ошибок.

Читать далее

Как я в одиночку мигрировал 97 микросервисов на .NET 10 за 17 рабочих дней

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

Архитектор Mindbox Саша Корчак мигрировал монолит и 97 микросервисов на мажорную версию .NET с помощью автономного AI‑агента за 17 дней. В статье он рассказывает, как поднимал инфраструктуру, создавал и оптимизировал скилл, преодолевал сложности и наводил порядок в коде.

Читать далее

Postgresso #5 (90)

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

Сессионные вычислители — залог успеха аналитики будущего

Всем привет, меня зовут Николай Головazathot Всю свою профессиональную жизнь я строю аналитические платформы. Возможно, вы видели мои статьи про Vertica и Snowflake.

[ Vertica+Anchor Modeling = запусти рост своей грибницы (Avito блог??, перед?? ней HP Vertica, проектирование хранилища данных, больших данных ]

- статья, 27 февраля

наша дискуссия с новой командой начиналась с одного и того же «дня сурка»:

— бизнес: «Аналитики работают слишком медленно!»;
— аналитики: «Нам не дают работать с базой напрямую, заставляют ставить задачи дата-инженерам и ждать неделями!»;
— инженеры: «Да как их пустить в центральное DWH? Вы видели их запросы? Один забытый ON в джойне — и база ложится на бок, блокируя и отчеты для CEO, и критические ETL-процессы».

Этот сюжет я наблюдал везде: в классическом on-premise (Greenplum, Vertica), в модных китайских решениях (StarRocks) и даже в open-source Lakehouse-инсталляциях (Spark). Меня окончательно шокировал кейс одной огромной европейской компании по доставке еды: она сидела на Databricks, имела практически неограниченные ресурсы, но всё равно страдала от взаимных блокировок и конкуренции за ресурсы.

Как должна выглядеть база, в которой аналитикам действительно можно дать полную свободу? Представьте: каждый аналитик работает в своей персональной базе данных. Он видит актуальные данные в реальном времени, но физически не делит «железо» с соседом.

Фантастика? Нет, Snowflake первым доказал, что это возможно, внедрив архитектуру Multi-cluster Shared Data:

Читать далее

Как я писал in-memory векторный движок на Go — и в каком месте он обогнал hnswilb

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

Полгода назад я начал писать in-memory базу с векторным поиском на Go: RESP-протокол, HNSW-индекс, WAL, многопоточность. Рассказываю, что из этого вышло: как я мерил производительность и на каких граблях стоял, что реально ускоряет векторный поиск, а что нет. Все цифры воспроизводимы, код открыт.

Читать далее

Голосовой ИИ-репетитор изнутри: архитектура разговора в реальном времени

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

Доброго времени суток!

меня зовут Кирилл, хочу рассказать вам о своем проекте Aisha – ИИ репетиторе английского языка для разговорной практики. Об идее, отличиях, технических аспектах.

Читать далее

Используем sqlc в Го: нужно ли делать отдельный слой «репозиторий», или достаточно сгенерированного?

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

Всем привет!
Эта статья является выжимкой моего опыта. Возможно для кого-то это очевидные вещи, тем не менее, считаю, что она может мыть полезна начинающим и не только.

Для работы с базами данных в го есть несколько подходов от стандартного "ручного", до удобных, таких как sqlx, GORM, sqlc... Список можно продолжать дальше.
При разработке очередного ПО я познакомился с sqlc (https://sqlc.dev/) и его подход мне понравился: на основе sql запросов создается полноценная обертка над бд - чем не песня, но как ее грамотно использовать в соответствии с принципами SOLID и Го подходом?

Читать далее

Каким инструментам разработки невозможно научиться по тьюториалам?

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

Хабр, привет! Меня зовут Илья Благородов, я занимаюсь разработкой уже более 30 лет, а ещё я — один из экспертов онлайн-магистратуры «Фронтенд-, бэкенд-разработка и ИИ-решения» ИТМО в партнёрстве с Яндекс Практикумом. Сегодня хочу поговорить о том, как правильно выбирать инструменты для разработки, почему разбираться в разных инструментах — не равно уметь их правильно применять и что с этим делать.

Читать далее

Ваш бот всё ещё дёргает Telegram каждую секунду? Чиним архитектуру: вебхуки на FastAPI в контейнере

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

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

Long Polling — это первый способ. Бот в бесконечном цикле долбит getUpdates на серверы Telegram: «есть что‑нибудь? а сейчас? а сейчас?». Telegram, надо отдать ему должное, держит соединение открытым и отвечает не мгновенно, а когда появляются апдейты — поэтому polling и называется long. Но суть не меняется: инициатор — вы, соединение висит постоянно, и весь этот механизм живёт внутри одного вашего процесса.

Webhook — это почтальон. Вы один раз говорите Telegram: «вот мой HTTPS‑адрес, стучись сюда». Дальше при каждом новом сообщении Telegram сам делает POST‑запрос на ваш эндпоинт с JSON‑апдейтом внутри. Нет сообщений — нет запросов. Нет запросов — нет расхода ресурсов.

Для пет‑проекта на пять пользователей разницы никакой, поллинг даже удобнее — не нужен домен и сертификат. Но как только бот становится частью нагруженной системы, вебхуки выигрывают по всем фронтам: апдейт прилетает мгновенно, а не в конце очередного цикла опроса; входящий трафик — это обычные HTTP‑запросы, которые можно балансировать между несколькими инстансами; и главное — бот превращается в обычный веб‑сервис, к которому применим весь стандартный инструментарий: Nginx, healthcheck'и, метрики, горизонтальное масштабирование.

Читать далее

Учимся писать свой Prometheus exporter на Go с нуля. Часть 1

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

Чтобы измерять нагрузку, ошибки, задержки и потребление ресурсов, осознанно поддерживать SLO и настраивать алерты, не обойтись без Prometheus. Он принимает текстовый формат на HTTP-эндпоинте. Только вот Kafka, PostgreSQL, сетевое железо и Redis метрики по HTTP не отдают, либо понимают только JMX, SNMP и собственный REST API. Так что без переводчика не обойтись.

Всем привет! Я DevOps-разработчик из MTC Web Services. Этим материалом я открываю цикл из пяти постов, благодаря которому вы шаг за шагом напишете собственный Prometheus exporter с нуля на языке Go. Но просто написать код может и ИИ. Моя же цель — дать не только практическую, но и теоретическую основу, чтобы в будущем вы могли легко разработать свой exporter под любую задачу. 

Если вдруг вам уже знакома теория и важнее практика — заглядывайте за ней в оглавление. В качестве примера я выбрал kafka_exporter: он покрывает несколько типов источников, позволяет реализовать паттерн Custom Collector и его легко тестировать локально. А еще есть много популярных kafka_exporter, с которыми мы сможем сравнить наш результат. Код буду коммитить в репозиторий.

Читать дальше

Разбираемся с лицензией Redis. И что выбрать продуктовой команде

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

Redis долго был понятным выбором: BSD-лицензия, можно использовать почти где угодно. После смены лицензии в 2024 году всё стало сложнее: RSAL, SSPL, AGPLv3, Valkey, форки и вопросы к юристам.

В статье рассматриваю этот вопрос со стороны обычных продуктовых команд, а не облачных провайдеров. Если Redis у вас внутри как кеш, очередь или для сессий, что реально меняется, где начинаются риски и что сегодня разумнее выбрать - Redis 8, Valkey или другой Redis-compatible вариант.

Читать далее

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

2000+ развертываний в день: как мы строили DevOps-конвейер для 300 микросервисов и что планируем дальше

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

Мы в Диасофт несколько лет назад начали строить Digital Q.DevOps — внутренний конвейер сборки, тестирования, доставки и развёртывания, — и сейчас через него проходит больше 2000 развёртываний в сутки. На прошлой неделе собрали внутренний митап с разработчиками, тестировщиками и DevOps-инженерами, чтобы честно разобрать, что в продукте получилось, что до сих пор болит, и куда мы движемся.

Читать далее

Reflection замедляет ваш Java-код. Почему?

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

Сколько раз вы слышали тезис о том, что в Java Reflection тормозит, и лучше его избегать. Насколько это правда?

В новом переводе от команды Spring АйО рассмотрим, почему производительность reflection-а имела проблемы.

Читать далее

Security Profiles Operator v1: стабильные API, аудит безопасности и путь в upstream Kubernetes

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

Linux даёт мощные механизмы безопасности уровня ядра — seccomp, SELinux и AppArmor, — которые ограничивают возможности контейнеризированных рабочих нагрузок. Если коротко: seccomp фильтрует системные вызовы процесса, SELinux и AppArmor накладывают мандатные политики доступа к файлам, сети и возможностям. Каждый из них работает через профили, которые описывают разрешённое поведение, но писать, распространять и поддерживать такие профили вручную утомительно и легко ошибиться.

Security Profiles Operator (SPO) снимает эту боль: профилями безопасности можно управлять как пользовательскими ресурсами Kubernetes, записывать их с работающих нагрузок и декларативно привязывать к подам.

С выходом v1.0.0 Security Profiles Operator переводит все восемь своих API типа Custom Resource Definition (CRD, определение пользовательского ресурса Kubernetes) на версию v1. Это первый стабильный релиз проекта, подкреплённый сторонним аудитом безопасности, полным циклом работ по усилению защиты и путём миграции без простоя с любой предыдущей версии API.

Команда VK Cloud перевела статью о том, как проект Security Profiles Operator за шесть лет довёл свои API до версии v1, прошёл сторонний аудит безопасности и теперь влияет на развитие самого Kubernetes. Это будет полезно тем, кто отвечает за безопасность кластеров — DevOps- и SRE-инженерам, специалистам по ИБ и разработчикам, которые пишут профили seccomp, SELinux и AppArmor для контейнеров.

Читать далее

От REST к MCP: как LLM меняют принципы проектирования API и архитектуры систем. Часть вторая

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

Привет, Хабр! На связи Дмитрий Бондарев, я backend-разработчик Авито — занимаюсь проектами на стыке разработки и машинного обучения. В первой части этого материала мы обратились к истокам API и существующим ограничениям интерфейса в работе с агентами.

В этой статье обратимся к архитектуре MCP и ключевым принципам протокола, рассмотрим, как он решает проблемы интеграции с агентами. Обсудим вызовы, которые ИИ бросает нашему мышлению и подходу к разработке и бизнесу. И, наконец, сделаем выводы — так ли нужны агенты в работе и повседневной жизни? 

Читать далее

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

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

Я не пытался сделать «приватный мессенджер» и вообще не думал про слежку и прослушку.

В один день мне просто надоело, что созвониться с человеком — это настоящая проблема: блокировки, включи-выключи VPN, а любой новый аналог встречает регистрацией с десятком полей — а теперь местами ещё и просьбой показать паспорт.
За ночь я собрал прототип голосового чата по принципу «ничего лишнего» — и уже потом с удивлением понял, что этот же принцип случайно сделал разговор в нём таким, что подслушать его со стороны физически негде.

Ниже — как так получилось, где у этой «невозможности» честные границы, и почему всё держится на одном-единственном решении.

Как так вышло?

Что будет, если доверить стандартизацию логов лингвисту

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

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

Меня зовут Александра, и я ML-инженер в RUTUBE TECH. В этой статье расскажу, как мой лингвистический бекграунд помог создать единый стандарт логирования для всей платформы.

Читать далее

Когда может пригодиться экзотика в ООП: миксины/трейты/аспекты

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

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

Читать далее