День 5️⃣
Субботу предлагаю провести без опросов, сегодня давайте просто обсуждать разные темы по разработке, которые будут полезны на собеседованиях и в работе!
Полетели 🛫
Субботу предлагаю провести без опросов, сегодня давайте просто обсуждать разные темы по разработке, которые будут полезны на собеседованиях и в работе!
Полетели 🛫
👍26🥰25👏16🔥13❤12
🛠️ Мьютексы в Go: какие бывают и зачем они нужны?
❓ Что такое мьютексы?
Мьютекс (mutex) — это примитив синхронизации, который используется для защиты доступа к общим ресурсам в многопоточной среде. В Go мьютексы помогают избежать гонок данных (data races) при работе с горутинами.
💡 Зачем нужны мьютексы?
Мьютексы помогают:
1. Обеспечить безопасный доступ к общим данным:
- Только одна горутина может захватить мьютекс и работать с ресурсом.
2. Предотвратить гонки данных:
- Мьютексы гарантируют, что две горутины не изменят данные одновременно.
⚠️ Какие бывают мьютексы?
В Go есть два основных типа мьютексов:
1. sync.Mutex:
- Базовый мьютекс, который может быть захвачен только одной горутиной.
- Если другая горутина попытается захватить мьютекс, она будет заблокирована до его освобождения.
2. sync.RWMutex:
- Мьютекс с поддержкой чтения и записи.
- Позволяет нескольким горутинам одновременно читать данные, но только одной — писать.
- Полезен в сценариях, где чтение происходит чаще, чем запись.
❗Минусы мьютексов:
- Неправильное использование может привести к deadlock (взаимной блокировке).
- Чрезмерное использование мьютексов может снизить производительность.
🔧 Пример использования:
🎯 Мьютексы — это ключевой инструмент для безопасной работы с общими данными в 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🥰17❤16
🛠️ 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!
❓ Что такое 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!
🔥28❤16👍14
🛠️ Транзакции и ACID: что это и зачем они нужны?
❓ Что такое транзакции?
Транзакция — это последовательность операций, выполняемых как единое целое. Транзакции обеспечивают целостность данных, даже если в процессе выполнения что-то пойдет не так.
💡 Что такое ACID?
ACID — это набор принципов, которым должны соответствовать транзакции:
1. Атомарность (Atomicity):
- Все операции в транзакции либо выполняются полностью, либо не выполняются вообще.
2. Согласованность (Consistency):
- Транзакция переводит базу данных из одного корректного состояния в другое.
3. Изолированность (Isolation):
- Параллельные транзакции не мешают друг другу.
4. Долговечность (Durability):
- После завершения транзакции изменения сохраняются даже в случае сбоя системы.
⚠️ Когда использовать транзакции?
Транзакции полезны в следующих случаях:
- Операции, которые должны быть выполнены полностью или не выполнены вообще (например, перевод денег между счетами).
- Системы, где важна целостность данных (например, банковские приложения).
❗Минусы транзакций:
- Могут замедлять выполнение операций из-за блокировок.
- Требуют дополнительных ресурсов для управления состоянием.
🎯 Транзакции и ACID — это ваш надежный инструмент для обеспечения целостности данных в сложных операциях!
❓ Что такое транзакции?
Транзакция — это последовательность операций, выполняемых как единое целое. Транзакции обеспечивают целостность данных, даже если в процессе выполнения что-то пойдет не так.
💡 Что такое ACID?
ACID — это набор принципов, которым должны соответствовать транзакции:
1. Атомарность (Atomicity):
- Все операции в транзакции либо выполняются полностью, либо не выполняются вообще.
2. Согласованность (Consistency):
- Транзакция переводит базу данных из одного корректного состояния в другое.
3. Изолированность (Isolation):
- Параллельные транзакции не мешают друг другу.
4. Долговечность (Durability):
- После завершения транзакции изменения сохраняются даже в случае сбоя системы.
⚠️ Когда использовать транзакции?
Транзакции полезны в следующих случаях:
- Операции, которые должны быть выполнены полностью или не выполнены вообще (например, перевод денег между счетами).
- Системы, где важна целостность данных (например, банковские приложения).
❗Минусы транзакций:
- Могут замедлять выполнение операций из-за блокировок.
- Требуют дополнительных ресурсов для управления состоянием.
🎯 Транзакции и ACID — это ваш надежный инструмент для обеспечения целостности данных в сложных операциях!
👍25🔥20❤18
🛠️ Context в Go: управление жизненным циклом операций
❓ Что такое context?
Context — это механизм в Go для управления жизненным циклом операций, таких как HTTP-запросы, горутины или запросы к базам данных. Он позволяет передавать значения, отменять операции и задавать тайм-ауты.
💡 Зачем нужен context?
Context помогает:
1. Управлять отменой операций:
- Например, отмена HTTP-запроса при закрытии соединения.
2. Задавать тайм-ауты:
- Ограничение времени выполнения операции.
3. Передавать значения:
- Например, передача идентификатора запроса между горутинами.
⚠️ Когда использовать context?
Context полезен в следующих случаях:
- Долгие операции, которые могут быть отменены (например, запросы к API).
- Работа с горутинами, которые должны завершаться при определенных условиях.
- Передача метаданных между слоями приложения.
❗Минусы context:
- Требует аккуратного использования, чтобы избежать утечек ресурсов.
- Может усложнить код, если используется чрезмерно.
🎯 Context — это мощный инструмент для управления жизненным циклом операций в Go!
❓ Что такое context?
Context — это механизм в Go для управления жизненным циклом операций, таких как HTTP-запросы, горутины или запросы к базам данных. Он позволяет передавать значения, отменять операции и задавать тайм-ауты.
💡 Зачем нужен context?
Context помогает:
1. Управлять отменой операций:
- Например, отмена HTTP-запроса при закрытии соединения.
2. Задавать тайм-ауты:
- Ограничение времени выполнения операции.
3. Передавать значения:
- Например, передача идентификатора запроса между горутинами.
⚠️ Когда использовать context?
Context полезен в следующих случаях:
- Долгие операции, которые могут быть отменены (например, запросы к API).
- Работа с горутинами, которые должны завершаться при определенных условиях.
- Передача метаданных между слоями приложения.
❗Минусы context:
- Требует аккуратного использования, чтобы избежать утечек ресурсов.
- Может усложнить код, если используется чрезмерно.
🎯 Context — это мощный инструмент для управления жизненным циклом операций в Go!
🔥30👍26❤19
🛠️ Виды индексов в базах данных: какие бывают и зачем они нужны?
❓ Что такое индексы?
Индексы — это специальные структуры данных, которые ускоряют поиск и сортировку в таблицах базы данных. Они работают как оглавление в книге, позволяя быстро находить нужные данные без полного сканирования таблицы.
💡 Какие бывают индексы?
1. B-дерево (B-tree):
- Самый распространенный тип индекса.
- Поддерживает быстрый поиск, вставку и удаление данных.
- Подходит для большинства сценариев.
2. Хэш-индекс (Hash index):
- Использует хэш-функции для быстрого поиска по точным значениям.
- Не подходит для диапазонных запросов (например, `BETWEEN`).
3. Составной индекс (Composite index):
- Индекс по нескольким столбцам.
- Полезен для запросов, которые фильтруют или сортируют по нескольким полям.
4. Полнотекстовый индекс (Full-text index):
- Используется для поиска по текстовым данным (например, LIKE или полнотекстовый поиск).
5. Пространственный индекс (Spatial index):
- Используется для работы с геоданными (например, координаты).
❗Минусы индексов:
- Занимают дополнительное место на диске.
- Замедляют операции вставки, обновления и удаления данных.
🎯 Индексы — это мощный инструмент для повышения производительности вашей базы данных
❓ Что такое индексы?
Индексы — это специальные структуры данных, которые ускоряют поиск и сортировку в таблицах базы данных. Они работают как оглавление в книге, позволяя быстро находить нужные данные без полного сканирования таблицы.
💡 Какие бывают индексы?
1. B-дерево (B-tree):
- Самый распространенный тип индекса.
- Поддерживает быстрый поиск, вставку и удаление данных.
- Подходит для большинства сценариев.
2. Хэш-индекс (Hash index):
- Использует хэш-функции для быстрого поиска по точным значениям.
- Не подходит для диапазонных запросов (например, `BETWEEN`).
3. Составной индекс (Composite index):
- Индекс по нескольким столбцам.
- Полезен для запросов, которые фильтруют или сортируют по нескольким полям.
4. Полнотекстовый индекс (Full-text index):
- Используется для поиска по текстовым данным (например, LIKE или полнотекстовый поиск).
5. Пространственный индекс (Spatial index):
- Используется для работы с геоданными (например, координаты).
❗Минусы индексов:
- Занимают дополнительное место на диске.
- Замедляют операции вставки, обновления и удаления данных.
🎯 Индексы — это мощный инструмент для повышения производительности вашей базы данных
❤29👍29🔥25
День 6️⃣
Сегодня выходной, но это не повод расслабляться до талого! 🚀 Давайте используем время с пользой и подготовимся к вопросам, которые могут встретиться на собеседованиях или в работе💡
Полетели 🛸
Сегодня выходной, но это не повод расслабляться до талого! 🚀 Давайте используем время с пользой и подготовимся к вопросам, которые могут встретиться на собеседованиях или в работе💡
Полетели 🛸
👍31❤20🔥12
🔄 MCC и MVCC: контроль конкурентного доступа к данным
❓ Что такое MCC и MVCC?
MCC (Multi-Version Concurrency Control) и MVCC (Multi-Version Concurrency Control) - это механизмы управления параллельным доступом к данным в базах данных.
💡 Основные концепции:
1. Версионность:
- Каждое изменение создает новую версию данных
- Старые версии сохраняются для параллельных транзакций
- Каждая транзакция видит свой снимок данных
2. Временные метки:
- Каждой версии присваивается временная метка
- Транзакции работают с версиями согласно своим меткам
- Обеспечивается согласованное чтение данных
⚠️ Когда использовать?
- Высоконагруженные системы с множеством параллельных операций
- Приложения, требующие изоляции read-committed или snapshot isolation
- Системы с преобладанием операций чтения над записью
❗Особенности реализации:
- Требует дополнительного пространства для хранения версий
- Необходим механизм очистки устаревших версий (vacuum)
- Возможны конфликты при одновременном изменении данных
❓ Что такое MCC и MVCC?
MCC (Multi-Version Concurrency Control) и MVCC (Multi-Version Concurrency Control) - это механизмы управления параллельным доступом к данным в базах данных.
💡 Основные концепции:
1. Версионность:
- Каждое изменение создает новую версию данных
- Старые версии сохраняются для параллельных транзакций
- Каждая транзакция видит свой снимок данных
2. Временные метки:
- Каждой версии присваивается временная метка
- Транзакции работают с версиями согласно своим меткам
- Обеспечивается согласованное чтение данных
⚠️ Когда использовать?
- Высоконагруженные системы с множеством параллельных операций
- Приложения, требующие изоляции read-committed или snapshot isolation
- Системы с преобладанием операций чтения над записью
❗Особенности реализации:
- Требует дополнительного пространства для хранения версий
- Необходим механизм очистки устаревших версий (vacuum)
- Возможны конфликты при одновременном изменении данных
👍33❤25🔥23
📊 GraphQL: язык запросов для API
❓ Что такое GraphQL?
GraphQL - это язык запросов и среда выполнения для API, позволяющий клиентам точно указывать, какие данные им нужны.
💡 Ключевые концепции:
1. Структура:
- Схема (Schema)
- Типы (Types)
- Резолверы (Resolvers)
- Мутации (Mutations)
2. Операции:
- Queries (получение данных)
- Mutations (изменение данных)
- Subnoscriptions (реальное время)
⚠️ Когда использовать?
- Сложные клиентские приложения
- Агрегация данных из разных источников
- Мобильные приложения с ограниченным трафиком
- API с разнообразными клиентами
❗Особенности реализации:
- Сложность начальной настройки
- Необходимость написания схемы
- Потенциальные проблемы с кэшированием
❓ Что такое GraphQL?
GraphQL - это язык запросов и среда выполнения для API, позволяющий клиентам точно указывать, какие данные им нужны.
💡 Ключевые концепции:
1. Структура:
- Схема (Schema)
- Типы (Types)
- Резолверы (Resolvers)
- Мутации (Mutations)
2. Операции:
- Queries (получение данных)
- Mutations (изменение данных)
- Subnoscriptions (реальное время)
⚠️ Когда использовать?
- Сложные клиентские приложения
- Агрегация данных из разных источников
- Мобильные приложения с ограниченным трафиком
- API с разнообразными клиентами
❗Особенности реализации:
- Сложность начальной настройки
- Необходимость написания схемы
- Потенциальные проблемы с кэшированием
👍44❤20🔥13
🔌 WebSocket: двунаправленная связь в реальном времени
❓ Что такое WebSocket?
WebSocket - это протокол, обеспечивающий полнодуплексную связь между клиентом и сервером поверх TCP-соединения.
💡 Основные концепции:
1. Установка соединения:
- Handshake через HTTP
- Upgrade до WebSocket
- Постоянное соединение
2. Особенности протокола:
- Двунаправленная передача данных
- Минимальные накладные расходы
- Поддержка сообщений и фреймов
⚠️ Когда использовать?
- Чаты и мессенджеры
- Онлайн-игры
- Системы мониторинга
- Торговые платформы
❗Важные моменты:
- Нагрузка на сервер при большом количестве соединений
- Необходимость обработки разрывов соединения
- Сложность масштабирования
❓ Что такое WebSocket?
WebSocket - это протокол, обеспечивающий полнодуплексную связь между клиентом и сервером поверх TCP-соединения.
💡 Основные концепции:
1. Установка соединения:
- Handshake через HTTP
- Upgrade до WebSocket
- Постоянное соединение
2. Особенности протокола:
- Двунаправленная передача данных
- Минимальные накладные расходы
- Поддержка сообщений и фреймов
⚠️ Когда использовать?
- Чаты и мессенджеры
- Онлайн-игры
- Системы мониторинга
- Торговые платформы
❗Важные моменты:
- Нагрузка на сервер при большом количестве соединений
- Необходимость обработки разрывов соединения
- Сложность масштабирования
👍28🔥28❤15
🌐 gRPC: современный RPC фреймворк
❓ Что такое gRPC?
gRPC - это высокопроизводительный фреймворк для удаленного вызова процедур (RPC), разработанный Google.
💡 Ключевые особенности:
1. Протокол:
- Protocol Buffers для сериализации
- HTTP/2 для транспорта
- Поддержка потоковой передачи
- Двунаправленная коммуникация
2. Типы взаимодействий:
- Унарные (request/response)
- Серверные потоки
- Клиентские потоки
- Двунаправленные потоки
⚠️ Когда использовать?
- Микросервисная архитектура
- Системы реального времени
- Мобильные приложения
- Высоконагруженные системы
❗Особенности реализации:
- Необходимость написания .proto файлов
- Сложность отладки
- Требует HTTP/2
❓ Что такое 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-операциях
- Потребление большего объема памяти
❓ Что такое MongoDB?
MongoDB - это NoSQL база данных, которая хранит данные в формате BSON (бинарный JSON) и обеспечивает высокую производительность и масштабируемость.
💡 Основные концепции:
1. Структура данных:
- Коллекции (аналог таблиц)
- Документы (аналог строк)
- Поля (аналог колонок)
- Индексы для оптимизации запросов
2. Операции:
- CRUD операции (Create, Read, Update, Delete)
- Агрегации для сложной обработки данных
- Транзакции (с версии 4.0)
⚠️ Когда использовать?
- Большие объемы неструктурированных данных
- Частые изменения схемы данных
- Горизонтальное масштабирование
- Высокая нагрузка на чтение/запись
❗Особенности:
- Отсутствие строгой схемы данных
- Ограничения при сложных JOIN-операциях
- Потребление большего объема памяти
❤32🔥31👍11
📍 Указатели в Golang: значения vs адреса
❓ Что такое указатели в Go?
Указатель - это переменная, которая хранит адрес памяти другой переменной. Понимание указателей критично для эффективного программирования на Go.
💡 Ключевые концепции:
1. Объявление и инициализация:
2. Операторы указателей:
- & - получение адреса переменной
- * - разыменование (получение значения по адресу)
- nil - нулевой указатель
⚠️ Когда использовать указатели?
- Передача больших структур в функции
- Модификация переменных внутри функций
- Реализация методов, изменяющих состояние
- Работа со слайсами и мапами
❗Важные моменты:
- Указатели увеличивают сложность кода
- Возможны null pointer exceptions
- Необходимо следить за временем жизни объектов
❓ Что такое указатели в Go?
Указатель - это переменная, которая хранит адрес памяти другой переменной. Понимание указателей критично для эффективного программирования на Go.
💡 Ключевые концепции:
1. Объявление и инициализация:
var x int = 10 // Переменная
var p *int = &x // Указатель на x
2. Операторы указателей:
- & - получение адреса переменной
- * - разыменование (получение значения по адресу)
- nil - нулевой указатель
⚠️ Когда использовать указатели?
- Передача больших структур в функции
- Модификация переменных внутри функций
- Реализация методов, изменяющих состояние
- Работа со слайсами и мапами
❗Важные моменты:
- Указатели увеличивают сложность кода
- Возможны null pointer exceptions
- Необходимо следить за временем жизни объектов
❤6👍4🔥2
📨 Структура HTTP запроса: анатомия веб-коммуникации
❓ Что такое HTTP запрос?
HTTP запрос — это сообщение, которое клиент отправляет серверу. Каждый запрос содержит определенную структуру, которая позволяет серверу понять, что именно хочет клиент.
💡 Основные компоненты:
1. Стартовая строка:
- path: URL-путь к ресурсу
- version: HTTP/1.1 или HTTP/2
2. Заголовки (Headers):
3. Тело запроса (опционально):
⚠️ Важные моменты:
- Заголовки отделяются от тела пустой строкой
- Каждый заголовок на новой строке
- Регистр методов имеет значение
- Content-Length должен соответствовать размеру тела
❗Особенности:
- Разные методы имеют разное предназначение
- Некоторые заголовки обязательны
- Тело запроса не используется в GET-запросах
❓ Что такое 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-запросах
👍12❤6🔥1
🌐 UDP: быстрый, но ненадежный протокол
❓ Что такое UDP?
UDP (User Datagram Protocol) — протокол транспортного уровня, обеспечивающий простой механизм передачи данных без установления соединения.
💡 Ключевые характеристики:
1. Структура датаграммы:
- Заголовок (8 байт)
- Порт источника (2 байта)
- Порт назначения (2 байта)
- Длина (2 байта)
- Контрольная сумма (2 байта)
2. Особенности работы:
- Нет подтверждения доставки
- Нет контроля последовательности
- Нет контроля потока
- Минимальные накладные расходы
⚠️ Когда использовать?
- Стриминг медиа
- Онлайн-игры
- DNS-запросы
- VoIP-сервисы
❗Ограничения:
- Возможна потеря пакетов
- Нет гарантии порядка доставки
- Нет механизма восстановления данных
❓ Что такое UDP?
UDP (User Datagram Protocol) — протокол транспортного уровня, обеспечивающий простой механизм передачи данных без установления соединения.
💡 Ключевые характеристики:
1. Структура датаграммы:
- Заголовок (8 байт)
- Порт источника (2 байта)
- Порт назначения (2 байта)
- Длина (2 байта)
- Контрольная сумма (2 байта)
2. Особенности работы:
- Нет подтверждения доставки
- Нет контроля последовательности
- Нет контроля потока
- Минимальные накладные расходы
⚠️ Когда использовать?
- Стриминг медиа
- Онлайн-игры
- DNS-запросы
- VoIP-сервисы
❗Ограничения:
- Возможна потеря пакетов
- Нет гарантии порядка доставки
- Нет механизма восстановления данных
👍13❤3🔥1
🔒 CORS: защита и доступ между источниками
❓ Что такое CORS?
CORS (Cross-Origin Resource Sharing) — механизм, который позволяет или запрещает веб-страницам делать запросы к другим доменам.
💡 Основные концепции:
1. Заголовки CORS:
2. Типы запросов:
- Простые (GET, POST, HEAD)
- Предварительные (OPTIONS)
- Сложные (с дополнительными заголовками)
⚠️ Когда настраивать?
- API с разных доменов
- Микрофронтенды
- CDN-ресурсы
- Сторонние сервисы
❗Важные моменты:
- Настраивается на сервере
- Влияет на безопасность
- Может блокировать легитимные запросы
❓ Что такое 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-ресурсы
- Сторонние сервисы
❗Важные моменты:
- Настраивается на сервере
- Влияет на безопасность
- Может блокировать легитимные запросы
🔥12❤8👍3
🛡️ CSP: политика безопасности контента
❓ Что такое CSP?
Content Security Policy — механизм безопасности, который позволяет определить источники загрузки ресурсов для веб-страницы.
💡 Основные директивы:
1. Настройка политик:
2. Ключевые параметры:
- default-src: базовая политика
- noscript-src: источники скриптов
- style-src: источники стилей
- connect-src: разрешенные подключения
⚠️ Когда применять?
- Защита от XSS
- Контроль внешних ресурсов
- Защита от инъекций
- Аудит безопасности
❗Особенности внедрения:
- Может сломать существующий функционал
- Требует тщательного тестирования
- Нужна постепенная настройка
❓ Что такое 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:
⚠️ Последовательность действий:
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-серверов по всему миру.
❓ Что происходит при поиске в браузере?
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🔥6❤3
🔍 Бинарный поиск: эффективный поиск в отсортированных данных
❓ Что такое бинарный поиск?
Бинарный поиск — алгоритм поиска элемента в отсортированном массиве с временной сложностью O(log n), работающий путем деления области поиска пополам на каждом шаге.
💡 Ключевые реализации:
1. Классический бинарный поиск:
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👍9❤3