> Какие типы записей существуют в DNS (Go)

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

Компании: VK

Стек: Go

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

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

Основные типы DNS-записей: A (IPv4), AAAA (IPv6), CNAME (алиас), MX (почтовый обмен), NS (авторитетные серверы), TXT (произвольный текст, часто для SPF/DKIM), SOA (начало зоны), PTR (обратное разрешение), SRV (службы), CAA (сертификаты). Для backend-разработчика критичны A, CNAME, SRV, TXT - они влияют на маршрутизацию трафика, service discovery и безопасность. Понимание TTL и порядка резолвинга важнее, чем заучивание всех типов.

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

DNS-записи делятся на несколько категорий по назначению:

  • Адресные: A (IPv4), AAAA (IPv6) - маппинг имени на IP.
  • Канонические: CNAME - псевдоним на другое имя, не может существовать вместе с другими записями для того же имени (кроме DNSSEC).
  • Служебные: NS (делегирование зоны), SOA (параметры зоны: serial, refresh, retry, expire, minimum TTL), PTR (обратный маппинг).
  • Почтовые: MX с приоритетами (preference), TXT для SPF, DKIM, DMARC.
  • Инфраструктурные: SRV (host + port для конкретной службы, с weight и priority), CAA (ограничение CA для выдачи сертификатов).
  • Современные: HTTPS/SVCB (параметры подключения, включая ALPN), DS/DNSKEY (DNSSEC), NAPTR (для VoIP/ENUM).

Для backend важно понимать:

  • TTL определяет время кэширования - влияет на скорость распространения изменений.
  • CNAME vs A - CNAME добавляет дополнительный резолвинг, но упрощает управление.
  • SRV используется в микросервисной архитектуре (например, Consul, Kubernetes ExternalName).
  • TXT - не только для почты, но и для верификации доменов (Google, Let's Encrypt).

На практике

При работе с DNS в Go чаще всего используются:

  • net.LookupIP - возвращает A/AAAA записи.
  • net.LookupMX - для почтовых серверов.
  • net.LookupSRV - для service discovery.
  • net.LookupTXT - для TXT записей.
  • net.Resolver с кастомным DNS-сервером для тестов.

Важно учитывать: Go по умолчанию использует cgo resolver на Linux (если не собрано с -tags netgo), что влияет на поведение при работе с /etc/resolv.conf. Для production-сервисов стоит использовать net.DefaultResolver с настройкой таймаутов.

При проектировании внутренней инфраструктуры:

  • Для service discovery в Kubernetes используют headless services + SRV записи.
  • Для отказоустойчивости - несколько A записей с round-robin (но это не гарантирует балансировку).
  • Для постепенного переключения трафика - изменение TTL заранее, затем обновление записей.

Пример кода

GO
package main
import (
"context"
"fmt"
"net"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
resolver := &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{Timeout: 2 * time.Second}
return d.DialContext(ctx, "udp", "8.8.8.8:53")
},
}
// A/AAAA записи
ips, err := resolver.LookupIP(ctx, "ip", "example.com")
if err != nil {
fmt.Println("IP lookup error:", err)
return
}
fmt.Println("IPs:", ips)
// SRV записи
_, srvs, err := resolver.LookupSRV(ctx, "xmpp-server", "tcp", "example.com")
if err != nil {
fmt.Println("SRV lookup error:", 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)
}
// TXT записи
txts, err := resolver.LookupTXT(ctx, "example.com")
if err != nil {
fmt.Println("TXT lookup error:", err)
return
}
fmt.Println("TXT:", txts)
}

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

Начните с базовой классификации: адресные, служебные, почтовые, инфраструктурные. Затем перейдите к практическому применению: как вы используете DNS в реальных проектах. Упомяните trade-off между CNAME и A, важность TTL, и как DNS влияет на latency и reliability. Если спросят про Go - расскажите про net.Resolver, разницу между cgo и pure Go resolver, и как обрабатывать ошибки (NXDOMAIN, SERVFAIL, timeout). Хорошо показать понимание, что DNS - это распределённая система с кэшированием, и изменения не мгновенны.

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

  • Глубину понимания DNS как системы, а не просто списка типов.
  • Умение применять знания в реальных сценариях (service discovery, отказоустойчивость).
  • Понимание ограничений DNS: TTL, кэширование, propagation delay.
  • Для senior - способность проектировать DNS-схему для микросервисов и объяснять последствия решений.
  • Знание специфики Go: resolver, контексты, таймауты.

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

  • Перечисление всех типов записей без объяснения их применения.
  • Утверждение, что CNAME можно использовать для корневого домена (нельзя, только для поддоменов).
  • Игнорирование TTL - "я поменял запись, но ничего не работает".
  • Путаница между MX и SRV - MX для почты, SRV для произвольных служб.
  • Незнание разницы между authoritative и recursive DNS.
  • В Go - использование net.LookupHost без обработки ошибок и таймаутов, или игнорирование того, что в контейнерах DNS-резолвер может отличаться.

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

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