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

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

Что такое денормализация?

Денормализация — это процесс намеренного отхода от нормальных форм (например, 3NF) в проектировании базы данных. Она предполагает добавление избыточных данных или объединение таблиц для повышения производительности и упрощения запросов.

💡 Зачем нужна денормализация?

Нормализация базы данных хороша для минимизации избыточности и обеспечения целостности данных. Однако в реальной жизни, особенно в высоконагруженных системах, нормализованные базы могут становиться медленными из-за сложных JOIN-запросов и большого количества таблиц. Денормализация помогает:

1. Ускорить выполнение запросов:
- Меньше JOIN-ов — меньше времени на выполнение.
- Данные хранятся в готовом для выборки виде.

2. Упростить разработку:
- Запросы становятся проще, их легче писать и поддерживать.

3. Оптимизировать аналитические запросы:
- В OLAP-системах (аналитические базы) денормализация часто используется для ускорения агрегации и анализа данных.

4. Снизить нагрузку на сервер:
- Меньше операций соединения и вычислений — меньше нагрузка на CPU и память.

⚠️ Когда использовать денормализацию?

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

Минусы денормализации:

- Избыточность данных: Требуется больше места для хранения.
- Сложность поддержки: Изменения данных могут потребовать обновления в нескольких местах.
- Риск потери целостности: Без строгого контроля могут возникнуть противоречия в данных.

🔧 Пример денормализации:

Предположим, у нас есть нормализованная база с таблицами:
- Orders (заказы)
- Customers (клиенты)

Чтобы избежать JOIN-ов, мы можем добавить в таблицу Orders поля из Customers, например, имя клиента (`customer_name`). Теперь данные о клиенте дублируются, но запросы становятся быстрее.

🎯 Денормализация
— это когда вы жертвуете идеальным дизайном базы ради скорости и простоты!
👍2221🔥15👏8🥰7
День 5️⃣

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

Полетели 🛫
👍26🥰25👏16🔥1312
🛠️ Мьютексы в Go: какие бывают и зачем они нужны?

Что такое мьютексы?

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

💡 Зачем нужны мьютексы?

Мьютексы помогают:
1. Обеспечить безопасный доступ к общим данным:
- Только одна горутина может захватить мьютекс и работать с ресурсом.
2. Предотвратить гонки данных:
- Мьютексы гарантируют, что две горутины не изменят данные одновременно.

⚠️ Какие бывают мьютексы?

В Go есть два основных типа мьютексов:

1. sync.Mutex:
- Базовый мьютекс, который может быть захвачен только одной горутиной.
- Если другая горутина попытается захватить мьютекс, она будет заблокирована до его освобождения.

2. sync.RWMutex:
- Мьютекс с поддержкой чтения и записи.
- Позволяет нескольким горутинам одновременно читать данные, но только одной — писать.
- Полезен в сценариях, где чтение происходит чаще, чем запись.

Минусы мьютексов:

- Неправильное использование может привести к deadlock (взаимной блокировке).
- Чрезмерное использование мьютексов может снизить производительность.

🔧 Пример использования:

sync.Mutex:  package main

import (
"fmt"
"sync"
"time"
)

var (
counter int
mutex sync.Mutex
)

func increment() {
mutex.Lock()
counter++
mutex.Unlock()
}

func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second)
fmt.Println("Counter:", counter)
}


🎯 Мьютексы — это ключевой инструмент для безопасной работы с общими данными в Go!
🔥34👍31👏19🥰1716
🛠️ Garbage Collector в Go: как он работает и зачем он нужен?

Что такое Garbage Collector (GC)?

Garbage Collector — это механизм автоматического управления памятью в Go. Он освобождает память, которая больше не используется программой, чтобы избежать утечек памяти.

💡 Зачем нужен Garbage Collector?

GC помогает:

1. Упростить управление памятью:
- Разработчикам не нужно вручную освобождать память.
2. Предотвратить утечки памяти:
- GC автоматически находит и освобождает неиспользуемые объекты.
3. Повысить безопасность:
- Исключаются ошибки, связанные с неправильным освобождением памяти.

⚠️ Как работает GC в Go?

GC в Go использует триколорный алгоритм маркировки и очистки:

1. Маркировка:
- GC проходит по всем объектам в памяти и помечает используемые.
2. Очистка:
- Все непомеченные объекты считаются мусором и удаляются.
3. Сжатие:
- Память может быть уплотнена для уменьшения фрагментации.

Минусы GC:

- Может вызывать паузы (stop-the-world) во время работы.
- Требует дополнительных ресурсов CPU и памяти.

🎯 Garbage Collector — это мощный инструмент для автоматического управления памятью в Go!
🔥2816👍14
🛠️ Транзакции и ACID: что это и зачем они нужны?

Что такое транзакции?

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

💡 Что такое ACID?

ACID — это набор принципов, которым должны соответствовать транзакции:

1. Атомарность (Atomicity):
- Все операции в транзакции либо выполняются полностью, либо не выполняются вообще.
2. Согласованность (Consistency):
- Транзакция переводит базу данных из одного корректного состояния в другое.
3. Изолированность (Isolation):
- Параллельные транзакции не мешают друг другу.
4. Долговечность (Durability):
- После завершения транзакции изменения сохраняются даже в случае сбоя системы.

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

Транзакции полезны в следующих случаях:

- Операции, которые должны быть выполнены полностью или не выполнены вообще (например, перевод денег между счетами).
- Системы, где важна целостность данных (например, банковские приложения).

Минусы транзакций:

- Могут замедлять выполнение операций из-за блокировок.
- Требуют дополнительных ресурсов для управления состоянием.

🎯 Транзакции и ACID — это ваш надежный инструмент для обеспечения целостности данных в сложных операциях!
👍25🔥2018
🛠️ 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