1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sogou-workflow

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
about-dns.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 01.03.2025 10:20 552780a

О DNS

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

Конфигурация, связанная с DNS

Глобальная конфигурация в Workflow включает:

struct WFGlobalSettings
{
    struct EndpointParams endpoint_params;
    struct EndpointParams dns_server_params;
    unsigned int dns_ttl_default;
    unsigned int dns_ttl_min;
    int dns_threads;
    int poller_threads;
    int handler_threads;
    int compute_threads;
    int fio_max_events;
    const char *resolv_conf_path;
    const char *hosts_path;
};

Конфигурционные параметры, связанные с разрешением доменных имён, включают:

  • dns_server_params
    • address_family: Это будет подробно объяснено ниже
    • max_connections: максимальное количество одновременных соединений с сервером DNS, значение по умолчанию — 200
    • connect_timeout/response_timeout/ssl_connect_timeout: см. тайм-ауты
  • dns_threads: при использовании синхронного способа разрешения доменных имён, операция разрешения выполняется в отдельном пуле потоков, этот параметр указывает число потоков в пуле, значение по умолчанию — 4
  • dns_ttl_default: успешный результат разрешения доменного имени сохраняется в кэше доменных имён, этот параметр указывает время жизни записи, измеряемое в секундах, значение по умолчанию — один час; когда результат разрешения истёк, он снова разрешается для получения актуального содержания
  • dns_ttl_min: при неудачной связи возможно, что кэш-запись уже устарела, этот параметр указывает более короткое время жизни, чтобы обновлять кэш чаще при неудачной связи, измеряемое в секундах, значение по умолчанию — одна минута
  • resolv_conf_path: этот файл хранит конфигурацию доступа к DNS, обычно расположен в /etc/resolv.conf на обычных Linux-системах; если это значение равно NULL, то используется многопоточное синхронное разрешение
  • hosts_path: этот файл представляет собой локальную таблицу разрешения доменных имён, если имя домена совпадает с записью в этой таблице, запрос к DNS не осуществляется; обычно расположен в /etc/hosts на обычных Linux-системах; если это значение равно NULL, то использование таблицы разрешения отключено

Расширение функциональности файла resolv.conf

Workflow расширяет конфигурационный файл resolv.conf, позволяя пользователям модифицировать конфигурацию для поддержки функции DNS over TLS(DoT). Обратите внимание, прямое изменение /etc/resolv.conf может повлиять на другие процессы. Можно скопировать этот файл для изменения и установить новый путь к файлу в конфигурации resolv_conf_path Workflow. Например, используя протокол dnss для nameserver, соединение будет установлено через SSL.

nameserver dnss://8.8.8.8/
nameserver dnss://[2001:4860:4860::8888]/

Адресная семья

В некоторых сетевых условиях, хотя компьютер поддерживает IPv6, но из-за отсутствия публичного IPv6-адреса, он не может общаться с внешним миром (например, локальный IPv6-адрес начинается с fe80). В этом случае можно установить endpoint_params.address_family как AF_INET, чтобы заставить разрешение доменных имён использовать только IPv4-адреса. Аналогично, файл resolv.conf может указывать IPv4 и IPv6 адреса для nameserver; в этом случае можно установить dns_server_params.address_family как AF_INET или AF_INET6, чтобы заставить использовать только IPv4 или IPv6 адреса для доступа к DNS.

Использование конфигурации upstream

Глобальная конфигурация применяется ко всем доменным именам по умолчанию. Если требуется применить различные конфигурации к некоторым доменным именам, можно использовать функцию upstream. Используя upstream, можно отдельно указать параметры dns_ttl_default и dns_ttl_min, а также отдельно указать тип IP-адреса, используемый этим доменным именем, через endpoint_params.address_family.

Стратегии разрешения и кэширования доменных имён

Сетевые задачи часто требуют разрешения доменных имён для получения IP-адреса, который нужно использовать для доступа. Стратегии разрешения доменных имён в Workflow следующие:

  1. Проверка наличия IP-адреса этого доменного имени в кэше доменных имён, если есть кэш и он ещё не истёк, используется эта группа IP-адресов
  2. Проверка того, является ли доменное имя IPv4, IPv6 или Unix Domain Socket, если да, используется этот адрес без необходимости запуска разрешения доменных имён
  3. Проверка наличия IP-адреса этого доменного имени в файле hosts_path, если есть, используется этот адрес
  4. Получение асинхронного замка, чтобы гарантировать, что запросы разрешения доменных имён для одного доменного имени не запускаются одновременно, и запуск запроса к DNS
  5. Успешное разрешение сохраняет результат разрешения в кэше доменных имён текущего процесса для использования в будущем и освобождает асинхронный замок
  6. При неудачном разрешении асинхронный замок освобождается, причины неудачи передаются всем ожидающим задачам, и новые задачи будут повторно запрашивать DNS

Многие сценарии, требующие множества сетевых запросов, используют компоненты кэширования доменных имён. Если каждый запрос запускал бы запрос к DNS, это могло бы перегрузить DNS. Workflow настроил время жизни кэша (dns_ttl_default и dns_ttl_min), чтобы обеспечить его своевременное обновление. Когда кэш доменного имени истёк, первый запрос, заметивший истечение времени, продлевает время жизни записи на 5 секунд и запускает запрос к DNS. За эти 5 секунд все запросы к этому доменному имени будут использовать кэшированный результат разрешения DNS, не требуя нового разрешения.Механизм асинхронного замка гарантирует, что запросы разрешения доменных имён для одного доменного имени не запускаются одновременно. Без защиты замками, множество запросов к одному доменному имени могут вызвать нагрузку на DNS, поскольку каждая задача будет запускать запрос к DNS, не найдя результат в кэше. Здесь "одно доменное имя" относится к тройке (host, port, family). Если для одного доменного имени указано использование только IPv4 и IPv6 через upstream, они будут защищены различными асинхронными замками, что позволит запустить запросы к DNS одновременно.

Асинхронное разрешение доменных имён

Workflow реализует полную систему задач DNS (см. dns_cli), если указан параметр resolv_conf_path, запросы к DNS будут выполняться асинхронно. По умолчанию Workflow использует /etc/resolv.conf как значение этого параметра на Unix-подобных системах. Асинхронное разрешение доменных имён не блокирует ни один поток и не занимает весь пул потоков, что позволяет более эффективно выполнять задачи разрешения доменных имён.

Синхронное разрешение доменных имён

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

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sogou-workflow.git
git@api.gitlife.ru:oschina-mirror/sogou-workflow.git
oschina-mirror
sogou-workflow
sogou-workflow
master