Golang | Вопросы собесов
4.34K subscribers
27 photos
2 videos
707 links
Download Telegram
🤔 Возможны ли случаи, когда перебор по слайсу будет быстрее чем по map?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие бывают способоы синхронизации данных в Go?

🟠Мьютексы (`sync.Mutex` и `sync.RWMutex`)
sync.Mutex обеспечивает эксклюзивный доступ для чтения и записи.
sync.RWMutex позволяет одновременное чтение несколькими горутинами и эксклюзивный доступ для записи.
var mu sync.Mutex
var rwMu sync.RWMutex

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

func readCounter() int {
rwMu.RLock()
defer rwMu.RUnlock()
return counter
}


🟠Каналы (`chan`)
Синхронизируют горутины через передачу данных. Буферизованные каналы могут хранить несколько значений, небуферизованные требуют синхронной отправки и получения.
ch := make(chan int, 1)
go func() { ch <- 42 }()
fmt.Println(<-ch)


🟠Группы ожидания (`sync.WaitGroup`)
Позволяют основной горутине ждать завершения всех запущенных горутин.
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); /* работа */ }()
wg.Wait()


🟠Потокобезопасные структуры (`sync.Map`)
Потокобезопасная карта для конкурентного доступа.
var m sync.Map
m.Store("key", "value")
value, ok := m.Load("key")


🟠Одноразовая инициализация (`sync.Once`)
Гарантирует выполнение кода только один раз.
var once sync.Once
once.Do(func() { /* инициализация */ })


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как устроены таблицы Map?

Карты в Go используют хэш-таблицы для хранения пар ключ-значение. Они хранят данные в бакетах, где каждый бакет может содержать несколько элементов, и используют хэш-функции для доступа к ним. Это обеспечивает быстрый доступ к данным с эффективностью O(1) в среднем случае.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое atomics?

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

🚩Виды атомарных операций

🟠Чтение и запись
atomic.LoadInt32, atomic.LoadInt64, atomic.LoadUint32, atomic.LoadUint64, atomic.LoadUintptr
atomic.StoreInt32, atomic.StoreInt64, atomic.StoreUint32, atomic.StoreUint64, atomic.StoreUintptr
var x int32
atomic.StoreInt32(&x, 42)
value := atomic.LoadInt32(&x)


🟠Атомарное добавление
atomic.AddInt32, atomic.AddInt64, atomic.AddUint32, atomic.AddUint64
var x int32
atomic.AddInt32(&x, 1)


🟠Атомарное сравнение и замена (compare-and-swap, CAS)
atomic.CompareAndSwapInt32, atomic.CompareAndSwapInt64, atomic.CompareAndSwapUint32, atomic.CompareAndSwapUint64
var x int32 = 42
swapped := atomic.CompareAndSwapInt32(&x, 42, 100)


🟠Атомарное замена
atomic.SwapInt32, atomic.SwapInt64, atomic.SwapUint32, atomic.SwapUint64
var x int32
old := atomic.SwapInt32(&x, 100)


🟠Атомарные операции над указателями
atomic.LoadPointer, atomic.StorePointer, atomic.SwapPointer, atomic.CompareAndSwapPointer
var ptr unsafe.Pointer
atomic.StorePointer(&ptr, unsafe.Pointer(&x))
p := atomic.LoadPointer(&ptr)


🚩Когда использовать

🟠Высокая производительность
Атомарные операции могут быть быстрее, чем использование мьютексов, так как они выполняются без блокировок. Их следует использовать, когда требуется минимальная задержка и высокая производительность.

🟠Простые счетчики и флаги
Атомарные операции идеальны для реализации простых счетчиков, флагов или индикаторов состояния.

🟠Низкоуровневый контроль
Когда требуется низкоуровневый контроль над синхронизацией данных без затрат на мьютексы.

package main

import (
"fmt"
"sync"
"sync/atomic"
)

func main() {
var counter int32
var wg sync.WaitGroup

for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt32(&counter, 1)
}()
}

wg.Wait()
fmt.Println("Final Counter:", counter)
}


🚩Ограничения и осторожности

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

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

🟠Трудночитаемость и поддержка кода
Код, использующий атомарные операции, может быть сложнее для понимания и поддержки, особенно если требуются сложные логические операции.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как полиморфизм осуществлен в Golang?

Полиморфизм в Go достигается через интерфейсы, которые определяют поведение, а не структуру объектов. Любой тип, который реализует методы интерфейса, может использоваться вместо него. Это позволяет писать гибкий и обобщённый код.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие есть возможности у создания дочернего контекста данных?

Создание дочернего контекста данных в Go предоставляет мощные возможности для управления временем выполнения операций, отмены и передачи метаданных.

🟠Управление временем выполнения операций
Контексты позволяют задавать дедлайны и таймауты для операций.
context.WithTimeout создает контекст с таймаутом, после которого операция будет автоматически отменена.
ctx, cancel := context.WithTimeout(parentCtx, 2*time.Second)
defer cancel()


context.WithDeadline создает контекст с дедлайном, который определяет точное время, после которого операция будет отменена.
deadline := time.Now().Add(5 * time.Second)
ctx, cancel := context.WithDeadline(parentCtx, deadline)
defer cancel()


🟠Явная отмена операций
Контексты позволяют явно отменять операции, что полезно для управления горутинами и предотвращения утечек памяти.
context.WithCancel создает контекст, который может быть отменен вручную с помощью функции cancel.
ctx, cancel := context.WithCancel(parentCtx)
defer cancel()


🟠Передача метаданных
Контексты позволяют передавать данные между функциями, что полезно для передачи информации о запросах, пользователей и других данных.
context.WithValue создает контекст, который содержит пару ключ-значение для передачи метаданных.
type key string
ctx := context.WithValue(parentCtx, key("userID"), 12345)


🟠Вложенные контексты
Можно создавать иерархии контекстов, где каждый дочерний контекст наследует отмену и дедлайны от родительского.
Создание вложенных контекстов позволяет строить гибкие и сложные системы управления временем выполнения и отмены.
ctx1, cancel1 := context.WithCancel(parentCtx)
ctx2, cancel2 := context.WithTimeout(ctx1, 1*time.Second)
defer cancel1()
defer cancel2()


🟠Синхронизация горутин
Контексты обеспечивают механизм для синхронизации и координации работы нескольких горутин.
Пример синхронизации горутин
var wg sync.WaitGroup
ctx, cancel := context.WithCancel(parentCtx)
defer cancel()

wg.Add(2)
go func() {
defer wg.Done()
worker(ctx, "Worker 1")
}()
go func() {
defer wg.Done()
worker(ctx, "Worker 2")
}()
wg.Wait()

func worker(ctx context.Context, name string) {
for {
select {
case <-ctx.Done():
fmt.Println(name, "stopped")
return
default:
fmt.Println(name, "working")
time.Sleep(1 * time.Second)
}
}
}


🟠Управление жизненным циклом запросов
Контексты широко используются в веб-серверах для управления жизненным циклом HTTP-запросов, обеспечивая таймауты и отмену при завершении обработки запросов.
Пример использования контекста в обработчике HTTP-запроса
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
select {
case <-time.After(5 * time.Second):
fmt.Fprintln(w, "Request processed")
case <-ctx.Done():
err := ctx.Err()
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}

http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие бывают типы в Go?

В Go существуют базовые типы (int, float, string, bool), составные типы (массивы, слайсы, карты, структуры), интерфейсы и каналы. Эти типы обеспечивают разнообразие для работы с различными данными. Также можно создавать пользовательские типы на основе существующих.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 На какие уровни контекста распространяется отмена?

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

🚩Основные концепции отмены контекста

🟠Родительский контекст
Исходный контекст, от которого создаются дочерние контексты.
🟠Дочерний контекст
Контекст, созданный на основе родительского контекста с дополнительными свойствами, такими как таймаут, дедлайн или значение.

Когда родительский контекст отменяется, отменяются и все его дочерние контексты. Это распространяется рекурсивно на все уровни вложенности.

🚩Виды контекстов

🟠context.Background()
Корневой контекст без отмены и таймаутов.

🟠context.TODO()
Корневой контекст для временного использования.

🟠context.WithCancel(parent Context)
Создает контекст с возможностью явной отмены.

🟠context.WithTimeout(parent Context, timeout time.Duration)
Создает контекст с таймаутом.

🟠context.WithDeadline(parent Context, d time.Time)
Создает контекст с дедлайном.

🟠context.WithValue(parent Context, key, val interface{})
Создает контекст с добавлением пары ключ-значение.

🚩Пример отмены контекста

Отмена родительского контекста распространяется на дочерние контексты.
package main

import (
"context"
"fmt"
"time"
)

func main() {
// Создаем родительский контекст с возможностью отмены
parentCtx, cancel := context.WithCancel(context.Background())

// Создаем дочерний контекст с таймаутом на основе родительского контекста
ctx, cancelChild := context.WithTimeout(parentCtx, 2*time.Second)
defer cancelChild()

go func() {
// Дочерняя горутина, которая слушает отмену контекста
select {
case <-ctx.Done():
fmt.Println("Child context canceled:", ctx.Err())
}
}()

// Ждем некоторое время и отменяем родительский контекст
time.Sleep(1 * time.Second)
cancel()

// Ждем завершения дочерней горутины
time.Sleep(1 * time.Second)
}


🚩Распространение отмены

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как наследование осуществлено в Golang?

В Go наследование осуществляется через композицию, а не через классическое наследование, как в ООП. Типы могут включать другие типы как вложенные структуры, получая их методы и свойства. Это позволяет избежать жёсткой привязки и повысить гибкость кода.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔Что такое сине-зеленый деплой(blue-green deployment)?

Это метод развертывания приложений, который минимизирует время простоя и снижает риски, связанные с обновлением. Он позволяет плавно переключаться между двумя идентичными средами, называемыми "синей" (blue) и "зеленой" (green).

🚩Основные концепции сине-зеленого деплоя

🟠Две идентичные среды
Синяя среда: (blue environment): Текущая версия приложения, работающая в продакшене.
Зеленая среда
(green environment): Новая версия приложения, готовая к развертыванию.

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

🟠Обновление
Новая версия приложения развертывается в неактивной среде (например, зеленой). После успешного тестирования переключается трафик на обновленную среду.

🚩Процесс сине-зеленого деплоя

1⃣Подготовка среды
Имеются две идентичные среды: синяя и зеленая. Синяя среда обслуживает текущий трафик пользователей.

2⃣Развертывание новой версии
Новая версия приложения развертывается в зеленой среде, которая в данный момент не принимает пользовательский трафик.

3⃣Тестирование
Зеленая среда тестируется для проверки правильности работы новой версии приложения.

4⃣Переключение трафика
Если тестирование прошло успешно, трафик переключается на зеленую среду, и она становится активной. Синяя среда теперь неактивна и может быть использована для следующего обновления.

5⃣Резервное восстановление
Если обнаруживаются проблемы с новой версией, трафик можно быстро переключить обратно на синюю среду.

🚩Преимущества сине-зеленого деплоя

Минимизация времени простоя
Переключение трафика происходит мгновенно, что сводит время простоя к минимуму.

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

Тестирование в продакшн среде
Новая версия приложения может быть протестирована в продакшн среде, не влияя на текущих пользователей.

Снижение рисков
Разделение процессов развертывания и переключения трафика снижает риски, связанные с обновлением.

🚩Пример использования сине-зеленого деплоя

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

1⃣Подготовка зеленой среды
Создаем или обновляем зеленую среду с новой версией приложения.
2⃣Тестирование зеленой среды
Проверяем работу новой версии в зеленой среде, проводим необходимые тесты.
3⃣Переключение трафика
Обновляем настройки балансировщика нагрузки, чтобы направить весь пользовательский трафик на зеленую среду.
4⃣Мониторинг
Следим за состоянием зеленой среды. Если всё работает корректно, зеленая среда остается активной.
5⃣Восстановление в случае ошибки
Если возникают проблемы, переключаем трафик обратно на синюю среду.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как инкапсуляция осуществлена в Golang?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Canary (канареечные развертывания)?

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

🚩Основные концепции

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

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

🚩Плюсы

Минимизация рисков
Позволяет выявить и исправить ошибки на ранних этапах, не затрагивая всех пользователей. Снижает вероятность массового сбоя системы.

Быстрое восстановление
В случае проблем можно быстро откатить изменения, направив трафик обратно на старую версию.

Непрерывная доставка
Поддерживает практику непрерывной интеграции и доставки (CI/CD), позволяя часто и безопасно развертывать новые версии.

Тестирование в реальных условиях
Новая версия тестируется на небольшой группе реальных пользователей, что помогает выявить проблемы, которые могли быть пропущены в тестовом окружении.

🚩Процесс канареечного развертывания

🟠Подготовка новой версии
Новая версия приложения развертывается на небольшое количество серверов или контейнеров.
🟠Переключение части трафика
Балансировщик нагрузки перенаправляет небольшую часть трафика на новую версию.
🟠Мониторинг
Постоянный мониторинг производительности и поведения новой версии.
🟠Увеличение трафика
Если новая версия работает стабильно, постепенно увеличивается объем трафика, направляемого на нее.
🟠Откат в случае проблем
Если возникают проблемы, трафик быстро перенаправляется обратно на старую версию.

Текущая архитектура:
- Версия 1.0 (старая версия) на 9 серверах
- Версия 2.0 (новая версия) на 1 сервере

Балансировщик нагрузки:
- Направляет 10% трафика на сервер с версией 2.0
- Направляет 90% трафика на серверы с версией 1.0


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Можно ли сделать int(string) и string(int) соответственно?

int(string) невозможно, так как это несопоставимые типы, но можно конвертировать строку в число через strconv.Atoi. string(int) возможно, но результатом будет символ, соответствующий числовому значению в таблице Unicode.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое Dark (скрытые) или А/В-развертывания?

🚩Dark развертывания

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

🚩Основные концепции Dark развертываний

🟠Новая версия в продакшен среде
Новая версия разворачивается вместе с текущей версией, но не обслуживает реальные пользовательские запросы.

🟠Тестирование и мониторинг
Новая версия обрабатывает копии запросов, направляемых на текущую версию, или синтетические запросы, созданные для тестирования. Результаты работы новой версии сравниваются с результатами текущей версии для выявления проблем.

🟠Плавное включение в продакшен
После успешного тестирования новая версия начинает обслуживать реальные запросы.

🚩Плюсы

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

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


🚩A/B-развертывания

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

🚩Основные концепции

🟠Две версии приложения
Версия A (текущая версия) и версия B (новая версия) развернуты в продакшен среде.
🟠Распределение трафика
Трафик распределяется между двумя версиями по определенной пропорции (например, 50% на A и 50% на B).
🟠Сравнение и анализ
Производительность и поведение двух версий сравниваются для определения лучшей версии.

🚩Плюсы

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

Текущая версия (A) и новая версия (B) развернуты в продакшен среде.
Балансировщик нагрузки распределяет трафик между A и B.
Производительность и поведение версий сравниваются.
На основе анализа выбирается лучшая версия для полного развертывания.


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Сколько в памяти занимают реализации int32 и int64?

int32 занимает 4 байта (32 бита), а int64 — 8 байт (64 бита) памяти.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое SLA?

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

🚩Основные компоненты

🟠Определение услуг
Описание услуг, которые предоставляет поставщик, и их характеристики.

🟠Уровень доступности (uptime)
Гарантированный процент времени, в течение которого услуга будет доступна (например, 99.9% времени).

🟠Производительность
Показатели производительности, такие как время отклика, пропускная способность и другие метрики.

🟠Время восстановления (MTTR)
Среднее время, необходимое для восстановления сервиса после сбоя.

🟠Время на устранение инцидентов (MTTA)
Среднее время на принятие мер после обнаружения проблемы.

🟠Обязательства по поддержке
Описание уровней поддержки, доступных клиенту (например, 24/7 поддержка, время реакции на запросы).

🟠Процедуры уведомления и эскалации
Механизмы уведомления клиента о проблемах и процедуры эскалации в случае серьезных инцидентов.

🟠Компенсации и штрафы
Механизмы компенсации клиенту за несоблюдение SLA, такие как кредиты или скидки на услуги.

🟠Процедуры мониторинга и отчетности
Описание методов и частоты мониторинга выполнения SLA, а также предоставление отчетов клиенту.

🚩Примеры компонентов

🟠Определение услуг
"Поставщик обязуется предоставлять услуги хостинга для веб-приложений клиента с использованием своих дата-центров."

🟠Уровень доступности
"Услуга будет доступна не менее 99.9% времени в течение календарного месяца."

🟠Производительность
"Среднее время отклика сервиса не должно превышать 200 миллисекунд."

🟠Время восстановления (MTTR)
"Среднее время восстановления после сбоя не должно превышать 4 часов."

🟠Обязательства по поддержке
"Поставщик обязуется предоставлять круглосуточную поддержку с максимальным временем реакции на запросы не более 30 минут."

🟠Компенсации и штрафы
"В случае несоблюдения уровня доступности 99.9%, клиент имеет право на компенсацию в виде 10% кредита за каждый час простоя."

🚩Плюсы

Четкие ожидания
SLA устанавливает четкие ожидания относительно уровня обслуживания, что снижает недоразумения между поставщиком и клиентом.

Ответственность и контроль
SLA способствует ответственности поставщика за предоставляемые услуги и позволяет клиенту контролировать их качество.

Управление рисками
SLA помогает управлять рисками, связанными с отказами или снижением качества обслуживания, и обеспечивает механизмы компенсации.

Повышение доверия
Наличие SLA повышает доверие клиентов к поставщику, демонстрируя его готовность поддерживать высокий уровень обслуживания.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие предельные значения int32 и int64?

Для int32: от -2,147,483,648 до 2,147,483,647. Для int64: от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое SLO?

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

🚩Основные компоненты

🟠Доступность (Availability)
Процент времени, в течение которого услуга должна быть доступна. Пример: "Услуга будет доступна не менее 99.9% времени в течение календарного месяца."

🟠Производительность (Performance)
Показатели производительности, такие как время отклика или пропускная способность. Пример: "Среднее время отклика сервиса не должно превышать 200 миллисекунд."

🟠Время восстановления (MTTR - Mean Time to Recovery)
Среднее время, необходимое для восстановления сервиса после сбоя. Пример: "Среднее время восстановления после сбоя не должно превышать 4 часов."

🟠Время на устранение инцидентов (MTTA - Mean Time to Acknowledge)
Среднее время на принятие мер после обнаружения проблемы. Пример: "Среднее время реакции на инцидент не должно превышать 30 минут."

🟠Ошибка в запросах (Error Rate)
Допустимый процент ошибок в запросах. Пример: "Процент ошибочных запросов не должен превышать 0.1%."

🚩Примеры

🟠Доступность
"Сервис должен быть доступен 99.95% времени в течение календарного месяца."
🟠Производительность
"Среднее время отклика для 95% запросов не должно превышать 200 миллисекунд."
🟠Время восстановления (MTTR)
"Среднее время восстановления после инцидента не должно превышать 1 час."
🟠Ошибка в запросах
"Процент запросов, завершающихся ошибкой, не должен превышать 0.5%."

🚩Различие между SLA и SLO

🟠SLA (Service Level Agreement)
Соглашение между поставщиком услуги и клиентом, которое включает SLO и описывает уровень обслуживания, который должен быть достигнут. SLA часто включает последствия за невыполнение SLO, такие как компенсации или штрафы.
🟠SLO (Service Level Objective)
Конкретная цель или метрика, которая определяет, какого уровня обслуживания должен достигать сервис. SLO — это часть SLA.

🚩Важность

🟠Измерение качества услуг
SLO позволяет измерять и контролировать качество предоставляемых услуг, что помогает поддерживать высокий уровень обслуживания.

🟠Управление ожиданиями
Определение SLO помогает управлять ожиданиями клиентов и внутренних команд, устанавливая четкие цели и стандарты.

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

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

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

🟠Доступность
"Сервис должен быть доступен 99.9% времени."
🟠Производительность
"Среднее время отклика для 95% запросов не должно превышать 300 миллисекунд."
🟠Время восстановления (MTTR)
"Среднее время восстановления после инцидента не должно превышать 30 минут."

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой результат получим, если разделить int на 0 и float на 0?

Деление int на 0 вызовет паническую ошибку, а деление float на 0 вернёт +Inf, -Inf или NaN в зависимости от ситуации.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое SLI?

Это конкретная метрика, используемая для измерения качества обслуживания сервиса. SLI показывает, насколько хорошо сервис соответствует определенным критериям, установленным в SLO (Service Level Objective).

🚩Основные компоненты

🟠Доступность (Availability)
Процент времени, в течение которого сервис доступен для пользователей. Пример: "99.9% времени в течение месяца."
🟠Производительность (Performance)
Метрики, такие как время отклика или пропускная способность. Пример: "Среднее время отклика 200 миллисекунд."
🟠Время восстановления (MTTR - Mean Time to Recovery)
Среднее время, необходимое для восстановления сервиса после сбоя. Пример: "Среднее время восстановления 1 час."
🟠Время на устранение инцидентов (MTTA - Mean Time to Acknowledge)
Среднее время на принятие мер после обнаружения проблемы. Пример: "Среднее время реакции на инцидент 30 минут."
🟠Процент ошибок (Error Rate)
Процент запросов, завершающихся ошибкой. Пример: "Процент ошибочных запросов не более 0.1%."

🚩Примеры

🟠Доступность
"Сервис был доступен 99.95% времени за последний месяц."
🟠Производительность
"Среднее время отклика сервиса за последний месяц составило 150 миллисекунд."
🟠Время восстановления (MTTR)
"Среднее время восстановления сервиса после сбоев за последний месяц составило 45 минут."
🟠Процент ошибок (Error Rate)
"Процент ошибочных запросов за последний месяц составил 0.05%."

🚩Различие между SLA, SLO и SLI

🟠SLA (Service Level Agreement)
Соглашение между поставщиком услуги и клиентом, включающее SLO и описывающее уровень обслуживания, который должен быть достигнут. SLA может включать последствия за невыполнение SLO.

🟠SLO (Service Level Objective)
Конкретные цели или метрики, которые определяют уровень обслуживания, которого должен достигнуть сервис. SLO являются частью SLA.

🟠SLI (Service Level Indicator)
Конкретные метрики, используемые для измерения фактической производительности сервиса относительно установленных SLO. SLI — это количественные показатели, которые служат основой для SLO.

🚩Важность

🟠Измерение качества услуг
SLI позволяют количественно измерять различные аспекты работы сервиса, такие как доступность и производительность.
🟠Контроль и мониторинг
SLI используются для постоянного мониторинга сервиса и обеспечения соответствия установленным SLO.
🟠Управление производительностью
SLI помогают выявлять проблемы в работе сервиса и принимать меры для их устранения.
🟠Улучшение сервиса
Анализ SLI позволяет улучшать качество обслуживания путем выявления и устранения узких мест и проблем.

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

🟠Доступность
SLI: "99.9% времени сервис доступен."
SLO: "Сервис должен быть доступен не менее 99.9% времени в течение месяца."
SLA: "Если доступность падает ниже 99.9%, клиент получает компенсацию."
🟠Производительность
SLI: "Среднее время отклика 200 миллисекунд."
SLO: "Среднее время отклика не должно превышать 250 миллисекунд для 95% запросов."
SLA: "Если время отклика превышает 250 миллисекунд, клиент получает компенсацию."

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое константы и можно ли их изменять?

Константы в Go — это неизменяемые значения, объявляемые с помощью ключевого слова const. Их нельзя изменить после определения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM