> Какие типы записей существуют в 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 заранее, затем обновление записей.
Пример кода
GOpackage mainimport ("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-резолвер может отличаться.
> Похожие задачи по Go
Как разделить большую таблицу по студентам для оптимизации запросов
Какие джойны и группировки используются для подсчета количества людей по адресам
Какой статус у продукта
По какому протоколу работает DNS
> Похожие задачи по backend
Как разделить большую таблицу по студентам для оптимизации запросов
Какие джойны и группировки используются для подсчета количества людей по адресам
Какой статус у продукта
По какому протоколу работает DNS
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью