Приветствую, в высоконагруженной среде аллокации большого размера достаточно сильно влияют на скорость обработки той или иной части сервиса, для того чтобы более тонко контролировать память, появились арены. Как же они включаются? Тут всё просто, нужен флаг GOEXPERIMENT=arenas. Разберем на примере работу памяти с "маленькими объектами".Маршрут "маленького объекта"За "маленькие объекты" (крошечные) в Golang отвечает так называемый "tiny allocator". Как же он работ…
Привет, меня зовут Рома! Какое-то время назад я захотел изучить всю внутрянку Go, заглянуть в исходники языка и понять, почему все устроено так, как устроено. В этот самый момент я обнаружил, что на просторах интернета практически отсутствуют материалы, которые подробно разбирают типы данных, их вспомогательные функции, детали реализации runtime и так далее. Мной было принято решение сделать это самостоятельно. Изначально я занимался этим для себя, но позже решил, что стоит поделиться моими наб…
В прошлой статье, я познакомил с работой контекста, его внутренними методами, примерами. В этот же раз хотелось бы глубже погрузиться в работу внутреннего взаимодействия контекста с призмы его отмены, поэтому эта статья является продолжением прошлой.Отмена как явноеfunc main() { ctx, cancel := context.WithCancel(context.Background()) go func() { if err := worker(ctx); err != nil { log.Printf("воркер выполнился: %v", err) } }() time.Sleep(time.Second) cancel() time.Sle…
Мне кажется, что уже есть сотни разных статей на эту тему, но каждый раз мне чего-то не хватало. Поэтому я решил написать свою статью, в которой покажу, как я реализую авторизацию и аутентификацию в своих проектах. Это именно гайд: вы можете взять готовый код и адаптировать его под свои нужды. В рамках статьи будут использоваться Ory Hydra и Ory Kratos, Apache APISIX в качестве API Gateway и несколько микросервисов на Golang. Всё это будет работать в Docker, чтобы вы могли легко запустить и п…
В .NET 9 появилась интересная функциональность — Log Buffering, которая позволяет буферизовать логи в памяти и выводить их только при определенных условиях. Меня заинтересовала эта идея, что я решил реализовать аналогичный механизм для Go. Так появился EmitLog — пакет для условной буферизации логов.Проблема традиционного логированияПредставьте типичный веб-сервис с детальным логированием:func ProcessPayment(ctx context.Context, paymentID string) error { log.Debug("Starting payment proc…
Rattle — лёгкий инструмент для мониторинга логов Docker, который помогает оперативно получать важные ошибки в Telegram до того, как о них напомнит клиент. Всё запускается через Docker Compose — без дополнительной инфраструктуры и сложной интеграции.Rattle — Telegram уведомления из Docker💡 Зачем нужен RattleИнструмент создан для разработчиков небольших проектов — когда нужно быстро получать важные ошибки и сообщения из Docker-контейнеров без развёртывания сложной инфраструктуры.Всё, что требует…
Привет, Хабр! Это Вадим из команды AvitoTech. Поговорить о программировании любите? Обновления обсудить, про подходы похоливарить, вот это вот все. Мы вот такое очень любим и даже вживую собираемся, чтобы поболтать на дринкапах.Дринкап если что – это такая тусовка на которой не монологичные доклады и формальные дискуссии нужно слушать, а разговаривать есть возможность. О наболевших для сообщества темах пообщаться, про личный опыт поговорить с коллегами, поспорить с ними о насущных проблемах. И …
Когда я вижу очередную статью или видеоурок про тестирование кода, я почти уверен, что мне опять расскажут про моки.Создаётся впечатление, что это самый лучший и правильный способ писать тесты, и вообще, невозможно обойтись без моков. Это не так! Можно писать тестируемый код без моков. Более того, использование моков следует избегать и использовать их только в специфичных случаях.Концепция мок-объектовКонцепция мок-объектов была впервые представлена в статье Endo-Testing: Unit Testing with Mock…
Несколько лет назад я начал добавлять Go в свой арсенал языков (будучи на тот момент Java разработчиком). Мне было очень непривычно. Более того, я принял язык не с первой попытки. Причём пришлось принять его больше из-за сложившихся обстоятельств, чем по собственному желанию.Но прошло время, Go стал моим основным языком и, рискну сказать, любимым. В статье ниже расскажу, почему язык казался мне непривычным, какие парадигмы мне пришлось поменять в своей голове и почему во многом это оказалось бо…