TGViewer
Человек и машина Человек и машина @manandthemachine · 1.69K subscribers
Post #347 1.03K
Автор ушел на перерыв аггрегировать советы читателей и разбираться в этом вашем Connected UDP и, наконец-то, вернулся.

Прежде чем открывать портал в ад, надо сделать небольшое замечание - наш backend работает на Akka.
Для отправки метрик в Statsd используется форк akka-statsd (https://github.com/NewMotion/akka-statsd).

Внутри него настройка соединения построена по методу Connected UDP (https://doc.akka.io/docs/akka/2.5.3/scala/io-udp.html#connected-udp)
Итак, Connected UDP работает по схожей с Bind-and-Send модели. Единственная существенная разница в том, что JVM Java SecurityManager (если включен) закеширует security check после соединения один раз, что уменьшает нагрузку на ЦПУ и увеличивает производительность (при Bind-and-Send security check проходит каждый раз).
Внутри Connected UDP идет Bind к удаленному адресу и порту. Метод, создающий соединение тут (https://github.com/NewMotion/akka-statsd/blob/master/akka-statsd-core/src/main/scala/transport/udp/SingleAddressConnection.scala#L24).

Внутри него есть обработка исключения, и именно здесь мы видим, что что-то пошло не так, если Statsd был рестартован или недоступен.

def working(initiator: ActorRef, socket: ActorRef): Receive = {
case Deliver(msg) =>
log debug s"UDP delivery of stats message $msg"
socket ! Send(ByteString(msg))
case CommandFailed(Send(payload, _)) =>
val msg = payload.utf8String
log warning s"Unable to deliver message: $msg to $remoteAddress"
sender ! DeliveryFailed(msg)
}

Тут я перестаю косплеить ДиКаприо из “Начало” и останавливаю исследование.
Что известно на данный момент: CommandFailed это исключение, получаемое от методов Akka UDP, то есть, где-то под капотом Akka.
Внутри Akka, как сообщили коллеги, при недоступности порта даже на мельчайший срок, происходит IOException, который выдает наверх CommandFailed. Работать это начинает только после рестарта приложения, работающего с akka-statsd.

Мозгом я понимаю, зачем использовать Connected UDP. Этот способ может худо бедно гарантировать доставку трафика, не нагружая систему как с TCP, но, как выяснилось, у нас не используется JAVA SecurityManager. То есть смысла использовать именно Connected UDP нет.

Требование гарантировать доставку метрик отпало, как минимум год назад, еще до моего устройства в контору, и понадобилось пару downtime’ов, чтобы разрабы запилили UnConnected UDP и стали потихоньку обновлять приложения. Почему нельзя реализовать пересоздание connect, для меня остается тайной.

Живем дальше. Отдельное спасибо @sakalr и @Civiloid за пояснение.
GitHub NewMotion/akka-statsd Statsd client using an Akka actor. Contribute to NewMotion/akka-statsd development by creating an account on GitHub.
More from @manandthemachine
  1. Jan 17, 2026#прощальное Вы могли заметить, что из канала исчезли комменты, а чат был удален. Подробнее…
  2. Dec 31, 2025#новогоднее Если бы мне пришлось охарактеризовать 2025-ый год одним единственным словом, я…
  3. Oct 24, 2025#машины_aws Пожалуй, лучший инцидент, что я когда либо видел. Если вкратце: 1. Управление…
  4. Sep 30, 2025#машины_разное Моя любимая рубрика «Разработчики СУБД знают лучше». Вы наверняка помните,…
  5. Sep 26, 2025#пятничное Инженер-программист Шивам Баларани рассеянно смотрел в монитор. Через блеклый и…
  6. Sep 24, 2025Вот это я конечно не попал в лимиты телеграма. 🤦‍♂️
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →