Нияз Хадимуллин | Ментор по GO – Telegram
Нияз Хадимуллин | Ментор по GO
1.22K subscribers
138 photos
1 video
35 links
Авторский канал ментора Нияза про Go, базы данных и разработку

Если хочешь записаться на моё менторство и начать получать офферы, не стесняйся писать мне https://mentor-niyaz.ru
Download Telegram
🛠️ Context в Go: управление жизненным циклом операций

Что такое context?

Context — это механизм в Go для управления жизненным циклом операций, таких как HTTP-запросы, горутины или запросы к базам данных. Он позволяет передавать значения, отменять операции и задавать тайм-ауты.

💡 Зачем нужен context?

Context помогает:

1. Управлять отменой операций:

- Например, отмена HTTP-запроса при закрытии соединения.
2. Задавать тайм-ауты:
- Ограничение времени выполнения операции.
3. Передавать значения:
- Например, передача идентификатора запроса между горутинами.

⚠️ Когда использовать context?

Context полезен в следующих случаях:

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

Минусы context:

- Требует аккуратного использования, чтобы избежать утечек ресурсов.
- Может усложнить код, если используется чрезмерно.

🎯 Context — это мощный инструмент для управления жизненным циклом операций в Go!
🔥30👍2619
🛠️ Виды индексов в базах данных: какие бывают и зачем они нужны?

Что такое индексы?

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

💡 Какие бывают индексы?

1. B-дерево (B-tree):
- Самый распространенный тип индекса.
- Поддерживает быстрый поиск, вставку и удаление данных.
- Подходит для большинства сценариев.

2. Хэш-индекс (Hash index):
- Использует хэш-функции для быстрого поиска по точным значениям.
- Не подходит для диапазонных запросов (например, `BETWEEN`).

3. Составной индекс (Composite index):
- Индекс по нескольким столбцам.
- Полезен для запросов, которые фильтруют или сортируют по нескольким полям.

4. Полнотекстовый индекс (Full-text index):
- Используется для поиска по текстовым данным (например, LIKE или полнотекстовый поиск).

5. Пространственный индекс (Spatial index):
- Используется для работы с геоданными (например, координаты).

Минусы индексов:

- Занимают дополнительное место на диске.
- Замедляют операции вставки, обновления и удаления данных.

🎯 Индексы — это мощный инструмент для повышения производительности вашей базы данных
29👍29🔥25
День 6️⃣

Сегодня выходной, но это не повод расслабляться до талого! 🚀 Давайте используем время с пользой и подготовимся к вопросам, которые могут встретиться на собеседованиях или в работе💡

Полетели 🛸
👍3120🔥12
🔄 MCC и MVCC: контроль конкурентного доступа к данным

Что такое MCC и MVCC?

MCC (Multi-Version Concurrency Control) и MVCC (Multi-Version Concurrency Control) - это механизмы управления параллельным доступом к данным в базах данных.

💡 Основные концепции:

1. Версионность:
- Каждое изменение создает новую версию данных
- Старые версии сохраняются для параллельных транзакций
- Каждая транзакция видит свой снимок данных

2. Временные метки:
- Каждой версии присваивается временная метка
- Транзакции работают с версиями согласно своим меткам
- Обеспечивается согласованное чтение данных

⚠️ Когда использовать?

- Высоконагруженные системы с множеством параллельных операций
- Приложения, требующие изоляции read-committed или snapshot isolation
- Системы с преобладанием операций чтения над записью

Особенности реализации:

- Требует дополнительного пространства для хранения версий
- Необходим механизм очистки устаревших версий (vacuum)
- Возможны конфликты при одновременном изменении данных
👍3325🔥23
📊 GraphQL: язык запросов для API

Что такое GraphQL?

GraphQL - это язык запросов и среда выполнения для API, позволяющий клиентам точно указывать, какие данные им нужны.

💡 Ключевые концепции:

1. Структура:
- Схема (Schema)
- Типы (Types)
- Резолверы (Resolvers)
- Мутации (Mutations)

2. Операции:
- Queries (получение данных)
- Mutations (изменение данных)
- Subnoscriptions (реальное время)

⚠️ Когда использовать?

- Сложные клиентские приложения
- Агрегация данных из разных источников
- Мобильные приложения с ограниченным трафиком
- API с разнообразными клиентами

Особенности реализации:

- Сложность начальной настройки
- Необходимость написания схемы
- Потенциальные проблемы с кэшированием
👍4420🔥13
🔌 WebSocket: двунаправленная связь в реальном времени

Что такое WebSocket?

WebSocket - это протокол, обеспечивающий полнодуплексную связь между клиентом и сервером поверх TCP-соединения.

💡 Основные концепции:

1. Установка соединения:
- Handshake через HTTP
- Upgrade до WebSocket
- Постоянное соединение

2. Особенности протокола:
- Двунаправленная передача данных
- Минимальные накладные расходы
- Поддержка сообщений и фреймов

⚠️ Когда использовать?

- Чаты и мессенджеры
- Онлайн-игры
- Системы мониторинга
- Торговые платформы

Важные моменты:

- Нагрузка на сервер при большом количестве соединений
- Необходимость обработки разрывов соединения
- Сложность масштабирования
👍28🔥2815
🌐 gRPC: современный RPC фреймворк

Что такое gRPC?

gRPC - это высокопроизводительный фреймворк для удаленного вызова процедур (RPC), разработанный Google.

💡 Ключевые особенности:

1. Протокол:
- Protocol Buffers для сериализации
- HTTP/2 для транспорта
- Поддержка потоковой передачи
- Двунаправленная коммуникация

2. Типы взаимодействий:
- Унарные (request/response)
- Серверные потоки
- Клиентские потоки
- Двунаправленные потоки

⚠️ Когда использовать?

- Микросервисная архитектура
- Системы реального времени
- Мобильные приложения
- Высоконагруженные системы

Особенности реализации:

- Необходимость написания .proto файлов
- Сложность отладки
- Требует HTTP/2
19👍19🔥11
📦 MongoDB: документоориентированная СУБД

Что такое MongoDB?

MongoDB - это NoSQL база данных, которая хранит данные в формате BSON (бинарный JSON) и обеспечивает высокую производительность и масштабируемость.

💡 Основные концепции:

1. Структура данных:
- Коллекции (аналог таблиц)
- Документы (аналог строк)
- Поля (аналог колонок)
- Индексы для оптимизации запросов

2. Операции:
- CRUD операции (Create, Read, Update, Delete)
- Агрегации для сложной обработки данных
- Транзакции (с версии 4.0)

⚠️ Когда использовать?

- Большие объемы неструктурированных данных
- Частые изменения схемы данных
- Горизонтальное масштабирование
- Высокая нагрузка на чтение/запись

Особенности:

- Отсутствие строгой схемы данных
- Ограничения при сложных JOIN-операциях
- Потребление большего объема памяти
32🔥31👍11
День 7️⃣

Новая неделя — новые разборы💡

Вперед 👏
👍10🔥31
📍 Указатели в Golang: значения vs адреса

Что такое указатели в Go?

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

💡 Ключевые концепции:

1. Объявление и инициализация:

var x int = 10 // Переменная
var p *int = &x // Указатель на x

2. Операторы указателей:
- & - получение адреса переменной
- * - разыменование (получение значения по адресу)
- nil - нулевой указатель

⚠️ Когда использовать указатели?

- Передача больших структур в функции
- Модификация переменных внутри функций
- Реализация методов, изменяющих состояние
- Работа со слайсами и мапами

Важные моменты:

- Указатели увеличивают сложность кода
- Возможны null pointer exceptions
- Необходимо следить за временем жизни объектов
6👍4🔥2
📨 Структура HTTP запроса: анатомия веб-коммуникации

Что такое HTTP запрос?

HTTP запрос — это сообщение, которое клиент отправляет серверу. Каждый запрос содержит определенную структуру, которая позволяет серверу понять, что именно хочет клиент.

💡 Основные компоненты:

1. Стартовая строка:
   METHOD /path HTTP/version
- METHOD: GET, POST, PUT, DELETE, etc.
- path: URL-путь к ресурсу
- version: HTTP/1.1 или HTTP/2

2. Заголовки (Headers):
   Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Content-Type: application/json
Authorization: Bearer token123

3. Тело запроса (опционально):
   {
"key": "value",
"data": "content"
}

⚠️ Важные моменты:

- Заголовки отделяются от тела пустой строкой
- Каждый заголовок на новой строке
- Регистр методов имеет значение
- Content-Length должен соответствовать размеру тела

Особенности:

- Разные методы имеют разное предназначение
- Некоторые заголовки обязательны
- Тело запроса не используется в GET-запросах
👍126🔥1
🌐 UDP: быстрый, но ненадежный протокол

Что такое UDP?

UDP (User Datagram Protocol) — протокол транспортного уровня, обеспечивающий простой механизм передачи данных без установления соединения.

💡 Ключевые характеристики:

1. Структура датаграммы:
- Заголовок (8 байт)
- Порт источника (2 байта)
- Порт назначения (2 байта)
- Длина (2 байта)
- Контрольная сумма (2 байта)

2. Особенности работы:
- Нет подтверждения доставки
- Нет контроля последовательности
- Нет контроля потока
- Минимальные накладные расходы

⚠️ Когда использовать?

- Стриминг медиа
- Онлайн-игры
- DNS-запросы
- VoIP-сервисы

Ограничения:

- Возможна потеря пакетов
- Нет гарантии порядка доставки
- Нет механизма восстановления данных
👍133🔥1
🔒 CORS: защита и доступ между источниками

Что такое CORS?

CORS (Cross-Origin Resource Sharing) — механизм, который позволяет или запрещает веб-страницам делать запросы к другим доменам.

💡 Основные концепции:

1. Заголовки CORS:
   Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400

2. Типы запросов:
- Простые (GET, POST, HEAD)
- Предварительные (OPTIONS)
- Сложные (с дополнительными заголовками)

⚠️ Когда настраивать?

- API с разных доменов
- Микрофронтенды
- CDN-ресурсы
- Сторонние сервисы

Важные моменты:

- Настраивается на сервере
- Влияет на безопасность
- Может блокировать легитимные запросы
🔥128👍3
🛡️ CSP: политика безопасности контента

Что такое CSP?

Content Security Policy — механизм безопасности, который позволяет определить источники загрузки ресурсов для веб-страницы.

💡 Основные директивы:

1. Настройка политик:
   Content-Security-Policy: default-src 'self';
noscript-src 'self' trusted.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;

2. Ключевые параметры:
- default-src: базовая политика
- noscript-src: источники скриптов
- style-src: источники стилей
- connect-src: разрешенные подключения

⚠️ Когда применять?

- Защита от XSS
- Контроль внешних ресурсов
- Защита от инъекций
- Аудит безопасности

Особенности внедрения:

- Может сломать существующий функционал
- Требует тщательного тестирования
- Нужна постепенная настройка
5👍5🔥2
🔍 DNS: как работает резолвинг доменных имен

Что происходит при поиске в браузере?

DNS (Domain Name System) преобразует доменные имена в IP-адреса. Процесс включает несколько этапов.

💡 Процесс резолвинга:

1. Этапы поиска:
- Проверка браузерного кэша
- Проверка кэша ОС
- Запрос к локальному DNS-серверу
- Рекурсивный поиск через корневые серверы

2. Иерархия DNS:
   . (root)
├── .com
│ └── example.com
│ └── www.example.com
├── .org
└── .net

⚠️ Последовательность действий:

1. Ввод URL в браузер
2. Поиск IP в локальных кэшах
3. Запрос к DNS-серверу провайдера
4. Рекурсивный поиск через DNS-серверы
5. Получение IP-адреса
6. Установка HTTP-соединения

Особенности:

- DNS-записи кэшируются
- Существуют разные типы записей (A, AAAA, MX, CNAME)
- Возможны проблемы с пропагацией*

*Пропагация в DNS — это процесс распространения изменений в DNS-записях (например, обновление IP-адреса или добавление новой записи) на все DNS-серверы, которые кэшируют эту информацию. Это может занять от нескольких минут до 48 часов, так как зависит от настроек TTL (Time to Live) и работы DNS-серверов по всему миру.
👍6🔥63
День 🎱

Вторник… вторник никогда не меняется.

Поехали 🛫
🔥54👍2
🔍 Бинарный поиск: эффективный поиск в отсортированных данных

Что такое бинарный поиск?

Бинарный поиск — алгоритм поиска элемента в отсортированном массиве с временной сложностью O(log n), работающий путем деления области поиска пополам на каждом шаге.

💡 Ключевые реализации:

1. Классический бинарный поиск:
func binarySearch(arr []int, target int) int {
left, right := 0, len(arr)-1

for left <= right {
mid := left + (right-left)/2

if arr[mid] == target {
return mid
}
if arr[mid] < target {
left = mid + 1
} else {
right = mid - 1
}
}
return -1
}

2. Поиск левой границы:
func binarySearchLeftmost(arr []int, target int) int {
left, right := 0, len(arr)

for left < right {
mid := left + (right-left)/2
if arr[mid] < target {
left = mid + 1
} else {
right = mid
}
}

if left < len(arr) && arr[left] == target {
return left
}
return -1
}

⚠️ Важные особенности:

- Массив должен быть отсортирован
- Правильное вычисление середины предотвращает переполнение
- Различные варианты для поиска границ при дубликатах
- Работает с любыми сравнимыми типами данных

Распространенные ошибки:

- Неправильные граничные условия
- Некорректная обработка дубликатов
- Забытая проверка на пустой массив
- Неверное обновление указателей
🔥11👍93
👥 Два указателя: элегантные решения для массивов и списков

Что такое техника двух указателей?

Метод двух указателей — подход к решению задач, использующий два указателя, которые перемещаются по структуре данных согласно определенным правилам.

💡 Основные паттерны:

1. Встречное движение:
func twoSum(nums []int, target int) []int {
left, right := 0, len(nums)-1

for left < right {
sum := nums[left] + nums[right]
if sum == target {
return []int{left, right}
}
if sum < target {
left++
} else {
right--
}
}
return nil
}

2. Быстрый и медленный указатели:
func findCycle(head *ListNode) bool {
if head == nil {
return false
}

slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil {
slow = slow.Next
fast = fast.Next.Next
if slow == fast {
return true
}
}
return false
}

⚠️ Типичные задачи:

- Поиск пары с заданной суммой
- Обнаружение циклов в связном списке
- Удаление дубликатов
- Палиндромы
- Сортировка трех цветов (Dutch Flag Problem)

Особенности применения:

- Часто требует предварительной сортировки
- Важен порядок обновления указателей
- Различные стратегии движения
- Обработка граничных случаев
👍186🔥2
📦 Set в Golang: эффективная работа с уникальными элементами

Что такое Set?

Set — структура данных для хранения уникальных элементов. В Go реализуется через map с пустой структурой в качестве значения для оптимизации памяти.

💡 Полная реализация:
type Set struct {
items map[interface{}]struct{}
}

func NewSet() *Set {
return &Set{
items: make(map[interface{}]struct{}),
}
}

// Основные операции
func (s *Set) Add(item interface{}) {
s.items[item] = struct{}{}
}

func (s *Set) Remove(item interface{}) {
delete(s.items, item)
}

func (s *Set) Contains(item interface{}) bool {
_, exists := s.items[item]
return exists
}

// Операции над множествами
func (s *Set) Union(other *Set) *Set {
result := NewSet()
for item := range s.items {
result.Add(item)
}
for item := range other.items {
result.Add(item)
}
return result
}

func (s *Set) Intersection(other *Set) *Set {
result := NewSet()
for item := range s.items {
if other.Contains(item) {
result.Add(item)
}
}
return result
}

⚠️ Преимущества:

- O(1) для основных операций
- Эффективное использование памяти
- Удобные операции над множествами
- Отсутствие дубликатов

Ограничения:

- Неупорядоченная структура
- Ключи должны быть сравнимыми
- Нет встроенной реализации
- Потребность в type assertions при использовании interface{}
👍16🔥42
📊 Столбчатые БД: оптимизация для аналитики

Что такое столбчатые БД?

Столбчатые БД — системы управления базами данных, хранящие данные по столбцам вместо строк, что оптимально для аналитических запросов и агрегаций.

💡 Основные представители:

1. ClickHouse:
- Высокая производительность
- Сжатие данных
- Векторные вычисления
- Материализованные представления

2. Cassandra:
- Распределенная архитектура
- Высокая доступность
- Wide-column store
- Тьюнабл консистентность

3. Apache Parquet:
- Формат хранения
- Эффективное сжатие
- Интеграция с экосистемой Hadoop
- Предиктивное чтение

⚠️ Преимущества:

- Эффективное сжатие данных
- Быстрые агрегации
- Оптимизация I/O операций
- Параллельная обработка
- Эффективная работа с большими данными

Недостатки и ограничения:

- Медленная запись отдельных записей
- Сложность обновления данных
- Больше сложность разработки
- Специфичные оптимизации запросов
🔥128👍4
🏰 Паттерн Фасад: упрощение сложных систем

Что такое паттерн Фасад?

Фасад — структурный паттерн проектирования, предоставляющий простой интерфейс к сложной системе классов, библиотеке или фреймворку.

💡 Пример реализации:
// Сложные подсистемы
type VideoConverter struct{}
func (v *VideoConverter) Convert(filename string, format string) { /* ... */ }

type AudioMixer struct{}
func (a *AudioMixer) Mix(audioData []byte) { /* ... */ }

type Compressor struct{}
func (c *Compressor) Compress(data []byte) []byte { /* ... */ }

// Фасад
type MediaConverter struct {
videoConverter *VideoConverter
audioMixer *AudioMixer
compressor *Compressor
}

func NewMediaConverter() *MediaConverter {
return &MediaConverter{
videoConverter: &VideoConverter{},
audioMixer: &AudioMixer{},
compressor: &Compressor{},
}
}

// Простой интерфейс для клиента
func (mc *MediaConverter) ConvertVideo(filename, format string) string {
mc.videoConverter.Convert(filename, format)
// ... остальные операции
return "converted_" + filename
}

⚠️ Когда использовать:

- Сложная система с множеством компонентов
- Необходимость упрощения API
- Слоистая архитектура
- Работа с legacy-кодом
- Изоляция клиента от сложности системы
18👍9🔥3