Все специализации

Специалист технической поддержки: вопросы на собеседовании

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

Если SSL/TLS сертификат просрочен, браузеры и клиенты начнут выдавать предупреждения о небезопасном соединении, а некоторые вообще откажутся устанавливать соединение. Это происходит потому, что сертификат больше не считается доверенным.

Обойти это можно, но это не рекомендуется и небезопасно. Например:

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

В некоторых клиентах можно отключить проверку сертификата (например, в curl с опцией -k или --insecure), но это открывает уязвимости.

Правильный подход — обновить сертификат у центра сертификации или использовать автоматические решения, например, Let's Encrypt для регулярного обновления.

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

Пример решения на Python:

Идея: преобразовать строку в множество символов и проверить, содержит ли оно все буквы алфавита.

В технической поддержке (L1-L3) карьерное развитие часто связано с углублением технических знаний и расширением зоны ответственности. Возможные направления:

Переход на более высокий уровень поддержки (например, с L1 на L3), где требуется более глубокое понимание систем и умение решать сложные проблемы.

Специализация в определённой области (например, базы данных, сети, безопасность).

Переход в смежные роли, такие как DevOps, где можно использовать опыт поддержки для автоматизации процессов, настройки инфраструктуры и мониторинга.

Развитие в сторону системного администратора, инженера по надежности (SRE) или инженера по автоматизации.

Для перехода в DevOps полезно изучить инструменты CI/CD, контейнеризацию (Docker, Kubernetes), скриптовые языки (Python, Bash) и облачные платформы (AWS, Azure, GCP). Опыт в поддержке помогает лучше понимать проблемы, которые нужно автоматизировать и оптимизировать.

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

Зачем нужно SLA:

Определение ожиданий: Четко фиксирует, какие услуги и с каким уровнем качества будут предоставлены.

Контроль качества: Позволяет измерять и отслеживать выполнение обязательств по сервису.

Ответственность: Устанавливает ответственность поставщика за несоблюдение условий (например, штрафы или компенсации).

Улучшение отношений: Помогает выстроить прозрачные и доверительные отношения между сторонами.

Пример параметров в SLA: время отклика поддержки, время восстановления сервиса, доступность (uptime) в процентах.

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

Особенности работы с несколькими каналами:

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

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

select часто применяется для таймаутов и отмены операций через каналы.

Пример:

Таким образом, select позволяет эффективно управлять конкурентными операциями с каналами.

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

Пример интерфейса и его реализации:

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

В Go массивы и слайсы — разные типы данных:

Массив — фиксированного размера, размер входит в тип, например [5]int — массив из 5 элементов. Размер массива нельзя изменить после создания.

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

Ёмкость слайса (capacity) — это максимальное количество элементов, которое слайс может вместить без выделения новой памяти.

При добавлении элементов с помощью append:

Если длина слайса меньше ёмкости, новый элемент просто добавляется.

Если длина достигает ёмкости, создаётся новый массив с увеличенной ёмкостью (обычно в 2 раза больше), и данные копируются туда.

Пример:

Таким образом, слайсы удобны для работы с динамическими коллекциями, а массивы — для фиксированных данных.

Основные компоненты реляционной СУБД включают:

Движок хранения данных (Storage Engine) — отвечает за физическое хранение и управление данными на диске.

Менеджер транзакций — обеспечивает атомарность, согласованность, изолированность и долговечность (ACID) операций.

Оптимизатор запросов — анализирует SQL-запросы и строит оптимальный план их выполнения.

Обработчик SQL-запросов — парсит, проверяет и выполняет SQL-запросы.

Система управления блокировками — обеспечивает корректный параллельный доступ к данным.

Каталог данных (метаданные) — хранит информацию о структуре базы данных, таблицах, индексах и правах доступа.

Индексы — структуры данных для ускорения поиска и выборки.

Эти компоненты вместе обеспечивают эффективное хранение, обработку и защиту данных.

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

Для борьбы с SQL-инъекциями применяют следующие методы:

Использование параметризованных запросов (prepared statements) — параметры передаются отдельно от SQL-кода, что предотвращает выполнение вредоносного кода.

Валидация и фильтрация пользовательского ввода — проверка данных на соответствие ожидаемому формату.

Использование ORM — многие ORM автоматически защищают от SQL-инъекций.

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

Пример на языке SQL с параметризованным запросом (например, на Python с библиотекой sqlite3):

Здесь username передается как параметр, что исключает возможность инъекции.

Да, могу построить CI/CD пайплайн с нуля для автоматизации разворачивания, обновления и поддержки системы. Обычно процесс включает следующие этапы:

Контроль версий — исходный код хранится в системе контроля версий (Git).

Сборка и тестирование — при коммите запускаются автоматические сборки и тесты (юнит, интеграционные).

Публикация артефактов — собранные пакеты или образы контейнеров сохраняются в репозитории.

Деплоймент — автоматическое развертывание на тестовые, затем на продакшен-серверы.

Мониторинг и откат — отслеживание состояния приложения и возможность быстрого отката при ошибках.

Для реализации можно использовать инструменты типа Jenkins, GitLab CI/CD, GitHub Actions, ArgoCD, Terraform и др.

Пример простого GitHub Actions workflow для Node.js приложения:

Такой пайплайн позволяет автоматизировать поддержку, разворачивание и обновление приложения.

Для отправки REST-запросов часто используют следующие инструменты:

curl — командная строка, универсальный и мощный инструмент для HTTP-запросов.

Postman — графический клиент с удобным интерфейсом для создания, тестирования и автоматизации API-запросов.

Insomnia — похожий на Postman, удобен для работы с REST и GraphQL.

HTTPie — удобный CLI-инструмент с более читаемым синтаксисом, чем curl.

Swagger UI / Swagger Editor — для тестирования API, если есть OpenAPI спецификация.

Пример запроса с помощью curl:

В Kubernetes requests и limits — это параметры, задающие ресурсы (CPU, память), которые контейнер может использовать.

requests — минимальный гарантированный объём ресурсов, который будет выделен контейнеру. Планировщик Kubernetes использует эти значения, чтобы решить, на какой узел разместить под. Если контейнеру нужно больше ресурсов, чем указано в requests, он может их получить, если они доступны.

limits — максимальный предел ресурсов, который контейнер не может превысить. Если контейнер пытается использовать больше CPU, чем limit, его использование будет ограничено. Для памяти превышение лимита может привести к завершению контейнера (OOMKilled).

Пример:

Здесь контейнер гарантированно получит 0.5 CPU и 256Mi памяти, но не сможет использовать больше 1 CPU и 512Mi памяти.

Горутины в Go — это лёгкие потоки выполнения, управляемые рантаймом Go, которые позволяют выполнять функции параллельно.

Отличия горутины от потока ОС:

Лёгковесность: горутины занимают гораздо меньше памяти (обычно несколько килобайт), тогда как потоки ОС — значительно больше.

Планирование: горутины планируются планировщиком Go внутри процесса, а не ОС, что даёт более быструю и эффективную смену контекста.

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

Пример создания горутины:

Когда контейнер в среде, например Docker или Kubernetes, превышает лимит CPU, происходят следующие эффекты:

Ограничение использования CPU: Контейнеру выделяется не более установленного лимита CPU (например, 0.5 CPU или 500m в Kubernetes).

Троттлинг (ограничение частоты): Если контейнер пытается использовать больше CPU, ядро ОС ограничивает его выполнение, снижая приоритет или прерывая выполнение.

Производительность: Приложение внутри контейнера может работать медленнее, так как не получает больше CPU, чем выделено.

В Kubernetes: Если лимит CPU превышен, контейнер не будет убит (в отличие от превышения памяти), но его CPU время будет ограничено.

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

HTTPS — это расширение HTTP с использованием протокола TLS/SSL для обеспечения защищённого соединения.

Процесс установки защищённого соединения (TLS handshake) включает следующие шаги:

Клиент отправляет серверу запрос на установку защищённого соединения, указывая поддерживаемые версии TLS и наборы шифров.

Сервер отвечает своим сертификатом, содержащим публичный ключ и подтверждающим его личность через центр сертификации (CA).

Клиент проверяет сертификат (подпись CA, срок действия, соответствие домену).

Клиент генерирует случайное значение (pre-master secret), шифрует его публичным ключом сервера и отправляет.

Сервер расшифровывает pre-master secret своим приватным ключом.

Оба вычисляют общий секрет (master secret) на основе pre-master secret и других параметров.

На основе master secret генерируются симметричные ключи для шифрования и аутентификации данных.

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

После этого весь HTTP-трафик передаётся по защищённому каналу с использованием симметричного шифрования (например, AES), что обеспечивает конфиденциальность и целостность данных.

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

В рамках поддержки поискового сервиса технические задачи включали:

Мониторинг производительности и доступности поискового движка.

Анализ логов и устранение ошибок, связанных с индексированием и поисковыми запросами.

Оптимизация запросов и конфигурации для повышения скорости отклика.

Работа с кэшированием результатов для снижения нагрузки на серверы.

Обновление и поддержка алгоритмов ранжирования и релевантности.

Внедрение новых функций поиска, таких как автодополнение и фильтрация.

Взаимодействие с командой разработки для быстрого реагирования на инциденты и улучшения качества сервиса.

Домен — это уникальное имя, которое используется для идентификации сайта или ресурса в интернете. Он представляет собой удобочитаемый адрес, например, example.com, который заменяет числовой IP-адрес сервера.

DNS (Domain Name System) — это система, которая переводит доменные имена в IP-адреса. Когда пользователь вводит домен в браузере, DNS-серверы находят соответствующий IP-адрес, чтобы установить соединение с нужным сервером.

Связь между доменом и DNS:

Домен — это имя, которое человек использует для доступа к ресурсу.

DNS — это служба, которая обеспечивает преобразование этого имени в технический адрес (IP), понятный компьютерам.

Пример: при вводе google.com браузер обращается к DNS, получает IP-адрес сервера Google и устанавливает с ним соединение.

Для настройки выгрузки логов через Filebeat нужно выполнить несколько шагов:

Установить Filebeat на сервер, где находятся логи.

В конфигурационном файле filebeat.yml указать пути к логам, которые нужно собирать, например:

Настроить выход (output), например, в Elasticsearch или Logstash:

или

При необходимости настроить модули Filebeat для парсинга специфичных логов.

Запустить и проверить работу Filebeat:

Проверить, что логи поступают в целевую систему.

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

В Go можно управлять количеством потоков ОС (M — OS threads), на которых выполняются горутины, с помощью функции runtime.GOMAXPROCS(n). Эта функция задаёт максимальное количество потоков ОС, которые могут одновременно выполнять горутины.

Например:

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

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

Kubernetes — это система оркестрации контейнеров, предназначенная для автоматизации развертывания, масштабирования и управления контейнеризованными приложениями.

Основные функции Kubernetes:

Автоматическое распределение нагрузки между контейнерами

Масштабирование приложений в зависимости от нагрузки

Обеспечение высокой доступности и самовосстановления сервисов

Управление конфигурациями и секретами

Kubernetes позволяет разработчикам и операторам эффективно управлять сложными распределёнными системами, упрощая процессы деплоя и поддержки приложений в продакшене.

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

Небуферизированный канал — это канал без внутреннего буфера. Отправка в такой канал блокируется до тех пор, пока другая горутина не прочитает значение, и наоборот — чтение блокируется, если в канале нет данных. Это обеспечивает строгую синхронизацию между отправителем и получателем.

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

Пример:

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

TLS (Transport Layer Security) — это протокол, обеспечивающий шифрование и защиту данных при передаче по сети. Он гарантирует конфиденциальность, целостность и аутентификацию сервера, что предотвращает перехват и подделку данных.

mTLS (mutual TLS) — расширение TLS, при котором аутентификация происходит не только сервера, но и клиента. То есть обе стороны обмениваются сертификатами и проверяют друг друга, что повышает уровень безопасности и используется в сценариях, где важно удостовериться в подлинности обеих сторон.

Основное отличие:

TLS: клиент проверяет сервер, сервер не проверяет клиента (обычно).

mTLS: и клиент, и сервер проверяют друг друга по сертификатам.

Пример применения mTLS — взаимодействие между микросервисами внутри защищённой инфраструктуры, где нужно удостовериться, что запросы приходят от доверенных сервисов.

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

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

Термин "atomic" (атомарный) происходит от идеи атома — неделимой частицы. В программировании и системах это означает операцию, которая выполняется полностью или не выполняется вовсе, без промежуточных состояний.

Как работает atomic:

Операция либо завершается успешно и изменения фиксируются,

Либо при сбое откатывается, и система остаётся в исходном состоянии.

В многопоточных или распределённых системах atomic гарантирует, что параллельные операции не приведут к неконсистентности данных.

Пример: в базе данных транзакция — это атомарная операция. Если в транзакции несколько запросов, то либо все они применяются, либо ни один.

В программировании atomic операции часто реализуются через специальные инструкции процессора (например, compare-and-swap), которые позволяют безопасно изменять данные без блокировок.

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

Поэтому не все используют Serializable, особенно в системах с высокой нагрузкой, где важна скорость обработки. Часто выбирают уровни изоляции ниже (Read Committed, Repeatable Read), которые обеспечивают баланс между целостностью данных и производительностью.

Влияние уровня изоляции на производительность:

Serializable: максимальная изоляция, низкая производительность из-за блокировок.

Repeatable Read: предотвращает неповторяющиеся чтения, лучше производительность.

Read Committed: предотвращает грязные чтения, высокая производительность.

Read Uncommitted: минимальная изоляция, максимальная производительность, но возможны аномалии.

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

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

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

Итого:

Шардирование нужно для масштабирования и повышения производительности при больших объемах данных.

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

Основные различия между TCP и UDP:

TCP (Transmission Control Protocol) — это протокол с установлением соединения, обеспечивает надежную доставку данных, контроль ошибок и порядок передачи. Используется, когда важна целостность и последовательность данных (например, HTTP, FTP).

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

Итог: TCP — надежный и медленный, UDP — быстрый и ненадежный.

go

package main

import (

"fmt"

)

func maxRepeats(s string) map[rune]int {

result := make(map[rune]int)

if len(s) == 0 {

return result

}

}

func main() {

tests := []string{

"qqffbbaaaffc",

"bbbbbb",

"abc",

"aabbcc",

"aaabbbccc",

"a",

"",

}

}

Основные команды Linux для управления:

Сервером:

systemctl start|stop|restart|status <service> — управление сервисами.

journalctl -u <service> — просмотр логов сервиса.

top или htop — мониторинг процессов и загрузки.

Файловой системой:

ls, cd, pwd — просмотр и навигация по каталогам.

cp, mv, rm — копирование, перемещение, удаление файлов.

chmod, chown — изменение прав и владельцев.

df -h — информация о свободном месте на дисках.

du -sh <папка> — размер папки.

Процессами:

ps aux — список процессов.

kill <pid>, killall <process_name> — завершение процессов.

nice, renice — управление приоритетом процессов.

Сетью:

ifconfig или ip addr — информация о сетевых интерфейсах.

ping <host> — проверка доступности хоста.

netstat -tulnp или ss -tulnp — открытые порты и сокеты.

curl или wget — запросы к URL.

iptables — настройка брандмауэра.

Эти команды покрывают базовые задачи администрирования и диагностики.

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

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

Пример: Веб-сайт обслуживается тремя серверами. Балансировщик нагрузки принимает запросы пользователей и распределяет их между этими серверами, а прокси может кэшировать часто запрашиваемые данные, снижая нагрузку на серверы.

Если контроллер домена (например, Active Directory Domain Controller) недоступен, то возможность пользователя войти в систему зависит от настроек и типа аутентификации:

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

Локальные учетные записи: если пользователь использует локальную учетную запись на машине, то вход возможен без обращения к контроллеру.

Сетевая аутентификация: если требуется проверка учетных данных на контроллере (например, при первом входе или смене пароля), то вход будет невозможен.

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

В Kubernetes есть несколько способов перезапустить под:

Удалить под вручную:

Контроллер (например, Deployment) автоматически создаст новый под.

Обновить Deployment:

Изменить конфигурацию (например, добавить или изменить аннотацию), чтобы вызвать rollout:

Изменить метаданные пода:

Например, обновить аннотацию, чтобы триггернуть пересоздание пода.

Использовать команду patch:

Перезапуск через масштабирование:

Уменьшить количество реплик до 0, затем вернуть обратно:

Все эти методы позволяют обновить или перезапустить поды без остановки всего кластера.

Индексация в базах данных — это создание специальных структур данных (индексов), которые ускоряют поиск и сортировку записей по определённым полям таблицы. Без индексов СУБД при выполнении запроса должна просматривать все строки (полный перебор), что замедляет работу при больших объёмах данных.

Индексы позволяют быстро находить нужные записи, значительно повышая производительность запросов SELECT, особенно с условиями WHERE, JOIN и ORDER BY. Однако индексы занимают дополнительное место и замедляют операции вставки, обновления и удаления, так как нужно обновлять индексные структуры.

Пример: если у вас есть таблица пользователей с полем email, создание индекса по email позволит быстро искать пользователя по этому адресу.

В реляционных базах данных основные типы данных для полей таблиц включают:

Числовые типы: INT, SMALLINT, BIGINT, DECIMAL, NUMERIC, FLOAT, DOUBLE

Строковые типы: CHAR, VARCHAR, TEXT

Дата и время: DATE, TIME, DATETIME, TIMESTAMP

Булевы: BOOLEAN (или BIT в некоторых СУБД)

Двоичные данные: BLOB, BINARY

Каждый тип выбирается в зависимости от характера данных и требований к хранению и производительности. Например, для хранения целых чисел используют INT, для текста — VARCHAR с ограничением длины, для дат — DATE или TIMESTAMP.

DNS (Domain Name System) — это система доменных имен, которая переводит удобочитаемые имена сайтов (например, example.com) в IP-адреса, понятные компьютерам (например, 93.184.216.34). Это необходимо, потому что для установления соединения по сети нужен IP, а людям проще запоминать имена.

Как это работает:

Пользователь вводит в браузере доменное имя.

Запрос отправляется на локальный DNS-сервер (обычно провайдера).

Если локальный сервер не знает IP, он обращается к корневым DNS-серверам.

Корневой сервер перенаправляет к серверу домена верхнего уровня (TLD), например, .com.

TLD-сервер направляет к авторитетному DNS-серверу конкретного домена.

Авторитетный сервер возвращает IP-адрес.

Локальный сервер кэширует ответ и передает IP клиенту.

Основные узлы DNS-системы:

Корневые DNS-серверы (Root servers) — вершина иерархии.

DNS-серверы доменов верхнего уровня (TLD servers) — отвечают за зоны типа .com, .org, .ru и т.д.

Авторитетные DNS-серверы — хранят записи конкретных доменов.

Рекурсивные DNS-серверы — выполняют поиск по цепочке для клиента.

Таким образом, DNS — это распределённая и иерархическая система, обеспечивающая быстрое и масштабируемое разрешение имён в IP-адреса.

Помимо проверки репликации, важно проверить:

Целостность данных и корректность конфигурации оборудования.

Логи на наличие ошибок или предупреждений.

Сетевые подключения и доступность сервисов.

Нагрузку на систему и использование ресурсов (CPU, память, диск).

Совместимость версий ПО и обновления.

Настройки безопасности и права доступа.

Такой комплексный подход помогает выявить причину проблемы и предотвратить её повторение.

В Apache Kafka разграничение прав доступа реализовано через механизм ACL (Access Control Lists). ACL позволяют задавать, какие пользователи или сервисы (принципалы) имеют права на выполнение определённых операций с ресурсами кластера.

ACL распространяются на следующие основные сущности:

Topic — права на чтение (READ), запись (WRITE), создание (CREATE), удаление (DELETE) топиков.

Group — права на управление группами потребителей (например, чтение offset'ов).

Cluster — права на операции, связанные с самим кластером, например, создание топиков, управление ACL.

TransactionalId — права на использование транзакций.

Каждая ACL задаёт:

Принципала (пользователя или сервисный аккаунт), которому предоставляются права.

Ресурс (topic, group, cluster и т.д.).

Разрешённые операции (READ, WRITE, DESCRIBE, CREATE, DELETE и др.).

Тип разрешения (ALLOW или DENY).

Пример команды для добавления ACL:

Таким образом, ACL в Kafka позволяют гибко управлять доступом на уровне ключевых ресурсов кластера.

Процесс доставки ПО с помощью Jenkins обычно включает следующие шаги:

Настройка репозитория кода — Jenkins интегрируется с системой контроля версий (например, Git).

Создание Jenkins Pipeline или Job — описывается последовательность этапов сборки, тестирования и деплоя.

Сборка проекта — Jenkins запускает сборку, компиляцию или упаковку приложения.

Автоматическое тестирование — выполняются юнит-тесты, интеграционные тесты для проверки качества.

Сборка артефактов — создаются исполняемые файлы, пакеты или контейнеры.

Деплой на тестовые/продакшн-среды — Jenkins автоматически разворачивает ПО на нужных серверах или в облаке.

Мониторинг и уведомления — при ошибках или успешном завершении отправляются уведомления команде.

Пример простого Jenkinsfile для CI/CD:

Основные протоколы аутентификации:

Basic Authentication — передача логина и пароля в заголовке HTTP (небезопасно без HTTPS).

Digest Authentication — более защищённый вариант Basic, использует хеширование.

OAuth 2.0 — протокол авторизации с токенами доступа, широко используется для доступа к API.

OpenID Connect — надстройка над OAuth 2.0 для аутентификации пользователей.

SAML (Security Assertion Markup Language) — обмен аутентификационными данными между организациями, часто в корпоративных системах.

Kerberos — протокол сетевой аутентификации с использованием билетов, распространён в корпоративных сетях.

JWT (JSON Web Token) — формат токенов для передачи аутентификационной информации.

Выбор протокола зависит от требований безопасности, архитектуры системы и сценариев использования.

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

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

Если вас спрашивают, в каком вы сейчас поиске, нужно честно ответить, насколько вы активно ищете новую работу или просто рассматриваете варианты.

PKI (Public Key Infrastructure) — это инфраструктура открытых ключей, которая обеспечивает создание, распространение, управление и проверку цифровых сертификатов и ключей.

Основные операции с сертификатами и ключами:

Генерация ключевой пары: создаётся приватный и публичный ключ.

Создание запроса на сертификат (CSR): содержит публичный ключ и данные о владельце, отправляется в центр сертификации (CA).

Подписание сертификата CA: центр сертификации проверяет данные и подписывает сертификат, подтверждая подлинность.

Установка и распространение сертификатов: сертификаты устанавливаются на серверы или устройства для обеспечения безопасности.

Проверка сертификатов: проверяется цепочка доверия, срок действия, отозван ли сертификат.

Отзыв сертификатов: при компрометации или окончании срока действия сертификат может быть отозван (через CRL или OCSP).

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

Сумма предложения зависит от многих факторов: уровня ответственности, объема задач, региона и рыночных условий. Обычно для позиции middle в техподдержке L1-L3 ориентируюсь на предложения от 80 000 до 120 000 рублей в месяц, но готов обсуждать в зависимости от условий и перспектив.

Да, работал с кластеризацией Microsoft, в частности с Windows Server Failover Clustering (WSFC). Это технология, которая обеспечивает высокую доступность и отказоустойчивость сервисов и приложений за счёт объединения нескольких серверов (узлов) в кластер.

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

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

Мониторинг состояния узлов и ресурсов кластера.

Управление ресурсами и настройка правил переключения.

Кластеризация помогает минимизировать время простоя и обеспечивает непрерывность бизнес-процессов.

В Kubernetes при превышении лимита памяти контейнером срабатывает механизм OOM Killer (Out Of Memory Killer) на уровне ядра операционной системы. Когда контейнер потребляет больше памяти, чем указано в лимите, ядро убивает процесс внутри контейнера, что приводит к завершению контейнера. Kubernetes, в свою очередь, обнаруживает, что контейнер завершился с ошибкой, и перезапускает его согласно политике перезапуска (restartPolicy). Таким образом, перезапуск контейнера происходит не самим Kubernetes, а как реакция на событие OOM Killer.

В Go нет классического наследования, как в объектно-ориентированных языках, но можно использовать embedding (встраивание) для повторного использования кода и имитации наследования.

Embedding — это включение одного типа (обычно структуры) внутрь другого без явного указания поля. Это позволяет "унаследовать" методы встроенного типа и использовать их напрямую.

Пример:

Здесь Dog встраивает Animal, и получает доступ к его методам напрямую, что похоже на наследование. Таким образом embedding позволяет композиционно расширять функциональность типов.

А если вопрос прозвучит не так, как вы готовились?

Так бывает чаще всего. ИзиСобес слышит вопрос интервьюера и подсказывает ответ прямо во время разговора — его не видно ни в Zoom, ни при демонстрации экрана.

Посмотреть ИзиСобес