Обновить
1
0

Пользователь

Отправить сообщение

Обнаружение утечек памяти в Go через Pyroscope

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

Для обнаружения аномально высокой длительности выполнения отдельных функций (а также избыточного выделения или утечек памяти) используются инструменты профилирования над виртуальной машиной (например, JProfiler или Visual VM для JVM) или интегрированные в выполняемый код, например встроенный механизм при компиляции Go-приложений. Альтернативой может стать использование универсальных механизмов профилирования, которые интегрируются со средой выполнения и отправляют результаты профилирования на сервер, который может анализировать аномальное поведение и визуализировать выделение памяти и время выполнения отдельных функций (и построить flame graph по результатам анализа приложения во время выполнения). В этой статье мы рассмотрим использование Pyroscope совместно с Go для обнаружения утечек памяти.

Читать далее

Для чего нужен тип http.ResponseController?

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

Одно из моих самых любимых нововведений в недавнем релизе Go 1.20 — это тип http.ResponseController, который может похвастаться тремя очень приятными полезностями:

1. Теперь вы можете переопределять ваши общесерверные таймауты/дедлайны чтения и записи новыми для каждого отдельного запроса.
2. Шаблон использования интерфейсов http.Flusher и http.Hijacker стал более понятным и менее сложным. Нам больше не нужны никакие утверждения типов!
3. Он делает проще и безопаснее создание и использование пользовательских реализаций http.ResponseWriter.

Первые два преимущества упоминаются в описании изменений, которое прилагается к релизу, а третье, кажется, ускользнуло из всеобщего поля зрения... а жаль, потому что оно очень полезное! Что ж, давайте взглянем на них поближе.

Читать далее

[Разбор резюме] Бэкендер на Go: почему «ключевые навыки» никому не нужны и как уместить весь опыт на одной страничке

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

Привет, Хабр! Мы много разговариваем про найм, и решили запустить новую рубрику — разбор резюме. В ней наши профессиональные HR, которые регулярно просматривают сотни резюме, будут смотреть на присланные CV специалистов и советовать, что в них можно улучшить. Делать мы это будем именно с точки зрения HR-специалистов: они расскажут, что именно их бы оттолкнуло, а что — привлекло. Начнем с резюме бэкендера и дальше пойдем по другим профессиям.

Читать далее

Как обрабатывать ошибки в Golang – рассказываем на собственном примере

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

Ошибки это один из самых важных аспектов любого языка программирования. То, как обрабатываются ошибки, влияет на приложения многими способами. То, как определяются ошибки в Golang, немного отличается от таких языков как Java, Python, Javascript. В Go ошибки – это значения.

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

Читать далее

Осваиваем чистую архитектуру кода на Golang: практическое руководство по сущностям и слоям моделей

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

В архитектуре кода иногда разделяют слой сущностей и слой моделей. В этой статье я расскажу о них и приведу два примера кода на языке Golang.

Читать далее

О массивах и слайсах в Go

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

Массивы в Go являлись для меня одной из сложных тем, так как я не понимал как они работают. В данной статье рассмотрим как же именно работают слайсы и массивы в Go, а также как именно работает append и copy.

Читать далее

Разбираемся с рекурсией на примере связных списков

Время на прочтение10 мин
Охват и читатели6.3K
Разбираемся с рекурсией на примере связных списков.
Разбираемся с рекурсией на примере связных списков.
Разбираемся с рекурсией на примере связных списков.
Разбираемся с рек-ОШИБКА: ПЕРЕПОЛНЕНИЕ БУФЕРА

image
Матрёшка в разобранном виде
Читать дальше →

Секретный ингредиент для оценки архитектуры кода

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

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

Читайте дальше, и узнай их.

Девять способов выстрелить себе в ногу с PostgreSQL

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

Большинство этих проблем связано с масштабируемостью. Это то, что не повлияет на вас, пока база данных мала. Но если когда-нибудь вам захочется, чтобы база данных перестала быть маленькой, о таких вещах стоит подумать заранее. В противном случае они нанесут вам удар исподтишка, возможно, в самый неудобный момент. Плюс во многих случаях работы потребуется меньше, если делать всё правильно с самого начала, чем менять уже работающую систему.
Читать дальше →

Запуск аналогов ChatGPT на домашнем ПК в пару кликов и с интерфейсом

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

--- Обновление статьи 9 Августа 2023 ---

В течении последнего полугода в сфере текстовых нейронок всё кипит - после слитой в сеть модели Llama, aka "ChatGPT у себя на пекарне" люди ощутили, что никакой зацензуренный OpenAI по сути им и не нужен, а хорошие по мощности нейронки можно запускать локально.

Основная проблема в том, что всё это требует глубоких технических знаний.

Но в этой статье я расскажу, как запустить добротную нейросеть на домашнем ПК с 16ГБ ОЗУ в несколько кликов. Буквально в несколько кликов - копаться в консоли не придётся.

Читать далее

Как самостоятельно прокачивать английский

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

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

Читать далее

Полиморфизм: подавать холодным

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

Полиморфизм является одним из трёх столпов ООП, наравне с наследованием и инкапсуляцией, да и в целом краеугольным камнем современного программирования. Думаю, большинство читателей не представляет своей жизни без полиморфизма, за что я, конечно, это большинство никак не осуждаю, ибо сам к нему принадлежу. Дело, однако, в том, что многие не задумываются об устройстве этого полиморфизма, ведь любой принцип программирования, по сути, представляет из себя математическую матрёшку.

Читать далее

Kubernetes Observability: Prometheus and Grafana

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

Сегодня мы узнаем, как в Kubernetes:

– Установить Prometheus и Grafana.
– Настроить источник данных Prometheus для Grafana.
– Настроить панель инструментов для Grafana.
– Получить доступ к веб-интерфейсу Grafana.

Читать далее

Тайные каналы связи или как централизованные сервисы способны разлагаться изнутри

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

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

На первый взгляд кажется, что такой специфичный способ взаимодействия клиентов с сервисами представляет собой некий симбиоз, при котором мы друг друга дополняем и оберегаем (исключительно ради собственных интересов). Но всё же, если смотреть более углубленно на данный вид коммуникаций, то может появиться дополнительный вопрос: есть ли место в подобной парадигме паразитическим отношениям?

Читать далее

Шаблон backend сервера на Golang — часть 5 — оптимизация Worker pool

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

# Шаблон backend сервера на Golang — часть 5 — оптимизация Worker pool


Пятая часть посвящена оптимизации Worker pool и особенностям его работы в составе микросервиса, развернутого в Kubernetes.


Представленный Worker pool поддерживает работу с двумя типами задач


  • "Короткие" — не контролируется предельный timeout выполнения и их нельзя прервать
  • "Длинные" — контролируется предельный timeout выполнения и их можно прервать

Накладные расходы Worker pool на добавление в очередь, контроль очереди, запуск обработки task, контроль времени выполнения task:


  • Для "коротких" task — от 300 ns/op, 0 B/op, 0 allocs/op
  • Для "длинных" task — от 1400 ns/op, 16 B/op, 1 allocs/op

Для task, которые должны выполняться быстрее 200 ns/op представленный Worker pool использовать не эффективно


Собираются следующие метрики prometheus:


  • wp_worker_process_count_vec — количество worker в работе
  • wp_task_process_duration_ms_by_name — гистограмма длительности выполнения task в ms с группировкой по task.name
  • wp_task_queue_buffer_len_vec — текущая длина канала-очереди task — показывает заполненность канала
  • wp_add_task_wait_count_vec — количество задач, ожидающих попадания в очередь

Ссылка на репозиторий проекта.


Шаблон goapp в репозитории полностью готов к развертыванию в Docker, Docker Compose, Kubernetes (kustomize), Kubernetes (helm).


Ссылки на предыдущие части:


  • Первая часть шаблона была посвящена HTTP серверу.
  • Вторая часть шаблона была посвящена прототипированию REST API.
  • Третья часть посвящена развертыванию шаблона в Docker, Docker Compose, Kubernetes (kustomize).
  • Четвертая часть будет посвящена развертыванию в Kubernetes с Helm chart и настройке Horizontal Autoscaler.
Читать дальше →

Assembler в Go: техники ускорения и оптимизации

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

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

В прошлой статье я рассказывал об ускорении копирования элементов одного слайса в другой с помощью средств Go. В этот раз я решил пойти дальше и посмотреть, что можно достичь, начав разговаривать с процессором на его языке. Я выбрал одну из оптимизированных версий функции Copy в качестве объекта исследования из решения задачи VK Cup'22/23, которая копирует только синий компонент RGBA в Paletted картинку. Если интересно узнать как её ускорить почти в 10 раз, прошу под кат.

Читать далее

Что не так с твоим покрытием тестов в Go?

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

Бюрократия семимильными шагами внедряется в процесс разработки. Людей в пиджаках интересуют лишь цифры, и это же относится к test coverage сервисов. Однако, покрытие зачастую (в том числе, благодаря создателям языка) не отображает полной картины мира. Так ли все плохо на самом деле?

Читать далее

Представляем вашему вниманию Artie Transfer

Время на прочтение6 мин
Охват и читатели759

Будучи активным пользователем хранилища данных (DWH) на разных ролях, я всегда находил определенные ограничения (и разочарования!) в связи с задержкой данных между нашим DWH и данными, которые находятся в онлайновых транзакционных (OLTP) базах данных. В зависимости от того, где я работал, задержка составляла от нескольких часов до суток (дней), причем более крупные компании, как правило, работали медленнее. 

Читать далее

5 паттернов параллельного программирования в GO, которые сделают ваш следующий проект лучше

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

Параллельное программирование — одна из самых интересных фич, которые может предложить вам Golang. Идея, лежащая в основе параллелизма, заключается в одновременной работе над несколькими разными процессами, что помогает избежать застревания в задачах, выполнение которых занимает много времени.

Читать далее

Go. О покрытии кода интеграционными тестами и флаге -cover

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

Инструменты покрытия кода помогают понять, какая часть кодовой базы выполняется (или, как еще говорят, покрывается) при выполнении данного набора тестов. Какое-то время Go поддерживал измерение покрытия кода на уровне пакета, введенное в Go 1.2, она включалась флагом команды go test -cover.


Это хорошо работает в большинстве случаев, но при разработке больших приложений обнаруживаются недостатки. Для больших приложений разработчики часто пишут интеграционные тесты, которые проверяют поведение всей программы (в дополнение к модульным тестам на уровне пакета).


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


Двоичные файлы интеграционных тестов создаются командой go build, а не go test, поэтому инструментарий Go до сих пор не предоставлял простого способа сбора профиля покрытия этих тестов.


С версии Go 1.20 программы с инструментированием покрытия можно создавать командой go build -cover, а затем, чтобы расширить область покрытия, передавать эти инструментированные двоичные файлы в интеграционный тест.


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

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

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность