> Что такое DNS и для чего он нужен (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: VK

Стек: Go

> Пример ответа

Короткий ответ

DNS это распределённая система, которая сопоставляет доменные имена с IP-адресами. Она нужна, чтобы люди и программы могли обращаться к сервисам по понятным именам, а не запоминать числовые адреса. В backend-разработке DNS используется постоянно: при подключении к базе данных, к внешним API, к другим микросервисам.

Подробное объяснение

DNS расшифровывается как Domain Name System. Это иерархическая распределённая база данных, организованная в виде дерева зон. Корневые серверы знают, где находятся серверы зон верхнего уровня, например .com или .ru. Серверы зон верхнего уровня знают, где находятся авторитативные серверы конкретных доменов. Авторитативные серверы хранят записи, которые описывают домен.

Основные типы записей: A и AAAA для IPv4 и IPv6 адресов, CNAME для псевдонима, MX для почты, TXT для произвольных текстовых данных, SRV для сервисов. Резолвер, обычно встроенный в операционную систему или в библиотеку, выполняет рекурсивный запрос: он последовательно опрашивает серверы, пока не получит ответ, и кэширует результат на время, указанное в TTL.

DNS критичен для отказоустойчивости и балансировки. Один домен может указывать на несколько IP-адресов, и клиент выбирает один из них. Это позволяет распределять нагрузку и переживать падение отдельных узлов. Также DNS используется для service discovery в микросервисных архитектурах, например через SRV-записи или специализированные системы вроде Consul.

На практике

В Go стандартная библиотека net выполняет DNS-резолвинг автоматически. Когда вы пишете http.Get("https://api.example.com") или sql.Open("postgres", "host=db.example.com"), под капотом происходит DNS-запрос. Go использует либо системный резолвер через cgo, либо собственный чистый резолвер, в зависимости от сборки и окружения.

Важно помнить про кэширование. Go не кэширует DNS-ответы на уровне стандартной библиотеки. Если вы открываете новое соединение каждый раз, каждый раз будет новый DNS-запрос. Для высоконагруженных сервисов это может стать узким местом. Решения: использовать пул соединений, применять http.Transport с настройками DialContext, или подключать сторонние библиотеки с кэшированием.

Ещё один практический момент: TTL. Если вы меняете IP-адрес сервиса, старые клиенты могут ещё некоторое время ходить на старый адрес, пока не истечёт TTL. Поэтому при миграциях TTL заранее уменьшают.

Пример кода

GO
package main
import (
"context"
"fmt"
"net"
"time"
)
func main() {
// Явный DNS-резолвинг с таймаутом
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
ips, err := net.DefaultResolver.LookupHost(ctx, "example.com")
if err != nil {
fmt.Println("DNS lookup failed:", err)
return
}
for _, ip := range ips {
fmt.Println("Resolved IP:", ip)
}
// Резолвинг SRV-записи для service discovery
_, srvs, err := net.DefaultResolver.LookupSRV(ctx, "", "", "_http._tcp.example.com")
if err != nil {
fmt.Println("SRV lookup failed:", err)
return
}
for _, srv := range srvs {
fmt.Printf("SRV target: %s port: %d priority: %d weight: %d\n",
srv.Target, srv.Port, srv.Priority, srv.Weight)
}
}

Как отвечать на собеседовании

Скажите, что DNS это система преобразования доменных имён в IP-адреса. Упомяните, что это распределённая иерархическая система с кэшированием и TTL. Приведите пример из backend: подключение к базе данных или вызов внешнего API по доменному имени. Если спросят про Go, отметьте, что стандартная библиотека net резолвит имена автоматически, но не кэширует результаты, и что для продакшена часто нужен пул соединений или сторонний резолвер с кэшем.

Что проверяет интервьюер

Понимание базовых сетевых концепций. Умение объяснить, зачем нужен DNS, а не просто дать определение. Знание о кэшировании и TTL, потому что это влияет на поведение сервисов. Понимание, как DNS работает в контексте Go и какие есть подводные камни при высокой нагрузке. Способность связать теорию с реальными задачами backend-разработки.

Типичные ошибки

Говорить, что DNS это просто "таблица" или "база данных", не упоминая распределённость и иерархию. Забывать про кэширование и TTL. Считать, что Go кэширует DNS-ответы по умолчанию. Путать DNS с DHCP или с балансировщиком нагрузки. Не упоминать типы записей, кроме A. Игнорировать роль DNS в service discovery и отказоустойчивости.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью