🌐 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. Полную версию статьи с примерами кода можно прочитать у нас на сайте