В версии 2.7 мы переработали несколько областей связи между мастер-демоном и удалёнными агентами. Изменения происходят "под капотом", решая проблемы, которые могут возникать в определённых сценариях или при высокой нагрузке в настройках с распределёнными индексами и удалёнными узлами.
Асинхронный DNS
Это было своего рода проблемой, особенно для пользователей, использующих облачную инфраструктуру. В Linux демоны будут использовать getaddrinfo_a() при наличии для асинхронного DNS. Это означает, что нам не нужно активно ждать ответа, вместо этого мы планируем задачу, и когда (если) DNS ответит, мы продолжаем - или прерываем через некоторое время по тайм-ауту. На системах, где getaddrinfo_a недоступен, мы создаём новый поток, посвящённый разрешению DNS (который также работает асинхронно).
Сетевые потоки удалённых агентов
Когда запрос поступает к распределённому индексу с удалёнными агентами, мы запускали много потоков для подключения и отправки запроса, а затем ждали, пока все они завершатся, чтобы перейти к следующим этапам. Проблема здесь в том, что если один узел отвечает медленно, это может замедлить весь процесс. Вместо того чтобы отправлять запрос для каждого узла, который ответил, им приходилось ждать, пока все будут готовы. В целом, это могло означать драгоценное время простоя и увеличение общего времени ответа на запрос. Теперь каждое соединение работает независимо от начала до завершения, и их часть в выполнении не зависит (не задерживается) от возможных более медленных.
API proto
Третье улучшение, касающееся сети, связано с API proto. В предыдущих версиях соединение между мастером и удалённым агентом начиналось с 'рукопожатия' - небольшого пакета, содержащего версию API. Другая сторона линии отвечала своей версией, и если всё в порядке, запрос начинался. Это рукопожатие было настроено с идеей, что адрес/порт в конфигурации агента могут быть неверными, и не отправлять больший пакет в этом случае. Однако мы увидели в этом пустую трату времени (учитывая сетевые задержки) и пропускной способности, чтобы просто проверить, правильно ли пользователь настроил всё. Это менее вероятно, и даже если это так, это может быть исправлено пользователем. Вместо этого теперь это 'рукопожатие' отправляется вместе с запросом в одном пакете, сокращая общее время, затрачиваемое на запрос к удалённому узлу. Если действительно удалённый хост неверен, мы просто отправили пакет напрасно, но это может быть замечено пользователем и исправлено - нам не нужно всегда это проверять. Это изменение proto сохраняет совместимость со старым proto, таким образом, если мастер обновлён до 2.7+, он всё равно сможет общаться с удалёнными агентами на < 2.7.
TFO для мастер-узлов
Последнее улучшение касается TCP Fast Open - в предыдущих версиях мы добавили возможность для клиентов использовать tfo-соединения при подключении к поисковому демону. Теперь TFO-соединения также могут использоваться в распределённом индексе между мастером и удалёнными агентами. Изменения в конфигурации не требуются, демоны обнаружат, доступен ли TFO на хост-системе, и просто используют его.