🌐 Go для сетевой безопасности: как мы с net на netip переходили

Мы в Netopia плотно сидим на Go и отвечаем за безопасность компаний с большой сетевой инфраструктурой (банки, операторы связи, онлайн-ритейлеры и тд.). Когда обрабатываешь телеметрию и конфиги с тысяч устройств, каждая лишняя операция критична.
И тут старый-добрый пакет net начал подводить. Точнее, не сам пакет, но его история: пакет создан давно, его механизмы на данный момент уже избыточны.

Пример: валидация IP-адресов

В высоконагруженных контурах сбора телеметрии стандартные методы создают слишком много аллокаций памяти, которые в свою нагружают сборщик мусора и увеличивают задержки.
А когда ты отвечаешь за безопасность банка или оператора связи, такая неэффективность — непозволительная роскошь.

Как решили проблему: перешли на пакет net/netip (доступен с Go 1.18)

Что получили в итоге:

  • Меньше мусора: Отсутствие аллокаций == разгрузка сборщика мусора.
  • Скорость: Разбор адресов и их сравнение ускорились благодаря оптимизированной внутренней структуре.
  • Надёжность: Значения в net/netip неизменяемы (immutable). Это предотвращает случайные ошибки изменения данных и делает код более предсказуемым.

Важно: Переход потребовал внимания к деталям. Например, с IPv4-mapped IPv6 адресами новый пакет работает строже — никаких неявных преобразований. Для нашей сферы это плюс, но фильтры проверки пришлось немного донастроить.
Вывод: Иногда не нужно переписывать весь продукт целиком, чтобы сделать его быстрее. Достаточно заменить один компонент.
Переход на net/netip помог нам снизить нагрузку на систему, ускорить обработку данных и сделать код чище. В результате платформа работает стабильнее, а клиенты получают отклик почти мгновенно. Мелочи решают.

А вы уже пробовали net/netip в своих проектах? Или пока работаете со старым net? Делитесь опытом в комментариях!
P.S. Полную версию статьи с примерами кода можно прочитать у нас на сайте

Начать дискуссию