🔥 Пишем микросервисы на Go как в BigTech, с нуля
Как эффективно начать разработку микросервисов на Go с использованием современных инструментов, популярных в крупных технологических компаниях. Обсудили ключевые трудности при создании микросервисной архитектуры с нуля, такие как интеграция компонентов, межсервисное взаимодействие и поддержка системы.
Спикер представлил инструменты, которые могут значительно упростить этот процесс:
— gRPC для высокопроизводительного межсервисного взаимодействия;
— gRPC-Gateway для обеспечения совместимости с RESTful API;
— Buf для управления protobuf схемами;
— rk-boot для быстрого старта и стандартизации.
Леонид на практике показал, как эти технологии интегрируют в реальный проект, с акцентом на упрощение разработки и поддержания микросервисов.
В заключение — итоги и рекомендации, как начать внедрение этих инструментов в проекты.
😉 СМОТРЕТЬ НА YOUTUBE
Как эффективно начать разработку микросервисов на Go с использованием современных инструментов, популярных в крупных технологических компаниях. Обсудили ключевые трудности при создании микросервисной архитектуры с нуля, такие как интеграция компонентов, межсервисное взаимодействие и поддержка системы.
Спикер представлил инструменты, которые могут значительно упростить этот процесс:
— gRPC для высокопроизводительного межсервисного взаимодействия;
— gRPC-Gateway для обеспечения совместимости с RESTful API;
— Buf для управления protobuf схемами;
— rk-boot для быстрого старта и стандартизации.
Леонид на практике показал, как эти технологии интегрируют в реальный проект, с акцентом на упрощение разработки и поддержания микросервисов.
В заключение — итоги и рекомендации, как начать внедрение этих инструментов в проекты.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3❤2👎1
⚡️ Насколько быстр Go? Симуляция миллионов частиц на смарт-ТВ
Команда Go for Devs подготовила перевод статьи о том, насколько быстрым может быть Go. Автор проверил это на практике — написал симуляцию миллионов частиц с мультиплеером, только на CPU и так, чтобы оно работало даже на смарт-ТВ.
Go оказался одновременно и разочарованием, и восторгом: он не дотягивает до Rust в вычислительных задачах, но удивляет своей простотой и тем, как легко масштабируется до сотен клиентов.
📚 Подробности на Хабр: https://habr.com/ru/articles/953434/
Команда Go for Devs подготовила перевод статьи о том, насколько быстрым может быть Go. Автор проверил это на практике — написал симуляцию миллионов частиц с мультиплеером, только на CPU и так, чтобы оно работало даже на смарт-ТВ.
Go оказался одновременно и разочарованием, и восторгом: он не дотягивает до Rust в вычислительных задачах, но удивляет своей простотой и тем, как легко масштабируется до сотен клиентов.
📚 Подробности на Хабр: https://habr.com/ru/articles/953434/
👏5👍4🔥2❤1
Forwarded from AI for Devs
Кажется, многие пропустили, но релиз этого помощника состоялся уже какое-то время назад. Да, теперь и Docker не отстаёт от моды на ИИ — в Desktop и CLI появился собственный агент под именем Gordon.
Gordon — это встроенный AI-ассистент, который умеет анализировать Dockerfile, искать ошибки, оптимизировать сборку, чинить контейнеры и даже мигрировать их на более безопасные Docker Hardened Images. Короче, если ваш контейнер внезапно “упал”, можно просто спросить:
docker ai "почему он упал?"
Идея логичная: собрать по-настоящему production-ready Dockerfile — задача не для слабонервных. Сотни нюансов, best-практики, уязвимости, кэш, слои, образы — на всё это Gordon теперь может хотя бы намекнуть.
Gordon встроен в Docker Desktop 4.38+ и CLI, но пока сидит в бете. Чтобы включить — надо активировать “Docker AI” в настройках. Конечно, Docker подчёркивает: данные шифруются, а запросы не используются для обучения моделей. Верим...
Документация
Блог-пост анонс
Демо на YouTube
@ai_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥6❤2😁2🤔1🤯1
Команда Go for Devs подготовила перевод статьи о том, как правильно группировать сабтесты в Go.
Автор показывает, что в большинстве случаев достаточно держать тесты плоскими, а когда нужна разная инициализация и очистка — добавить лишь один уровень вложенности.
В статье разбираются плюсы и минусы разных подходов: от ручных
t.Run до reflection-хаков и сторонних библиотек.📚 Подробности на Хабр: https://habr.com/ru/articles/953418/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4❤2
🤨 Goiaba: Go-компилятор на Rust
Raph Amorim решил написать компилятор для Go… на Rust. Проект называется Goiaba (в переводе с португальского — гуава), и это пока эксперимент, но довольно показательный.
Автор известен по вкладам в экосистему WebAssembly и Wasmer. Его цель — исследовать, насколько реально собрать полноценный Go-компилятор с нуля на Rust, не используя LLVM, TinyGo или классический toolchain от Google.
• Goiaba написан на чистом Rust, без зависимостей от существующих Go-компиляторов.
• Потенциально может использоваться как библиотека внутри Rust-проектов.
• Может компилировать Go-код в WebAssembly, как TinyGo, но с иным подходом к архитектуре.
• Сообщество уже спорит, сможет ли он быть быстрее официального Go-компилятора (сомнительно, но Rust даёт шанс на более безопасные оптимизации).
На Hacker News обсуждение быстро скатилось в старую добрую войну “Rust vs Go”: кто быстрее компилирует.
Такие эксперименты — тест на гибкость экосистемы. Появление альтернативных реализаций компиляторов укрепляет экосистему Go и открывает двери к новым сценариям — например, встраиванию Go в Rust-приложения или кроссплатформенным билдам без LLVM.
Репозиторий на GitHub
Обсуждение на Hacker News
@go_for_devs
Raph Amorim решил написать компилятор для Go… на Rust. Проект называется Goiaba (в переводе с португальского — гуава), и это пока эксперимент, но довольно показательный.
Автор известен по вкладам в экосистему WebAssembly и Wasmer. Его цель — исследовать, насколько реально собрать полноценный Go-компилятор с нуля на Rust, не используя LLVM, TinyGo или классический toolchain от Google.
• Goiaba написан на чистом Rust, без зависимостей от существующих Go-компиляторов.
• Потенциально может использоваться как библиотека внутри Rust-проектов.
• Может компилировать Go-код в WebAssembly, как TinyGo, но с иным подходом к архитектуре.
• Сообщество уже спорит, сможет ли он быть быстрее официального Go-компилятора (сомнительно, но Rust даёт шанс на более безопасные оптимизации).
На Hacker News обсуждение быстро скатилось в старую добрую войну “Rust vs Go”: кто быстрее компилирует.
> Скорость компиляции — не то, о чём я переживаю в Go. В отличие от Rust, с которым я почти не работаю — в том числе именно из-за скорости компиляции.
> Меня реально удивляет, что люди до сих пор жалуются на скорость компиляции Rust. Я работал с довольно большими проектами — отладочная сборка занимает несколько секунд, релизная — меньше минуты. Это точно не хуже, чем сборка TypeScript.
Такие эксперименты — тест на гибкость экосистемы. Появление альтернативных реализаций компиляторов укрепляет экосистему Go и открывает двери к новым сценариям — например, встраиванию Go в Rust-приложения или кроссплатформенным билдам без LLVM.
Репозиторий на GitHub
Обсуждение на Hacker News
@go_for_devs
🔥8👍5❤2😁1
Forwarded from Cross Join - канал о разработке (Anton Okolelov)
Не, ну какие контрол-фрики эти правила придумывают
Может, еще пробелы по штангенциркулю подравнять?
Может, еще пробелы по штангенциркулю подравнять?
😁9👍3😱3
Команда Go for Devs подготовила перевод статьи о том, как в Go устроено управление скоростью работы сборщика мусора.
TL;DR: даже при тысячах горутин GC подстраивается под нагрузку, выбирая между меньшим числом долгих пауз и большим числом коротких.
Итог — разработчику почти не нужно вручную «крутить» настройки, рантайм сам находит оптимальный ритм.
📚 Подробности на Хабр: https://habr.com/ru/articles/953426/
Первая статья из серии.
Вторая статья из серии.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3❤1
🪲 Cloudflare нашли редчайший баг — прямо в компиляторе Go для ARM64!
Да, это не опечатка: не рантайм, не race condition в их коде, а чистый косяк в сгенерированном машинном коде Go. И баг был настолько редким, что проявиться он мог только в инфраструктуре масштаба Cloudflare — при 84 миллионах HTTP-запросов в секунду.
На ARM64-машинах Cloudflare стали вылезать странные паники вроде
После недель отладки выяснилось: краш происходит при асинхронном вытестении (введённом в Go 1.14), когда рантайм прерывает горутину между двумя машинными инструкциями, корректирующими указатель стека. В этот момент стек оказывается в «разрезанном» состоянии — раскрутчик стека получает некорректный указатель и падает.
Инженеры написали минимальный Go-пример, где функция с большим стеком (>64 КБ) порождает тот самый двойной ADD. После пары минут работы программа стабильно умирала с SIGSEGV. Без сторонних библиотек. Только чистый Go.
Разобравшись, они подтвердили: это ошибка в компиляторе Go, который на ARM64 разбивает корректировку стека на две инструкции, не учитывая возможность асинхронного вытеснения между ними.
Go-команда признала баг и исправила его в версиях go1.23.12, go1.24.6 и go1.25.0.
Получается, даже компиляторы ошибаются) Просто чтобы поймать такой баг, нужно немного — пара сотен дата-центров и десятки миллионов запросов в секунду.
Источник
@go_for_devs
Да, это не опечатка: не рантайм, не race condition в их коде, а чистый косяк в сгенерированном машинном коде Go. И баг был настолько редким, что проявиться он мог только в инфраструктуре масштаба Cloudflare — при 84 миллионах HTTP-запросов в секунду.
На ARM64-машинах Cloudflare стали вылезать странные паники вроде
traceback did not unwind completely — ошибка, указывающая на повреждённый стек при попытке раскрутки. Поначалу инженеры списали это на баг в старом коде с panic/recover, потом — на библиотеку Go Netlink. Но когда даже без неё паники продолжились, стало ясно: проблема глубже.После недель отладки выяснилось: краш происходит при асинхронном вытестении (введённом в Go 1.14), когда рантайм прерывает горутину между двумя машинными инструкциями, корректирующими указатель стека. В этот момент стек оказывается в «разрезанном» состоянии — раскрутчик стека получает некорректный указатель и падает.
Инженеры написали минимальный Go-пример, где функция с большим стеком (>64 КБ) порождает тот самый двойной ADD. После пары минут работы программа стабильно умирала с SIGSEGV. Без сторонних библиотек. Только чистый Go.
package main
import (
"runtime"
)
//go:noinline
func big_stack(val int) int {
var big_buffer = make([]byte, 1 << 16)
sum := 0
// предотвращаем оптимизацию стека компилятором
for i := 0; i < (1<<16); i++ {
big_buffer[i] = byte(val)
}
for i := 0; i < (1<<16); i++ {
sum ^= int(big_buffer[i])
}
return sum
}
func main() {
go func() {
for {
runtime.GC()
}
}()
for {
_ = big_stack(1000)
}
}
Разобравшись, они подтвердили: это ошибка в компиляторе Go, который на ARM64 разбивает корректировку стека на две инструкции, не учитывая возможность асинхронного вытеснения между ними.
Go-команда признала баг и исправила его в версиях go1.23.12, go1.24.6 и go1.25.0.
Получается, даже компиляторы ошибаются) Просто чтобы поймать такой баг, нужно немного — пара сотен дата-центров и десятки миллионов запросов в секунду.
Источник
@go_for_devs
👍10🔥9🤯6❤1
При разработке веб-API у вас часто бывает множество конечных точек, логически связанных между собой. Например, один набор маршрутов — для управления пользователями, другой — для работы с товарами, третий — для обработки заказов. Без должной организации ваш код быстро превращается в хаотичный набор маршрутов, который трудно читать, сопровождать и развивать.
r.GET("/books", getBooks)
r.POST("/books", createBook)
r.GET("/members", getMembers)
r.POST("/members", createMember)
Здесь на помощь приходит группировка маршрутов. Она позволяет объединять связанные маршруты под общим префиксом пути. Представьте, что вы создаёте «папки» для маршрутов: каждая группа содержит набор конечных точек, которые относятся друг к другу. Это не только повышает читаемость кода, но и упрощает применение общего поведения (например, middleware) к определённым группам маршрутов.
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// Grouping book-related routes
bookGroup := r.Group("/books")
{
bookGroup.GET("/", getBooks)
bookGroup.POST("/", createBook)
}
// Grouping member-related routes
memberGroup := r.Group("/members")
{
memberGroup.GET("/", getMembers)
memberGroup.POST("/", createMember)
}
r.Run()
}
Заметьте, насколько чище стало: все маршруты, связанные с книгами, сгруппированы под
/books, а все, связанные с читателями, — под /members. Это упрощает навигацию по коду и понимание его структуры.📚 Подробности на Хабр: https://habr.com/ru/articles/955802/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥2🤯1
🫢 А вы знали, что у Go есть свой ML-фреймворк?
И называется он GoMLX, развивается с 2023 года — и, внимание, всё ещё жив! Последний коммит был пару недель назад.
GoMLX — это полноценный фреймворк на чистом Go, без Python и C++ под капотом. Он умеет всё, что должен уметь взрослый AI-инструмент: автодифф, готовые слои вроде LSTM и Attention, оптимизаторы (SGD, Adam), визуализацию, чекпоинты и даже метрики обучения.
За скорость отвечает OpenXLA/PJRT — тот же движок, что крутит JAX и TensorFlow. А если хочется поиграть — можно запустить модели прямо в браузере через WASM.
Разработчик уже показал демки: классификатор “кошки против собак”, diffusion-модель и даже AlphaZero-бот, который играет в настольную игру Hive. Всё это — на Go.
Конечно, GoMLX пока не собирается отбирать хлеб у PyTorch(будем честны, и не смог бы) , но сам факт впечатляет: язык, который когда-то ассоциировался с микросервисами и горутинами, теперь присутствует и на территории машинного обучения.
GitHub
Туториал
Сравнение с Python
Попробовать
@go_for_devs
И называется он GoMLX, развивается с 2023 года — и, внимание, всё ещё жив! Последний коммит был пару недель назад.
GoMLX — это полноценный фреймворк на чистом Go, без Python и C++ под капотом. Он умеет всё, что должен уметь взрослый AI-инструмент: автодифф, готовые слои вроде LSTM и Attention, оптимизаторы (SGD, Adam), визуализацию, чекпоинты и даже метрики обучения.
За скорость отвечает OpenXLA/PJRT — тот же движок, что крутит JAX и TensorFlow. А если хочется поиграть — можно запустить модели прямо в браузере через WASM.
Разработчик уже показал демки: классификатор “кошки против собак”, diffusion-модель и даже AlphaZero-бот, который играет в настольную игру Hive. Всё это — на Go.
Конечно, GoMLX пока не собирается отбирать хлеб у PyTorch
GitHub
Туториал
Сравнение с Python
Попробовать
@go_for_devs
❤10👍7🔥5
⚡️ 1 000 000 узлов в Kubernetes
Кажется, кто-то снова решил побить рекорды: проект k8s-1m замахнулся на кластер из миллиона узлов.
Если вкратце:
1. Команда проекта разделила данные по степени важности. Критически важная информация сохраняется надёжно, а временные данные — такие как сигналы активности узлов — обрабатываются в упрощённом режиме, без избыточных гарантий. Это позволило значительно повысить производительность при большом числе операций.
2. Сетевой уровень построен на IPv6, что устраняет необходимость в NAT и дополнительной маршрутизации. Вместо одного централизованного планировщика используется распределённая схема: несколько независимых компонентов обрабатывают свои части кластера и передают результаты агрегатору. Такой подход снижает нагрузку и ускоряет распределение задач между узлами.
3. Основное ограничение выявилось не в самом Kubernetes, а в используемом хранилище данных. Стандартный etcd оказался узким местом при высокой частоте обновлений. В проекте его заменили на более лёгкую in-memory реализацию, что позволило увеличить скорость обработки и снизить задержки.
Главный вывод — масштаб системы определяется не количеством узлов, а скоростью и эффективностью работы с данными. При росте инфраструктуры важно разграничивать типы нагрузок, оптимизировать хранение и использовать горизонтальное масштабирование вместо усложнения отдельных компонентов.
Полный обзор на Хабр
Инструкция по запуску
@go_for_devs
Кажется, кто-то снова решил побить рекорды: проект k8s-1m замахнулся на кластер из миллиона узлов.
Если вкратце:
1. Команда проекта разделила данные по степени важности. Критически важная информация сохраняется надёжно, а временные данные — такие как сигналы активности узлов — обрабатываются в упрощённом режиме, без избыточных гарантий. Это позволило значительно повысить производительность при большом числе операций.
2. Сетевой уровень построен на IPv6, что устраняет необходимость в NAT и дополнительной маршрутизации. Вместо одного централизованного планировщика используется распределённая схема: несколько независимых компонентов обрабатывают свои части кластера и передают результаты агрегатору. Такой подход снижает нагрузку и ускоряет распределение задач между узлами.
3. Основное ограничение выявилось не в самом Kubernetes, а в используемом хранилище данных. Стандартный etcd оказался узким местом при высокой частоте обновлений. В проекте его заменили на более лёгкую in-memory реализацию, что позволило увеличить скорость обработки и снизить задержки.
Главный вывод — масштаб системы определяется не количеством узлов, а скоростью и эффективностью работы с данными. При росте инфраструктуры важно разграничивать типы нагрузок, оптимизировать хранение и использовать горизонтальное масштабирование вместо усложнения отдельных компонентов.
Полный обзор на Хабр
Инструкция по запуску
@go_for_devs
🔥5🤯4⚡2
💥 Как memory maps (mmap) обеспечивают в 25 раз более быстрый доступ к файлам в Go
Одно из самых медленных действий, которое можно совершить в приложении, — это системный вызов. Они медленные, потому что требуют перехода в ядро, а это дорогостоящая операция. Что делать, если нужно выполнять много операций ввода-вывода с диском, но при этом важна производительность? Один из вариантов — использовать memory maps.
Memory maps — это современный механизм Unix, позволяющий «включить» файл в виртуальную память. В контексте Unix «современный» означает появившийся где-то в 1980-х или позже. У вас есть файл с данными, вы вызываете
Производительность
Ниже сравнение производительности при чтении файла через memory map и через
Почти как магия. Возможно кто-то из вас помнит Varnish Cache – ускоритель HTTP, разработанный для динамических веб-сайтов с большим количеством контента. В 2006 году именно эта возможность делала его настолько быстрым при выдаче контента. Varnish Cache использовал memory maps, чтобы доставлять данные с невероятной скоростью.
Кроме того, поскольку можно работать с указателями на память, выделенную memory map, снижается нагрузка на память и уменьшается общая задержка.
Обратная сторона memory maps
Недостаток memory maps в том, что по сути в них нельзя писать. Причина кроется в устройстве виртуальной памяти.
Когда вы пытаетесь записать в область виртуальной памяти, которая не отображена на физическую, процессор вызывает page fault. Современный CPU отслеживает, какие страницы виртуальной памяти соответствуют каким физическим страницам. Если вы пишете в страницу, которая не сопоставлена, процессору нужна помощь.
При page fault операционная система:
1. Выделяет новую страницу памяти.
2. Считывает содержимое файла по нужному смещению.
3. Записывает это содержимое в новую страницу.
4. Затем управление возвращается приложению, и оно перезаписывает эту страницу новыми данными.
Можно просто поаплодировать тому, насколько это неэффективно. Думаю, можно с уверенностью сказать: писать через memory map — плохая идея, если важна производительность, особенно если есть риск, что файл ещё не загружен в физическую память.
Вот несколько бенчмарков:
Как видно, наличие страниц в кэше критически влияет на производительность.
Тем не менее, в начале Varnish Cache действительно писал через memory map. Как-то это срабатывало — в основном потому, что конкуренты тогда были гораздо хуже.
Источник
@go_for_devs
Одно из самых медленных действий, которое можно совершить в приложении, — это системный вызов. Они медленные, потому что требуют перехода в ядро, а это дорогостоящая операция. Что делать, если нужно выполнять много операций ввода-вывода с диском, но при этом важна производительность? Один из вариантов — использовать memory maps.
Memory maps — это современный механизм Unix, позволяющий «включить» файл в виртуальную память. В контексте Unix «современный» означает появившийся где-то в 1980-х или позже. У вас есть файл с данными, вы вызываете
mmap, и получаете указатель на участок памяти, где эти данные находятся. Теперь, вместо того чтобы делать seek и read, вы просто читаете по этому указателю, регулируя смещение, чтобы попасть в нужное место.Производительность
Ниже сравнение производительности при чтении файла через memory map и через
ReaderAt. ReaderAt использует системный вызов pread(), совмещающий seek и read, а mmap просто читает напрямую из памяти.
Случайное чтение (ReaderAt): 416.4 ns/op
Случайное чтение (mmap): 3.3 ns/op
---
Итерация (ReaderAt): 333.3 ns/op
Итерация (mmap): 1.3 ns/op
Почти как магия. Возможно кто-то из вас помнит Varnish Cache – ускоритель HTTP, разработанный для динамических веб-сайтов с большим количеством контента. В 2006 году именно эта возможность делала его настолько быстрым при выдаче контента. Varnish Cache использовал memory maps, чтобы доставлять данные с невероятной скоростью.
Кроме того, поскольку можно работать с указателями на память, выделенную memory map, снижается нагрузка на память и уменьшается общая задержка.
Обратная сторона memory maps
Недостаток memory maps в том, что по сути в них нельзя писать. Причина кроется в устройстве виртуальной памяти.
Когда вы пытаетесь записать в область виртуальной памяти, которая не отображена на физическую, процессор вызывает page fault. Современный CPU отслеживает, какие страницы виртуальной памяти соответствуют каким физическим страницам. Если вы пишете в страницу, которая не сопоставлена, процессору нужна помощь.
При page fault операционная система:
1. Выделяет новую страницу памяти.
2. Считывает содержимое файла по нужному смещению.
3. Записывает это содержимое в новую страницу.
4. Затем управление возвращается приложению, и оно перезаписывает эту страницу новыми данными.
Можно просто поаплодировать тому, насколько это неэффективно. Думаю, можно с уверенностью сказать: писать через memory map — плохая идея, если важна производительность, особенно если есть риск, что файл ещё не загружен в физическую память.
Вот несколько бенчмарков:
Запись через mmap, страницы не в памяти: 1870 ns/op
Запись через mmap, страницы в памяти: 79 ns/op
WriterAt: 303 ns/op
Как видно, наличие страниц в кэше критически влияет на производительность.
WriterAt, использующий системный вызов pwrite, даёт куда более предсказуемые результаты.Тем не менее, в начале Varnish Cache действительно писал через memory map. Как-то это срабатывало — в основном потому, что конкуренты тогда были гораздо хуже.
Источник
@go_for_devs
👍8❤4🔥3👎2
💥 Google представил Green Tea GC — сборщик мусора, который экономит до 40% CPU
Новый сборщик мусора в Go – Green Tea GC – уже тестируют в продакшене Google, и результаты ошеломляют — до 40% меньше времени на сборку мусора.
Исследование провели инженеры Google — Michael Knyszek и Austin Clements. Их цель: адаптировать Go GC под современные многоядерные процессоры, где традиционные алгоритмы просто застревают в ожидании кэш-памяти. Green Tea дебютировал в Go 1.25 как эксперимент (через GOEXPERIMENT=greenteagc), и уже в Go 1.26 его планируют включить по умолчанию.
Главные инсайты:
🟣 Green Tea переходит от сканирования объектов к сканированию страниц памяти — это резко ускоряет обработку
🟣 В процессе сборки мусора теперь происходит меньше случайных обращений к памяти
🟣 В среднем — на 10% меньше CPU времени на GC, максимум — до 40% экономии
🟣 На новых CPU с AVX-512 ожидается ещё +10% ускорения благодаря векторным инструкциям
🟣 Уже к Go 1.26 это будет дефолтный GC (с возможностью откатить через GOEXPERIMENT=nogreenteagc)
Green Tea не появился из ниоткуда, он стал результатом многолетней командной работы. Идея родилась ещё в 2018-м, обрела форму в 2024-м, когда прототип писали в японских кафе за чашкой матча, и превратилась в продакшн-технологию в 2025-м (см. картинку). Это пример того, как одно простое инженерное озарение становится революцией, когда за ним стоит сообщество.
Источник
@go_for_devs
Новый сборщик мусора в Go – Green Tea GC – уже тестируют в продакшене Google, и результаты ошеломляют — до 40% меньше времени на сборку мусора.
Исследование провели инженеры Google — Michael Knyszek и Austin Clements. Их цель: адаптировать Go GC под современные многоядерные процессоры, где традиционные алгоритмы просто застревают в ожидании кэш-памяти. Green Tea дебютировал в Go 1.25 как эксперимент (через GOEXPERIMENT=greenteagc), и уже в Go 1.26 его планируют включить по умолчанию.
Главные инсайты:
Green Tea не появился из ниоткуда, он стал результатом многолетней командной работы. Идея родилась ещё в 2018-м, обрела форму в 2024-м, когда прототип писали в японских кафе за чашкой матча, и превратилась в продакшн-технологию в 2025-м (см. картинку). Это пример того, как одно простое инженерное озарение становится революцией, когда за ним стоит сообщество.
Источник
@go_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍5❤4🤔1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
10 ноября языку Go стукнуло 16 лет с момента выхода в Open source — и команда подошла к дню рождения не с ностальгией, а с результатами.
Вот главное, что произошло вокруг именинника за последнее время:
Команда обещает, что это только начало — и обороты они точно снижать не собираются.
@go_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👏4🔥2❤1
Forwarded from AI for Devs
😬 TOON: новый формат на смену JSON для более эффективного взаимодействия с LLM?
TOON — это ещё один способ записать те же самые JSON-данные, но компактнее и понятнее для моделей. Вместо
Пример из README: вместо обычного JSON с пользователями — строка
Главная идея — экономия токенов и более предсказуемое поведение LLM на больших массивах данных. Помните, мы даже рассказывали про то, что от формата напрямую может зависеть результат генерации.
В бенчмарках TOON даёт порядка 30–60% экономии токенов на больших ровных массивах объектов по сравнению с форматированным JSON и заметно меньше, но всё равно ощутимо — против compact JSON. На ряде задач TOON показывает чуть более высокую точность ответов, чем обычный JSON при меньшем числе токенов.
При этом авторы честно фиксируют зоны, где TOON не выгоден.
То есть формат заточен именно под «много однотипных объектов с примитивными полями», а не под любые данные подряд.
Для использования уже есть CLI через
@ai_for_devs
TOON — это ещё один способ записать те же самые JSON-данные, но компактнее и понятнее для моделей. Вместо
"key": "value" он использует отступы как YAML и табличную запись для массивов объектов: шапка с названиями полей, дальше строки с данными.Пример из README: вместо обычного JSON с пользователями — строка
users[2]{id,name,role}: и две строки 1,Alice,admin и 2,Bob,user. Структура при этом не теряется: объекты, массивы и примитивы остаются теми же, формат — просто «другая запись» того же JSON.Главная идея — экономия токенов и более предсказуемое поведение LLM на больших массивах данных. Помните, мы даже рассказывали про то, что от формата напрямую может зависеть результат генерации.
В бенчмарках TOON даёт порядка 30–60% экономии токенов на больших ровных массивах объектов по сравнению с форматированным JSON и заметно меньше, но всё равно ощутимо — против compact JSON. На ряде задач TOON показывает чуть более высокую точность ответов, чем обычный JSON при меньшем числе токенов.
При этом авторы честно фиксируют зоны, где TOON не выгоден.
Если структура сильно вложенная, неравномерная и почти не подходит под табличный вид, компактный JSON в тестах иногда оказывается короче. Если данные вообще чисто табличные и плоские, CSV по-прежнему даёт минимальный размер, а TOON добавляет небольшой оверхед ради явной структуры и валидации.
То есть формат заточен именно под «много однотипных объектов с примитивными полями», а не под любые данные подряд.
Для использования уже есть CLI через
npx @toon-format/cli и TypeScript-библиотека @toon-format/toon.@ai_for_devs
😁7👍3🔥3