https://github.com/xataio/pgroll
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Оптимизация запросов в Go с real-time batching
Real-time batching — это стратегия обработки входящих данных, при которой вместо выполнения каждой операции по одной они накапливаются в батч и обрабатываются вместе через небольшие интервалы времени.
— Как это работает пошагово
1. Сбор событий в буфер — вместо того чтобы сразу обрабатывать каждое событие, мы добавляем его в очередь или в канал.
2. Таймер или лимит батча — если прошло, например, 50 мс, или набралось 100 событий, запускается обработка.
3. Групповая обработка — все собранные события обрабатываются одним запросом к базе данных, API или другому ресурсу.
— Где применяется
• Базы данных – массовые INSERT и UPDATE, минимизирующие нагрузку
• Очереди сообщений – накопление сообщений перед отправкой
• Логирование – запись логов блоками вместо построчной записи
• Аналитика – сбор событий перед отправкой в мониторинговую систему
👉 Подробности с примерами кода в статье
👉 @juniorGolang | #cтатья
Real-time batching — это стратегия обработки входящих данных, при которой вместо выполнения каждой операции по одной они накапливаются в батч и обрабатываются вместе через небольшие интервалы времени.
— Как это работает пошагово
1. Сбор событий в буфер — вместо того чтобы сразу обрабатывать каждое событие, мы добавляем его в очередь или в канал.
2. Таймер или лимит батча — если прошло, например, 50 мс, или набралось 100 событий, запускается обработка.
3. Групповая обработка — все собранные события обрабатываются одним запросом к базе данных, API или другому ресурсу.
— Где применяется
• Базы данных – массовые INSERT и UPDATE, минимизирующие нагрузку
• Очереди сообщений – накопление сообщений перед отправкой
• Логирование – запись логов блоками вместо построчной записи
• Аналитика – сбор событий перед отправкой в мониторинговую систему
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
Приятное улучшение качества жизни в Go 1.24:
Команда
Если есть несохранённые изменения, добавляется суффикс
👉 @juniorGolang
Команда
go build теперь устанавливает версию главного модуля (BuildInfo.Main.Version) в скомпилированном бинарнике на основе тега или коммита из системы контроля версий.Если есть несохранённые изменения, добавляется суффикс
+dirtyPlease open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥6
Концепции, которые должен знать каждый разработчик: параллелизм — это НЕ конкурентность
Параллелизм и конкурентность — два термина, которые часто вызывают путаницу.
Как метко заметил Роб Пайк (один из создателей GoLang): «Конкурентность — это про управление множеством задач одновременно. Параллелизм — это про выполнение множества задач одновременно.»
Один термин связан с управлением несколькими задачами одновременно, чередуя их для оптимизации использования ресурсов.
Другой — с одновременным выполнением нескольких задач, обычно на нескольких процессорах или ядрах.
— Что такое конкурентность?
Управление несколькими задачами на одном процессоре, чередуя их таким образом, чтобы создавалось впечатление одновременного выполнения, называется конкурентностью.
Это относится к способности системы переключаться между несколькими задачами, а не выполнять их одновременно, создавая иллюзию параллельного выполнения.
Конкурентность эффективно использует процессорное время, особенно когда задачи вынуждены ждать завершения других.
— Что такое параллелизм?
Параллелизм подразумевает выполнение нескольких задач одновременно.
Это достигается за счет эффективного использования нескольких процессоров или ядер в вычислительной системе.
Различие между конкурентностью и параллелизмом напрямую влияет на производительность и эффективность приложений.
Поскольку параллелизм поддерживает одновременное выполнение задач, он особенно полезен для вычислительно-интенсивных приложений, которые распределяют задачи по нескольким процессорам.
— Асинхронное программирование
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Этот подход позволяет программе запускать задачи без ожидания завершения предыдущих, управляя несколькими задачами в неблокирующем режиме.
Отличный пример — Node.js, который обрабатывает конкурентность в однопоточной модели с помощью обратных вызовов и циклов событий.
Между тем, многопоточные среды поддерживают как конкурентность, так и параллелизм.
Они позволяют выполнять задачи конкурентно на одном процессоре, а также обеспечивают истинный параллелизм на нескольких процессорах или ядрах одновременно.
Многопоточные языки программирования, такие как C#, предоставляют разработчикам возможность использовать эти функции.
Понимание различий между конкурентностью и параллелизмом — это важный аспект при создании высокопроизводительных и эффективных программных решений.
👉 @juniorGolang
Параллелизм и конкурентность — два термина, которые часто вызывают путаницу.
Как метко заметил Роб Пайк (один из создателей GoLang): «Конкурентность — это про управление множеством задач одновременно. Параллелизм — это про выполнение множества задач одновременно.»
Один термин связан с управлением несколькими задачами одновременно, чередуя их для оптимизации использования ресурсов.
Другой — с одновременным выполнением нескольких задач, обычно на нескольких процессорах или ядрах.
— Что такое конкурентность?
Управление несколькими задачами на одном процессоре, чередуя их таким образом, чтобы создавалось впечатление одновременного выполнения, называется конкурентностью.
Это относится к способности системы переключаться между несколькими задачами, а не выполнять их одновременно, создавая иллюзию параллельного выполнения.
Конкурентность эффективно использует процессорное время, особенно когда задачи вынуждены ждать завершения других.
— Что такое параллелизм?
Параллелизм подразумевает выполнение нескольких задач одновременно.
Это достигается за счет эффективного использования нескольких процессоров или ядер в вычислительной системе.
Различие между конкурентностью и параллелизмом напрямую влияет на производительность и эффективность приложений.
Поскольку параллелизм поддерживает одновременное выполнение задач, он особенно полезен для вычислительно-интенсивных приложений, которые распределяют задачи по нескольким процессорам.
— Асинхронное программирование
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Этот подход позволяет программе запускать задачи без ожидания завершения предыдущих, управляя несколькими задачами в неблокирующем режиме.
Отличный пример — Node.js, который обрабатывает конкурентность в однопоточной модели с помощью обратных вызовов и циклов событий.
Между тем, многопоточные среды поддерживают как конкурентность, так и параллелизм.
Они позволяют выполнять задачи конкурентно на одном процессоре, а также обеспечивают истинный параллелизм на нескольких процессорах или ядрах одновременно.
Многопоточные языки программирования, такие как C#, предоставляют разработчикам возможность использовать эти функции.
Понимание различий между конкурентностью и параллелизмом — это важный аспект при создании высокопроизводительных и эффективных программных решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🔥3🤯1
Простое веб-приложение, которое демонстрирует случайные репозитории на GitHub, написанные на Go
👉 github.com/Glup3/gorepos
👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
Параллельный шаблон потоковой обработки в Go: как значительно быстрее сканировать большие хранилища S3 или GCS
Статья объясняет, как ускорить перечисление файлов в S3 и GCS, используя параллельную обработку в Go.
Стандартные методы обходят файлы последовательно, что замедляет процесс при работе с миллионами объектов. Автор предлагает разбивать пространство имен бакета на диапазоны и обрабатывать их горутинами, сокращая время сканирования.
В статье приводится пример реализации с библиотекой Rill, а также советы по настройке количества потоков для максимальной производительности.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Статья объясняет, как ускорить перечисление файлов в S3 и GCS, используя параллельную обработку в Go.
Стандартные методы обходят файлы последовательно, что замедляет процесс при работе с миллионами объектов. Автор предлагает разбивать пространство имен бакета на диапазоны и обрабатывать их горутинами, сокращая время сканирования.
В статье приводится пример реализации с библиотекой Rill, а также советы по настройке количества потоков для максимальной производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
https://github.com/GianlucaP106/minecraft
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥11
Как я отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов
Dawid Moczadło рассказывает, как он отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов за 24 часа, используя Go.
Основные моменты:
🔹 Использование простоты и конкурентности Go
🔹 Модифицированная HTTP-библиотека Go для повышения эффективности
🔹 Развернул 60 подов, каждый из которых выполнял 100–400 запросов в секунду
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Dawid Moczadło рассказывает, как он отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов за 24 часа, используя Go.
Основные моменты:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🤯3
Знали ли вы, что можно проанализировать любой Go-бинарник и узнать, с какой версией Go он был собран?
Команда
Очень пригодится при отладке бинарников, отправленных в продакшен👍
👉 @juniorGolang
Команда
go version -m <file> делает именно это, а также показывает другую полезную информацию о сборке. Очень пригодится при отладке бинарников, отправленных в продакшен
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
Конструктор схем для Go для разбора и валидации значений во время выполнения. Определяйте схемы, преобразовывайте значения, проверяйте соответствие структурам или выполняйте и то, и другое.
Схемы Zog выразительны, что позволяет выполнять сложную валидацию или трансформации.
👉 GitHub: https://github.com/Oudwins/zog
👉 @juniorGolang | #ресурсы
Схемы Zog выразительны, что позволяет выполнять сложную валидацию или трансформации.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - Oudwins/zog: Go with Zod inspired simple schema validation
Go with Zod inspired simple schema validation. Contribute to Oudwins/zog development by creating an account on GitHub.
👍3
Как реализовать аутентификацию JWT в вашем Golang API
Статья описывает внедрение JWT-аутентификации в API на Go с использованием https://github.com/golang-jwt/jwt
Рассматриваются преимущества JWT, разделение на Access и Refresh токены для управления сессиями, а также приводится практическая реализация.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Статья описывает внедрение JWT-аутентификации в API на Go с использованием https://github.com/golang-jwt/jwt
Рассматриваются преимущества JWT, разделение на Access и Refresh токены для управления сессиями, а также приводится практическая реализация.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Создание контейнерного образа golang для продакшена
Одна из причин, по которой я люблю Go, — это простота сборки и контейнеризации. Однако важно, чтобы продакшен-приложение имело минимальную поверхность атаки, было портативным и занимало мало места.
Давайте разберёмся, как этого добиться.
1. Используем многоступенчатую сборку
Берём официальный образ Go 1.24.0 и называем этот этап
🔹 Подробнее: Docker multi-stage build
2. Копируем код проекта
Это перемещает файлы проекта в контейнер и устанавливает рабочую директорию
3. Улучшаем безопасность компиляции
Опции компилятора C для защиты стека и предотвращения атак.
🔹 Подробнее: Stack protection in GCC & Clang
Команда для сборки Position Independent Executable (PIE) — это добавляет дополнительный уровень безопасности
4. Используем distroless-образ для финального контейнера
На этом этапе мы используем Distroless вместо обычного Linux-образа.
🔹 Почему это важно? Distroless-образы меньше, безопаснее и не содержат ненужных пакетов. Подробнее: GoogleContainerTools/distroless
5. Копируем собранный бинарник
Переносим скомпилированный Go-файл в финальный образ. Замените
6. Запускаем контейнер с минимальными привилегиями
Запускаем контейнер от пользователя с минимальными правами (обычно это
Определяем команду для запуска контейнера. Не забудьте заменить
Вот и всё! Минимальный, безопасный и продакшен-готовый контейнерный образ Go.
👉 @juniorGolang
Одна из причин, по которой я люблю Go, — это простота сборки и контейнеризации. Однако важно, чтобы продакшен-приложение имело минимальную поверхность атаки, было портативным и занимало мало места.
Давайте разберёмся, как этого добиться.
1. Используем многоступенчатую сборку
FROM golang:1.24.0-bullseye AS builder
Берём официальный образ Go 1.24.0 и называем этот этап
builder. Мы создаём многоступенчатый Docker-образ, поскольку Go компилируется в бинарный файл, и сам Go нам для работы не нужен — можно удалить зависимости после сборки.2. Копируем код проекта
COPY . /workdir
WORKDIR /workdir
Это перемещает файлы проекта в контейнер и устанавливает рабочую директорию
/workdir3. Улучшаем безопасность компиляции
ENV CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all"
Опции компилятора C для защиты стека и предотвращения атак.
ENV GOFLAGS="-buildmode=pie"
Команда для сборки Position Independent Executable (PIE) — это добавляет дополнительный уровень безопасности
4. Используем distroless-образ для финального контейнера
FROM gcr.io/distroless/base-debian11:nonroot
На этом этапе мы используем Distroless вместо обычного Linux-образа.
5. Копируем собранный бинарник
COPY --from=builder /workdir/app /bin/app
Переносим скомпилированный Go-файл в финальный образ. Замените
app на имя вашего основного Go-файла.6. Запускаем контейнер с минимальными привилегиями
USER 65534
Запускаем контейнер от пользователя с минимальными правами (обычно это
nobody), что повышает безопасность.ENTRYPOINT ["/bin/app"]
Определяем команду для запуска контейнера. Не забудьте заменить
app на название вашего бинарника.Вот и всё! Минимальный, безопасный и продакшен-готовый контейнерный образ Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤6🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
HTTP-туннель без зависимостей, с возможностью самостоятельного хостинга и кроссплатформенной поддержкой, который открывает ваш localhost для всего мира через публичный URL. Написан на Go
👉 https://github.com/yusuf-musleh/mmar
👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Go-реализация протокола Model Context Protocol (MCP), обеспечивающая бесшовную интеграцию между LLM-приложениями и внешними источниками данных и инструментами
В последнее время MCP набирает популярность, и этот простой пример хорошо подходит для изучения
https://github.com/mark3labs/mcp-go
👉 @juniorGolang | #ресурсы
В последнее время MCP набирает популярность, и этот простой пример хорошо подходит для изучения
https://github.com/mark3labs/mcp-go
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - mark3labs/mcp-go: A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications…
A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications and external data sources and tools. - mark3labs/mcp-go
👍6❤1🌭1
Анонсирован порт TypeScript на Go, который показывает двухкратное уменьшение использования памяти и десятикратное улучшение скорости работы
В этой статье разбор в деталях часового интервью с автором TypeScript Андерсом Хейлсбергом об этом портировании
👉 Читать
Официальный репозиторий: GitHub
👉 @juniorGolang | #cтатья
В этой статье разбор в деталях часового интервью с автором TypeScript Андерсом Хейлсбергом об этом портировании
Официальный репозиторий: GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥4
Go-пакет, который преобразует CSV-файл в базу данных SQLite в памяти, позволяя выполнять SQL-запросы к CSV-файлу
👉 https://github.com/sionpixley/inquiry
👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - sionpixley/inquiry: Inquiry is a Go package that converts CSV files into a SQLite database, allowing you to run SQL statements…
Inquiry is a Go package that converts CSV files into a SQLite database, allowing you to run SQL statements on them. - sionpixley/inquiry
🤯10👍4❤2
Что Go сделал правильно, а Rust — нет
Статья обсуждает преимущества языка программирования Go по сравнению с Rust, особенно в контексте недавнего решения Microsoft переписать компилятор и инструментарий TypeScript с JavaScript на Go для достижения 10-кратного повышения производительности.
В статье выделяются ключевые аспекты, в которых Go превосходит Rust
👉 Читать
👉 @juniorGolang | #cтатья
Статья обсуждает преимущества языка программирования Go по сравнению с Rust, особенно в контексте недавнего решения Microsoft переписать компилятор и инструментарий TypeScript с JavaScript на Go для достижения 10-кратного повышения производительности.
В статье выделяются ключевые аспекты, в которых Go превосходит Rust
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🤔6👍2👎1
https://github.com/lordaris/gotth-auth
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - lordaris/gotth-auth: a stateful authentication system template made with the gotth stack.
a stateful authentication system template made with the gotth stack. - GitHub - lordaris/gotth-auth: a stateful authentication system template made with the gotth stack.
👍6❤3